package Ġio . github . aed ans . m Ċ Ċ import Ġio . github . aed ans . k ons .* Ċ import Ġjava . io . File Ċ import Ġjava . io . InputStream Ċ import Ġjava . io . OutputStream Ċ Ċ /** Ċ Ġ* ĠCreated Ġby ĠA ed an ĠSmith . Ċ Ġ*/ Ċ Ċ data Ġclass ĠRuntime Environment ( val Ġsymbol Table : ĠSymbol Table , Ġval Ġmemory : ĠMemory ) Ġ{ ĊĠĠĠ Ġfun Ġget Var ( name : ĠString ) Ġ= Ġsymbol Table . getLocation ( name )?. to Accessible ()?. get ( memory ) ĊĠĠĠ Ġfun Ġset Var ( name : ĠString , Ġobj : ĠAny ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlocation Ġ= Ġsymbol Table . allocate Location ( name ) ĊĠĠĠĠĠĠĠ Ġsymbol Table . setLocation ( name , Ġlocation ) ĊĠĠĠĠĠĠĠ Ġlocation . to Accessible (). set ( memory , Ġobj ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠgetDefault Runtime Environment ( ĊĠĠĠĠĠĠĠ Ġ` in `: ĠInputStream Ġ= ĠSystem .` in `, ĊĠĠĠĠĠĠĠ Ġout : ĠOutputStream Ġ= ĠSystem . out , ĊĠĠĠĠĠĠĠ Ġerr : ĠOutputStream Ġ= ĠSystem . err Ċ ) Ġ= ĠRuntime Environment ( IR Symbol Table (), ĠMemory ( Heap ( 0 ) Ġ{ ĠNil Ġ}, ĠStack ())). apply Ġ{ ĊĠĠĠ Ġset Var (" true ", Ġtrue ) ĊĠĠĠ Ġset Var (" false ", Ġfalse ) ĊĠĠĠ Ġset Var (" nil ", ĠNil ) ĊĊĠĠĠ Ġset Var (" cons ", Ġm Function < Any , ĠCons < Any >, ĠCons < Any >> Ġ{ Ġa , Ġb Ġ-> Ġa Ġcons Ġb Ġ}) ĊĠĠĠ Ġset Var (" car ", Ġm Function ( Cons < Any >:: car )) ĊĠĠĠ Ġset Var (" cdr ", Ġm Function ( Cons < Any >:: cdr )) ĊĊĠĠĠ Ġset Var (" !", Ġm Function ( Boolean :: not )) ĊĠĠĠ Ġset Var ("| ", Ġm Function ( Boolean :: or )) ĊĠĠĠ Ġset Var ("& ", Ġm Function ( Boolean :: and )) ĊĠĠĠ Ġset Var (" =", Ġm Function ( Any :: equals )) ĊĊĠĠĠ Ġset Var ("+ i ", Ġm Function < Int , ĠInt , ĠInt >( Int :: plus )) ĊĠĠĠ Ġset Var ("- i ", Ġm Function < Int , ĠInt , ĠInt >( Int :: minus )) ĊĠĠĠ Ġset Var ("* i ", Ġm Function < Int , ĠInt , ĠInt >( Int :: times )) ĊĠĠĠ Ġset Var ("/ i ", Ġm Function < Int , ĠInt , ĠInt >( Int :: div )) ĊĠĠĠ Ġset Var ("% i ", Ġm Function < Int , ĠInt , ĠInt >( Int :: rem )) ĊĠĠĠ Ġset Var ("+ l ", Ġm Function < Long , ĠLong , ĠLong >( Long :: plus )) ĊĠĠĠ Ġset Var ("- l ", Ġm Function < Long , ĠLong , ĠLong >( Long :: minus )) ĊĠĠĠ Ġset Var ("* l ", Ġm Function < Long , ĠLong , ĠLong >( Long :: times )) ĊĠĠĠ Ġset Var ("/ l ", Ġm Function < Long , ĠLong , ĠLong >( Long :: div )) ĊĠĠĠ Ġset Var ("% l ", Ġm Function < Long , ĠLong , ĠLong >( Long :: rem )) ĊĠĠĠ Ġset Var ("+ f ", Ġm Function < Float , ĠFloat , ĠFloat >( Float :: plus )) ĊĠĠĠ Ġset Var ("- f ", Ġm Function < Float , ĠFloat , ĠFloat >( Float :: minus )) ĊĠĠĠ Ġset Var ("* f ", Ġm Function < Float , ĠFloat , ĠFloat >( Float :: times )) ĊĠĠĠ Ġset Var ("/ f ", Ġm Function < Float , ĠFloat , ĠFloat >( Float :: div )) ĊĠĠĠ Ġset Var ("% f ", Ġm Function < Float , ĠFloat , ĠFloat >( Float :: rem )) ĊĠĠĠ Ġset Var ("+ d ", Ġm Function < Double , ĠDouble , ĠDouble >( Double :: plus )) ĊĠĠĠ Ġset Var ("- d ", Ġm Function < Double , ĠDouble , ĠDouble >( Double :: minus )) ĊĠĠĠ Ġset Var ("* d ", Ġm Function < Double , ĠDouble , ĠDouble >( Double :: times )) ĊĠĠĠ Ġset Var ("/ d ", Ġm Function < Double , ĠDouble , ĠDouble >( Double :: div )) ĊĠĠĠ Ġset Var ("% d ", Ġm Function < Double , ĠDouble , ĠDouble >( Double :: rem )) ĊĊĠĠĠ Ġset Var ("< i ", Ġm Function Ġ{ Ġx : ĠInt , Ġy : ĠInt Ġ-> Ġx Ġ< Ġy Ġ}) ĊĠĠĠ Ġset Var ("> i ", Ġm Function Ġ{ Ġx : ĠInt , Ġy : ĠInt Ġ-> Ġx Ġ> Ġy Ġ}) ĊĠĠĠ Ġset Var ("< l ", Ġm Function Ġ{ Ġx : ĠLong , Ġy : ĠLong Ġ-> Ġx Ġ< Ġy Ġ}) ĊĠĠĠ Ġset Var ("> l ", Ġm Function Ġ{ Ġx : ĠLong , Ġy : ĠLong Ġ-> Ġx Ġ> Ġy Ġ}) ĊĠĠĠ Ġset Var ("< f ", Ġm Function Ġ{ Ġx : ĠFloat , Ġy : ĠFloat Ġ-> Ġx Ġ< Ġy Ġ}) ĊĠĠĠ Ġset Var ("> f ", Ġm Function Ġ{ Ġx : ĠFloat , Ġy : ĠFloat Ġ-> Ġx Ġ> Ġy Ġ}) ĊĠĠĠ Ġset Var ("< d ", Ġm Function Ġ{ Ġx : ĠDouble , Ġy : ĠDouble Ġ-> Ġx Ġ< Ġy Ġ}) ĊĠĠĠ Ġset Var ("> d ", Ġm Function Ġ{ Ġx : ĠDouble , Ġy : ĠDouble Ġ-> Ġx Ġ> Ġy Ġ}) ĊĊĠĠĠ Ġset Var (" stdin ", Ġ` in `) ĊĠĠĠ Ġset Var (" stdout ", Ġout ) ĊĠĠĠ Ġset Var (" stderr ", Ġerr ) ĊĠĠĠ Ġset Var (" write ", Ġm Function < OutputStream , ĠChar , ĠUnit > Ġ{ Ġp , Ġc Ġ-> Ġp . write ( c . toInt ()) Ġ}) ĊĠĠĠ Ġset Var (" read ", Ġm Function < InputStream , ĠChar > Ġ{ Ġi Ġ-> Ġi . read (). to Char () Ġ}) ĊĠĠĠ Ġset Var (" newline ", Ġ'\ n ') ĊĊĠĠĠ Ġset Var (" string ", Ġm Function < Any , ĠCons < Char >> Ġ{ Ġit . toString (). as Iterable (). to Cons () Ġ}) ĊĊĠĠĠ Ġset Var (" def macro ", ĠMacro Ġ{ Ġit : ĠAny Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġ(( it Ġas ĠCons < *> ). car Ġas ĠIdentifier Expression ). name ĊĠĠĠĠĠĠĠ Ġval Ġlambda Ġ= Ġit . unsafe C dr . car Ġas ĠCons < *> ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ Ġval Ġmacro Ġ= ĠMacro ( lambda . to IR Expression ( symbol Table ). to Evalu able (). eval ( memory ) Ġas ĠM Function ) ĊĠĠĠĠĠĠĠ Ġset Var ( name , Ġmacro ) ĊĠĠĠĠĠĠĠ ĠNil ĊĠĠĠ Ġ}) ĊĊĠĠĠ Ġset Var (" include ", ĠMacro Ġ{ Ġit : ĠAny Ġ-> ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġ(( it Ġas ĠCons < *> ). car Ġas ĠIdentifier Expression ). name ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( name ). absolute File ĊĠĠĠĠĠĠĠ Ġif Ġ( file . isDirectory ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. list Files () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġcons Of ( Identifier Expression (" include "), ĠIdentifier Expression ("$ file /${ it . name Without Extension } ")) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ ĠIdentifier Expression (" do ") Ġcons Ġit . to Cons List () Ġ} ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFile ( file . absolute Path Ġ+ Ġ". m ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. reader () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. iterator () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. look ahead Iterator () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. parse () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. as Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toList () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ ĠIdentifier Expression (" do ") Ġcons Ġit . to Cons List () Ġ} ĊĠĠĠ Ġ}) ĊĊĠĠĠ Ġset Var (" macro expand ", ĠMacro Ġ{ Ġit : ĠAny Ġ-> ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ ĠQuote Expression (( it Ġas ĠS Expression ). unsafe Car . expand ( this )) ĊĠĠĠ Ġ}) Ċ } Ċ