let rec code_0 ()= push(emptystack(3,Unbound),tempvalstack); push(Int(1),top(tempvalstack)); push(access(dvalstack,!currentenv),top(tempvalstack)); let firstarg = top(top(tempvalstack)) in pop(top(tempvalstack)); let sndarg = top(top(tempvalstack)) in pop(top(tempvalstack)); push((match (firstarg,sndarg) with | (Int(u), Int(w)) -> Int(u-w)), top(tempvalstack)); let arg = top(top(tempvalstack)) in pop(top(tempvalstack)); push((match arg with | Int(y) -> Bool(y=0) ), top(tempvalstack)); let arg = top(top(tempvalstack)) in pop(top(tempvalstack)); if arg = Bool(true) then begin push(Int(1),top(tempvalstack)); end else begin push(Int(1),top(tempvalstack)); push(access(dvalstack,!currentenv),top(tempvalstack)); let firstarg = top(top(tempvalstack)) in pop(top(tempvalstack)); let sndarg = top(top(tempvalstack)) in pop(top(tempvalstack)); push((match (firstarg,sndarg) with | (Int(u), Int(w)) -> Int(u-w)), top(tempvalstack)); push(access(dvalstack,access(slinkstack,!currentenv)),top(tempvalstack)); let firstarg = top(top(tempvalstack)) in pop(top(tempvalstack)); let sndarg = top(top(tempvalstack)) in pop(top(tempvalstack)); push((match firstarg with Funval(f) -> f sndarg)), top(tempvalstack)); push(access(dvalstack,!currentenv),top(tempvalstack)); let firstarg = top(top(tempvalstack)) in pop(top(tempvalstack)); let sndarg = top(top(tempvalstack)) in pop(top(tempvalstack)); push((match (firstarg,sndarg) with | (Int(u), Int(w)) -> Int(u*w)), top(tempvalstack)); end; let valore = top(top(tempvalstack)) in pop(tempvalstack); push(valore,top(tempvalstack)); pop(dvalstack); pop(slinkstack); currentenv := lungh(dvalstack); let r = top(top(tempvalstack)) in pop(top(tempvalstack)); r;; let code() = push(emptystack(1,Unbound),tempvalstack); let r = lungh(dvalstack) + 1 in push(Funval(function(b) -> push(b,dvalstack); push(r,slinkstack); currentenv := lungh(dvalstack); code_0()),dvalstack); push(!currentenv,slinkstack); currentenv := lungh(dvalstack); push(emptystack(2,Unbound),tempvalstack); push(Int(10),top(tempvalstack)); push(access(dvalstack,!currentenv),top(tempvalstack)); let firstarg = top(top(tempvalstack)) in pop(top(tempvalstack)); let sndarg = top(top(tempvalstack)) in pop(top(tempvalstack)); push((match firstarg with Funval(f) -> f sndarg)), top(tempvalstack)); let valore = top(top(tempvalstack)) in pop(tempvalstack); push(valore,top(tempvalstack)); pop(dvalstack); pop(slinkstack); currentenv := lungh(dvalstack); let valore = top(top(tempvalstack)) in pop(tempvalstack); push(valore,top(tempvalstack)); pop(dvalstack); pop(slinkstack); currentenv := lungh(dvalstack); let r = top(top(tempvalstack)) in pop(top(tempvalstack)); r;; let main () = let t = Intero in svuota(tempvalstack); svuota(dvalstack); svuota(slinkstack); push(emptystack(2,Unbound),tempvalstack); push(Unbound,dvalstack); push(-1,slinkstack); currentenv := lungh(dvalstack); (code(),t);;