procedure execute(prog:tree); #include "lazy.type.P" var evals, envcells, conscells :integer; { statistics } LastId :alfa; { debugging} Answer :Value; procedure error( m:alfa ); begin writeln; writeln('Error: ', m, ' LastId=', LastId); goto 99 {error abort} end; #include "lazy.mkval.P" { Make various Values } function eval( x:tree; rho:Env ):Value; forward; procedure force( v:Value ); forward; #include "lazy.env.P" { manipulate Environment } #include "lazy.D.P" { Execute Declarations } #include "lazy.apply.P" { Apply a Function } #include "lazy.U.P" { Execute Unary Operators } #include "lazy.O.P" { Execute Binary Operators } #include "lazy.eval.P" { eval and force an Expression } #include "lazy.show.P" { Output Values } begin{execute} evals := 0; envcells := 0; conscells := 0; {zero counters} LastId := '-start- '; Answer := defer(prog, {Env=}nil); ShowValue(Answer); { Execution is print driven } writeln; write( evals, ' evals, '); write( envcells, ' env cells used, '); writeln( conscells, ' cells used') end{execute}; {\fB Shell of Interpreter for Functional Language. \fP} {Do not remove: Lazy.p, Strict.p, lazy.*.P, strict.*.P, lex.*.P, & syntax.*.P } { are released under Gnu `copyleft' General Public Licence (GPL) } { - L. Allison, CSSE, Monash Uni., .au, 7/2003, 6/2017. }