let x = let rec is_even: int => bool = fun n: int => if n == 0 then true else is_odd (n - 1) ; is_odd: int => bool = fun n: int => if n == 0 then false else is_even (n - 1) in is_even 99 ;; (* x == false *) }
let x = let rec is_even: int => bool = fun n: int => if n == 0 then true else is_odd (n - 1) ; is_odd: int => bool = fun n: int => if n == 0 then false else is_even (n - 1) in is_even 99 ;; (* x == false *) } Ϟδϡʔϧ Ϟδϡʔϧม JNQPSU ύοέʔδએݴ ϩʔΧϧม ؔఆٛ JG ೋ߲ԋࢉࢠ ؔݺͼग़͠ ίϝϯτ
ະͷ໊લ͕ग़ݱͨ͠ΒΤϥʔ • Named ASTΛग़ྗ // ຊRaw AST import java.lang.Integer module A { let x = Integer##valueOf(1);; let f = fun x: int => x ;; } Struct(name="A") Let("x") App Class(java.lang.Integer) "valueOf" LitInt(1) Let("f") Fun(int) Local(1, 0)
Integer Method(Integer.valueOf) LitInt(1): int Let("f"): int -> int Fun(int): int -> int Local(1, 0): int Struct(name="A") Let("x") App Class(java.lang.Integer) "valueOf" LitInt(1) Let("f") Fun(int) Local(1, 0)
static Integer x; public static Integer f; static { x = Integer.valueOf(1); f = new A$1(); } } class A$1 { ... } Struct(name="A") Let("x"): Integer JCallStatic: Integer Method(Integer.valueOf) LitInt(1): int Let("f"): int -> int Fun(int): int -> int Local(1, 0): int
= null let f = fun x: int => // F0 fun y: int => // F1 x + y let g = f 10 class Fun$1 depth = 1 local = 10 g f def app(x: Any) = new Fun$0(this, x) def app(y: Any) = getLocal(1,0) + y
e1; x2 = e2; ... in body • એݴ͞Εͨมx1, x2, ... ɺ ࣜe1, e2, ..., body͔ΒࢀরՄ ೳ let rec is_even: int => bool = fun x: int => if x == 0 then true else is_odd (n - 1) ; is_odd: int => bool = fun x: int => if x == 0 then false else is_even (n - 1) in is_even 99
int => bool = fun x: int => if x == 0 then true else is_odd (n - 1) ; is_odd: int => bool = fun x: int => if x == 0 then false else is_even (n - 1) in is_even 99 // ٖࣅίʔυ let body env = env[0] := fun x => ... else env[1] (n-1) env[1] := fun x => ... else env[0] (n-1) env[0] 99 in body (new Array[2])
local = null let rec f = fun ... g = fun ... in f 1 def app(env: Array) = { env(0) = new Fun$1(this, env) env(1) = new Fun$2(this, env) env(0).app(1) } class Fun$1 depth = 1 local = env class Fun$2 depth = 1 local = env f g