package Ġlo x Ċ Ċ import Ġlo x . grammar . Stmt Ċ Ċ class ĠL ox Function ( private Ġval Ġdeclaration : ĠStmt . Companion . Function , Ġprivate Ġval Ġclosure : ĠEnvironment , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġis Initializer : ĠBoolean ) Ġ: ĠL ox Callable Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġar ity (): ĠInt Ġ= Ġdeclaration . params . size ĊĊĠĠĠ Ġoverride Ġfun Ġcall ( interpreter : ĠInterpreter , Ġarguments : ĠList < Any ?> ): ĠAny ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġenvironment Ġ= ĠEnvironment ( closure ) ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġdeclaration . params . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenvironment . define ( declaration . params [ i ]. lex eme , Ġarguments [ i ]) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinterpreter . execute Block ( declaration . body , Ġenvironment ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( returnValue : ĠReturn ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( is Initializer ) Ġclosure . get At ( 0 , Ġ" this ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠreturnValue . value ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( is Initializer ) Ġclosure . get At ( 0 , Ġ" this ") Ġelse Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbind ( instance : ĠL ox Instance ): ĠL ox Function Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġenvironment Ġ= ĠEnvironment ( closure ) ĊĠĠĠĠĠĠĠ Ġenvironment . define (" this ", Ġinstance ) ĊĠĠĠĠĠĠĠ Ġreturn ĠL ox Function ( declaration , Ġenvironment , Ġis Initializer ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ"< fn Ġ${ declaration . name . lex eme } Ġ> " ĊĠĠĠ Ġ} Ċ Ċ }