package Ġsp ready . lisp . functions Ċ Ċ import Ġsp ready . lisp . Environment Ċ import Ġsp ready . lisp . Eval Exception Ċ import Ġsp ready . lisp . sex pr . Bool Ċ import Ġsp ready . lisp . sex pr . Func Ċ import Ġsp ready . lisp . sex pr . Num Ċ import Ġsp ready . lisp . sex pr . S Expr Ċ import Ġsp ready . lisp . sex pr . Str Ċ import Ġsp ready . lisp . sex pr . Symbol Ċ import Ġsp ready . lisp . sex pr . cast Ċ Ċ /** Ċ Ġ* ĠCreates Ġa Ġ[ Func ] Ġthat Ġcan Ġbe Ġused Ġfor Ġcomparisons Ċ Ġ* Ċ Ġ* Ġ@ param Ġcomp Fun ĠUsed Ġfor Ġchecking Ġif Ġcompare To Ġreturns Ġthe Ġcorrect Ġvalue Ċ Ġ*/ Ċ inline Ġfun Ġcreate Comp Fun ( ĊĠĠĠ Ġname : ĠString , ĊĠĠĠ Ġcross inline Ġcomp Fun : Ġ( Int ) Ġ-> ĠBoolean Ċ ): ĠFunc Ġ{ ĊĊĠĠĠ Ġreturn Ġobject Ġ: ĠFunc ( name ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinvoke ( env : ĠEnvironment , Ġargs : ĠList < S Expr >): ĠS Expr Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġargs . check Min Size ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġevaluated Ġ= Ġargs . map Ġ{ Ġit . eval ( env ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcompared Ġ= Ġwhen Ġ( evalu ated . first ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNum Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevaluated . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . cast < Num >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. zip With Next (). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . first . compareTo ( it . second ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠStr Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevaluated . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . cast < Str >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. zip With Next (). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . first . compareTo ( it . second ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠEval Exception ("${ evalu ated . first ()} Ġcan 't Ġbe Ġcompared !") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠBool ( comp ared . all ( comp Fun )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠChecks Ġif Ġall Ġvalues Ġare Ġequal Ċ Ġ*/ Ċ object ĠEq Expr Ġ: ĠFunc (" =") Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġinvoke ( env : ĠEnvironment , Ġargs : ĠList < S Expr >): ĠS Expr Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġargs Mut Ġ= Ġargs . to Mutable List (). check Min Size ( 2 ) ĊĠĠĠĠĠĠĠ Ġval Ġfirst Ġ= Ġargs Mut . remove First (). eval ( env ) ĊĠĠĠĠĠĠĠ Ġval Ġevaluated Ġ= Ġargs Mut . map Ġ{ Ġit . eval ( env ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠBool ( evalu ated . all Ġ{ Ġit Ġ== Ġfirst Ġ}) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠChecks Ġif Ġall Ġvalues Ġare Ġnot Ġequal Ċ Ġ*/ Ċ object ĠN eq Expr Ġ: ĠFunc (" ! =") Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġinvoke ( env : ĠEnvironment , Ġargs : ĠList < S Expr >): ĠS Expr Ġ{ ĊĠĠĠĠĠĠĠ Ġargs . check Min Size ( 2 ) ĊĠĠĠĠĠĠĠ Ġval Ġdistinct Ġ= Ġargs . map Ġ{ Ġit . eval ( env ) Ġ}. toSet () ĊĊĠĠĠĠĠĠĠ Ġreturn ĠBool ( args . size Ġ== Ġdistinct . size ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ val Ġless Func Ġ= Ġcreate Comp Fun ("< ") Ġ{ Ġit Ġ< Ġ 0 Ġ} Ċ val Ġless Eq Func Ġ= Ġcreate Comp Fun ("< =") Ġ{ Ġit Ġ<= Ġ 0 Ġ} Ċ val Ġgreater Func Ġ= Ġcreate Comp Fun ("> ") Ġ{ Ġit Ġ> Ġ 0 Ġ} Ċ val Ġgreater Eq Func Ġ= Ġcreate Comp Fun ("> =") Ġ{ Ġit Ġ>= Ġ 0 Ġ} Ċ Ċ fun Ġequality Functions (): ĠList < Pair < Symbol , ĠFunc >> Ġ{ ĊĠĠĠ Ġreturn ĠlistOf ( ĊĠĠĠĠĠĠĠ ĠEq Expr , ĊĠĠĠĠĠĠĠ ĠN eq Expr , ĊĠĠĠĠĠĠĠ Ġless Func , ĊĠĠĠĠĠĠĠ Ġless Eq Func , ĊĠĠĠĠĠĠĠ Ġgreater Func , ĊĠĠĠĠĠĠĠ Ġgreater Eq Func ĊĠĠĠ Ġ). map Ġ{ ĊĠĠĠĠĠĠĠ ĠPair ( Symbol ( it . name ), Ġit ) ĊĠĠĠ Ġ} Ċ } Ċ