Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source
Source file prim.ml
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596openImportmoduleArgs=structmoduleSpec=structmoduleArg=structtype'at=|Aof('a->Sexp.t)|Lofstring*('a->Sexp.t)|Oofstring*('a->Sexp.t)*'aendtype'at=|[]:'at|(::):'aArg.t*'bt->('a->'b)tend(* We use this rather than a generic list like structure to make [apply] faster. [A0] is
not a constant for optimization purposes: matching on a [t] generates one less
conditional jump. *)type('a,'b)t=|A0:unit->('a,'a)t|A1:'a->('a->'b,'b)t|A2:'a*'b->('a->'b->'c,'c)t|A3:'a*'b*'c->('a->'b->'c->'d,'d)t|A4:'a*'b*'c*'d->('a->'b->'c->'d->'e,'e)t|A5:'a*'b*'c*'d*'e->('a->'b->'c->'d->'e->'f,'f)tletapply:typeenvab.(env->a)->env->(a,b)t->b=funfenvt->matchtwith|A0()->fenv|A1(a)->fenva|A2(a,b)->fenvab|A3(a,b,c)->fenvabc|A4(a,b,c,d)->fenvabcd|A5(a,b,c,d,e)->fenvabcdeletsexps:typeab.aSpec.t->(a,b)t->Sexp.tlist=funspecargs->letopenSpecinletarg(arg:_Spec.Arg.t)xacc:Sexp.tlist=matchargwith|Af->fx::acc|L(name,f)->List[Atomname;fx]::acc|O(name,f,default)->ifx=defaultthenaccelseList[Atomname;fx]::accinmatchspec,argswith|[],A0()->[]|[sa],A1(a)->argsaa[]|[sa;sb],A2(a,b)->argsaa@@argsbb[]|[sa;sb;sc],A3(a,b,c)->argsaa@@argsbb@@argscc[]|[sa;sb;sc;sd],A4(a,b,c,d)->argsaa@@argsbb@@argscc@@argsdd[]|[sa;sb;sc;sd;se],A5(a,b,c,d,e)->argsaa@@argsbb@@argscc@@argsdd@@argsee[]|_->invalid_arg"Shexp_process.Prim.Args.sexps"endmoduleResult_spec=structtype'at=|Unit:unitt|Env:Env.tt|F:('a->Sexp.t)->'atletsexp:typea.at->a->Sexp.toption=funtx->matchtwith|Unit->None|Env->None|Ff->Some(fx)endtype('a,'b)t={name:string;args:'aArgs.Spec.t;result:'bResult_spec.t;run:Env.t->'a}letmakenameargsresultrun={name;args;result;run}letruntenvargs=Args.applyt.runenvargsletsexp_of_calltargs=Sexp.List(Atomt.name::Args.sexpst.argsargs)letsexp_of_resulttx=Result_spec.sexpt.resultx