package Ġme . stock ing d . dat p Ċ Ċ class ĠCore Module Ġ: ĠKotlin Module Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġregister (): ĠMap < S Expr . Atom . Symbol , Ġ( Evaluator , ĠList < S Expr >) Ġ-> ĠS Expr > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠS Expr . Atom . Symbol (" lambda ") Ġto Ġlambda (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠS Expr . Atom . Symbol (" apply ") Ġto Ġapply (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠS Expr . Atom . Symbol (" quote ") Ġto Ġquote (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠS Expr . Atom . Symbol (" eq ") Ġto Ġeq (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠS Expr . Atom . Symbol (" =") Ġto Ġeq (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠS Expr . Atom . Symbol (" cond ") Ġto Ġcond (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠS Expr . Atom . Symbol (" list ?") Ġto Ġis List (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠS Expr . Atom . Symbol (" atom ?") Ġto Ġis Atom (), ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġlambda (): Ġ( Evaluator , ĠList < S Expr >) Ġ-> ĠS Expr Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ{ Ġ_, Ġargs Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparameters Ġ= Ġargs ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. first () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġit Ġas ĠS Expr . List Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. values ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit Ġas ĠS Expr . Atom . Symbol Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimplementation Ġ= Ġargs . drop ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠS Expr . Atom . Lambda ( parameters , Ġimplementation ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġapply (): Ġ( Evaluator , ĠList < S Expr >) Ġ-> ĠS Expr Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ{ Ġevaluator , Ġargs Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( function , Ġarguments ) Ġ= Ġargs ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevaluator . eval ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠS Expr . List ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( evaluator . eval ( function )) Ġ+ Ġ( evaluator . eval ( arguments ) Ġas ĠS Expr . List ). values ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġquote (): Ġ( Evaluator , ĠList < S Expr >) Ġ-> ĠS Expr Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ{ Ġ_, Ġargs Ġ-> Ġargs . first () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġeq (): Ġ( Evaluator , ĠList < S Expr >) Ġ-> ĠS Expr Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ{ Ġevaluator , Ġargs Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġargs ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġevaluator . eval ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. window ed ( 2 , Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. fold ( true ) Ġ{ Ġeq , Ġ( a , Ġb ) Ġ-> Ġeq Ġ&& Ġa Ġ== Ġb Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġif Ġ( it ) ĠS Expr . Atom . Symbol (" true ") Ġelse ĠNIL Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġ( cond ĊĠĠĠ Ġ// ĠĠĠĠ Ġ(( eq Ġx Ġ 1 ) Ġ' true ) ĊĠĠĠ Ġ// ĠĠĠĠ Ġ(' true Ġ' ()) ĊĠĠĠ Ġ// ĠĠĠĠ Ġ) ĊĠĠĠ Ġprivate Ġfun Ġcond (): Ġ( Evaluator , ĠList < S Expr >) Ġ-> ĠS Expr Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ{ Ġevaluator , Ġargs Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġargs ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit Ġas ĠS Expr . List Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. first OrNull Ġ{ Ġsex pr Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsex pr ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. values ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. first () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġevaluator . eval ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġit Ġ== ĠTRUE Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . values ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġ(_, Ġexpression ) Ġ-> Ġevaluator . eval ( expression ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: ĠNIL ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis List (): Ġ( Evaluator , ĠList < S Expr >) Ġ-> ĠS Expr Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ{ Ġevaluator , Ġargs Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġargs ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġevaluator . eval ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit Ġis ĠS Expr . List Ġ&& Ġit Ġ!= ĠNIL Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. fold ( true ) Ġ{ Ġa , Ġb Ġ-> Ġa Ġ&& Ġb Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġif Ġ( it ) ĠS Expr . Atom . Symbol (" true ") Ġelse ĠNIL Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Atom (): Ġ( Evaluator , ĠList < S Expr >) Ġ-> ĠS Expr Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ{ Ġevaluator , Ġargs Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġargs ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġevaluator . eval ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit Ġis ĠS Expr . Atom Ġ|| Ġit Ġ== ĠNIL Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. fold ( true ) Ġ{ Ġa , Ġb Ġ-> Ġa Ġ&& Ġb Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġif Ġ( it ) ĠS Expr . Atom . Symbol (" true ") Ġelse ĠNIL Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }