スタックマシン

type t =
 | POP
 | PUSHI of int
 | ADD
 | SUB
 | MUL
 | PRINTI
 | RET

let codes = [|
	PUSHI 1;
	PUSHI 2;
	ADD;
	PUSHI 10;
	SUB;
	PUSHI 100;
	MUL;
	PRINTI;
	RET
]
let rec exec stack pc = ( let code = codes.(pc) in let npc = pc + 1 in match (codes.(pc), stack) with | POP, x::xs -> exec xs npc | PUSHI(i), xs -> exec (i::xs) npc | ADD, y::x::xs -> exec ((x + y)::xs) npc | SUB, y::x::xs -> exec ((x - y)::xs) npc | MUL, y::x::xs -> exec ((x * y)::xs) npc | PRINTI, x::xs -> print_int x; print_string "\n"; exec xs npc | RET, x::xs -> xs | _, xs -> xs ) let _ = (exec [] 0)

variantな型と、リストを使ってスタックを表して末尾再帰って感じで、こんな感じで書けました。