@ file : Opt In ( Experimental Unsigned Types :: class ) Ċ Ċ package Ġorg . mar io ari as . monkey . objects Ċ Ċ import Ġorg . mar io ari as . monkey . ast . Block Statement Ċ import Ġorg . mar io ari as . monkey . ast . Identifier Ċ import Ġorg . mar io ari as . monkey . code . Instructions Ċ import Ġorg . mar io ari as . monkey . evaluator . Environment Ċ Ċ interface ĠM Object Ġ{ ĊĠĠĠ Ġfun Ġinspect (): ĠString Ċ } Ċ Ċ fun ĠM Object ?. type Desc (): ĠString Ġ{ ĊĠĠĠ Ġreturn Ġif Ġ( this Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ" null " ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġthis :: class . simple Name !! ĊĠĠĠ Ġ} Ċ } Ċ Ċ interface ĠM Value < T > Ġ: ĠM Object Ġ{ ĊĠĠĠ Ġval Ġvalue : ĠT ĊĊĠĠĠ Ġoverride Ġfun Ġinspect (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġvalue . toString () ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠM Integer ( override Ġval Ġvalue : ĠLong ) Ġ: ĠM Value < Long >, ĠHash able < Long > Ġ{ ĊĊĠĠĠ Ġoperator Ġfun Ġcompare To ( other : ĠM Integer ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġvalue . compareTo ( other . value ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġplus ( other : ĠM Integer ): ĠM Integer Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠM Integer ( value Ġ+ Ġother . value ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġminus ( other : ĠM Integer ): ĠM Integer Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠM Integer ( value Ġ- Ġother . value ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġtimes ( other : ĠM Integer ): ĠM Integer Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠM Integer ( value Ġ* Ġother . value ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġdiv ( other : ĠM Integer ): ĠM Integer Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠM Integer ( value Ġ/ Ġother . value ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġunary Minus (): ĠM Integer Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠM Integer (- value ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( other Ġis ĠM Integer ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ== Ġother . value ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġvalue . hashCode () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ" M Integer ( value =$ value )" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġhash Type (): ĠHash Type Ġ= ĠHash Type . INTEGER Ċ } Ċ Ċ class ĠM Boolean ( override Ġval Ġvalue : ĠBoolean ) Ġ: ĠM Value < Boolean >, ĠHash able < Boolean > Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġhash Type (): ĠHash Type Ġ= ĠHash Type . BOOLEAN ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ġ=== Ġother ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġif Ġ( other Ġ! is ĠM Boolean ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġreturn Ġvalue Ġ== Ġother . value ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġvalue . hashCode () ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠM ReturnValue ( val Ġvalue : ĠM Object ) Ġ: ĠM Object Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġinspect (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġvalue . inspect () ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠM Error ( val Ġmessage : ĠString ) Ġ: ĠM Object Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġinspect (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ" ERROR : Ġ$ message " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ" M Error ( message ='$ message ')" ĊĠĠĠ Ġ} Ċ } Ċ Ċ object ĠM Null Ġ: ĠM Object Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġinspect (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ" null " ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠM Function ( val Ġparameters : ĠList < Identifier > ?, Ġval Ġbody : ĠBlock Statement ?, Ġval Ġenv : ĠEnvironment ) Ġ: ĠM Object Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġinspect (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ" fn (${ parameters ?. join ToString ( transform Ġ= ĠIdentifier :: toString ) Ġ?: Ġ"" }) Ġ{\ n \ t $ body \ n }" ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠM String ( override Ġval Ġvalue : ĠString ) Ġ: ĠM Value < String >, ĠHash able < String > Ġ{ ĊĠĠĠ Ġoperator Ġfun Ġplus ( other : ĠM String ): ĠM String Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠM String ( value Ġ+ Ġother . value ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġhash Type (): ĠHash Type Ġ= ĠHash Type . STRING Ċ } Ċ Ċ type alias ĠBuiltin Function Ġ= Ġ( List < M Object ?> ) Ġ-> ĠM Object ? Ċ Ċ class ĠM Builtin Function ( val Ġfn : ĠBuiltin Function ) Ġ: ĠM Object Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġinspect (): ĠString Ġ= Ġ" builtin Ġfunction " Ċ } Ċ Ċ class ĠM Array ( val Ġelements : ĠList < M Object ?> ) Ġ: ĠM Object Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġinspect (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ"[ ${ elements . join ToString ( separator Ġ= Ġ", Ġ" )} ]" ĊĠĠĠ Ġ} Ċ } Ċ Ċ enum Ġclass ĠHash Type Ġ{ ĊĠĠĠ ĠINTEGER , ĠBOOLEAN , ĠSTRING Ċ } Ċ Ċ data Ġclass ĠHash Key ( val Ġtype : ĠHash Type , Ġval Ġvalue : ĠInt ) ĊĊ Ċ interface ĠHash able < T > Ġ: ĠM Value < T > Ġ{ ĊĠĠĠ Ġfun Ġhash Key (): ĠHash Key Ġ= ĠHash Key ( hash Type (), Ġvalue . hashCode ()) ĊĊĠĠĠ Ġfun Ġhash Type (): ĠHash Type Ċ } Ċ Ċ data Ġclass ĠHash Pair ( val Ġkey : ĠM Object , Ġval Ġvalue : ĠM Object ) Ċ Ċ class ĠM Hash ( val Ġpairs : ĠMap < Hash Key , ĠHash Pair >) Ġ: ĠM Object Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġinspect (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ"{ ${ pairs . values . join ToString Ġ{ Ġ( key , Ġvalue ) Ġ-> Ġ"${ key . inspect ()} : Ġ${ value . inspect () }" Ġ} }}" ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠM Compiled Function ( val Ġinstructions : ĠInstructions , Ġval Ġnum Local s : ĠInt Ġ= Ġ 0 , Ġval Ġnum Parameters : ĠInt Ġ= Ġ 0 ) Ġ: ĠM Object Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġinspect (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ" Compiled Function [$ this ]" ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠM Closure ( val Ġfn : ĠM Compiled Function , Ġval Ġfree : ĠList < M Object > Ġ= Ġempty List ()) Ġ: ĠM Object Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġinspect (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ" Closure [$ this ]" ĊĠĠĠ Ġ} Ċ }