LET
e; s; H[a]=obj; env[x↦a]where a=addr(obj)let x=obj in e; s; H; envAllocate objects on the heap and bind their addresses to names in the local enviroment
LETREC
e; s; H[a]=obj; env[x↦a]where a=addr(obj)letrec x=obj in e; s; H; envAllocate objects on the heap and bind their addresses to names in the local enviroment
CASECON
e; s; H; env[x1↦a1…xn↦an]case v of{…; Cx1…xn -> e; …}; s; H[v]=CON(C a1…an); envMatch object to constructor alternative
CASEANY
e; s; H; env[x↦v]case v of{…; x -> e}; s; H; envMatch object to default alternative
CASE
e; (case∙of{…},env):s; H; envcase e of{…}; s; H; envEvaluate case scrutinee and push continuation onto stack
THUNK
e; Upd x ∙:s; H[x]=BLACKHOLE; env′x; s; H[x]=THUNK(e,env′); envEnter a thunk and push an update frame onto the stack
RET
case v of{…}; s; H; env′v; (case∙of{…},env′):s; H; envPop case continuation off the stack
UPDATE
y; s; H[x]=INDIRECTION y; envy; Upd x ∙:s; H; envPop update frame and update thunk with an indirection
PRIMOP
a; s; H; envwhere a is the result of the primitive operation over a1 and a2a1 op a2; s; H; envop in {+#,-#,*#,/#,%#,>=#,>#,==#,<#,<=#,!=#}Apply primitive operation to arguments
PUSH
f; Arg a1:…:Arg am:s; H; envfk a1…am; s; H; envPush function arguments onto the stack
FENTER
e; s; H; envf[x1↦a1…xn↦xn]f; Arg a1:…:Arg an:s; H[f]=FUN(x1…xn→e,envf); envCollect function arguments off the stack and enter function body
PAP1
p; s; H[p]=PAP(f a1…am); env1≤m<nf; Arg a1:…:Arg am:s; H[f]=FUN(x1…xn→e,envf); envConstruct partial application
PENTER
g; Arg a1:…:Arg an:Arg an+1:s; H; envf; Arg an+1:s; H[f]=PAP(g a1…an); envEnter partial application and push combined arguments onto the stack
EXACT
e; s; H; envf[x1↦a1…xn↦an]f∙ a1…an; s; H[f]=FUN(x1…xn→e,envf); envCall of an unknown function with a matching number of arguments
CALLK
e; (∙ an+1…am):s; H; envf[x1↦a1…xn↦an]m>nfk a1…am; s; H[f]=FUN(x1…xn→e,envf); envFunction call with too many arguments, the excess of which is pushed onto the stack
PAP2
p; s; H[p]=PAP(f a1…am); envm<nfk a1…am; s; H[f]=FUN(x1…xn→e,envf); envFunction call with too few arguments, a partial application is constructed
TCALL
f; (∙ a1…am):s; H; envf∙ a1…am; s; H[f]=THUNK(e,env′); envCalling a thunk (it may return a PAP or FUN, so the arguments must be pushed onto the stack)
PCALL
g∙ a1…an an+1…am; s; H; envfk an+1…am; s; H[f]=PAP(g a1…an); envProviding additional arguments to a partial application
RETFUN
f∙ a1…an; s; H; envf; (∙ a1…an):s; H[f]∈{FUN,PAP}; envConstruct a function call with returned function (or partial application) and arguments from stack