typeCombination[]ExpressiontypeCombinationKstruct{Es[]Expression// Execute each expression of a combination via successive CombinationK continuationsDs[]Datum// Collect the data, giving the final expression an Applicationk continuationNextKContinuation}typeApplication[]Datum// Apply the first datum, a procedure, to the remaining data, the actual argumentstypeApplicationKstruct{Ds[]Datum// Collect the data from evaluating each element of a combination then apply via ApplicationNextKContinuation}func(kCombinationK)Invoke(resultDatum,rte*RuntimeFrame,interp*Interpreter)(bBouncer,dDatum,errerror){switchlen(k.Es){case0:err=ImplementationError("A combination continuation must have at least one expression to execute")returncase1:k1:=ApplicationK{Ds:append(k.Ds,result),NextK:k.NextK}b=Bouncer{E:k.Es[0],F:rte,K:k1}returndefault:k1:=CombinationK{Es:k.Es[1:],Ds:append(k.Ds,result),NextK:k.NextK}b=Bouncer{E:k.Es[0],F:rte,K:k1}return}}func(cCombination)Execute(rte*RuntimeFrame,rtkContinuation,interp*Interpreter)(bBouncer,dDatum,errerror){switchlen(c){case0:err=EmptyListError{}returncase1:k:=ApplicationK{NextK:rtk}b=Bouncer{E:c[0],F:rte,K:k}returndefault:k:=CombinationK{Es:c[1:],NextK:rtk}b=Bouncer{E:c[0],F:rte,K:k}return}}func(interp*Interpreter)Eval(dDatum)(resultDatum,errerror){vareExpressione,err=d.Compile(nil,interp)iferr!=nil{return}result,err=interp.Execute(e)return}func(interp*Interpreter)Execute(eExpression)(resultDatum,errerror){varbBouncerb,result,err=e.Execute(nil,IdentityK{},interp)forb.E!=nil&&result==nil&&err==nil{b,result,err=b.E.Execute(b.F,b.K,interp)}ifresult==nil&&err==nil{err=ImplementationError("Execution completed with neither a result nor an error")return}returnresult,err}
Comments (0)
HTTPSSSH
You can clone a snippet to your computer for local editing.
Learn more.