F1VAE는 First Order Function을 지원하기 때문에 다음과 같은 특징을 지닌다.
✔ 함수는 각각 다른 메모리에 저장된다.
✔ 함수는 함수를 인수로 받거나, 리턴하지 못한다.
✔ 함수는 오직 함수 호출 표현식에서만 사용될 수 있다.
✔ 함수와 변수를 똑같은 방식으로 다룬다.
✔ 함수는 value처럼 이용될 수 있으며, 인자처럼 이용될 수 있다.
✔ 함수는 다른 함수에 의해 리턴될 수 있다.
FVAE는 익명함수만을 지원한다. 즉, 이름을 가지지 않은 함수!
e.g. (fun x -> x + 1)
단, (let in 키워드로) 변수에 binding함으로써 함수에 이름을 짓게 된다.
e.g. let f = (fun x -> x + 1) in …
함수형 프로그래밍에서는, 함수 호출 대신 Function Application이 사용된다. 즉 함수 호출과 동일한 의미이다.
Example)
"f가 인자 3으로 호출되었다" 대신 "f가 3에 적용되었다"고 한다.
let f = (fun x -> x - 1) in
f 3
"(f 2) 는 인자 3으로 호출되었다"가 아닌 "(f 2)는 3으로 적용되었다"고 한다.
let f = (fun x y -> x + y) in
(f 2) 3
ʎx.e
와 e e
가 추가된다.
Lambda Abstraction : ʎx.e
ʎx.e
(x는 파라미터, e는 바디) 는 익명함수를 의미한다.
x는 binding occurence이고, x의 scope은 e다.
function application : e1 e2
e e
는 함수 호출(application)을 의미한다.
e1은 함수, e2는 인자이다.
App of expr * expr
Lambda of string * expr
Value = Integer(Z)
이전 AE, VAE, F1VAE에서는 ⭕Value는 오직 Integer(Z)⭕였다.
🌱 Value = Integer(Z) +D Closure
🌱 Closure = Var x E x Store
value의 범위가 함수까지 포용할 수 있도록 범위를 확장해야 한다.
FVAE에서 ⭕함수는 value일 수 있고, Closure⭕일 수 있다.✔ Closure는 함수의 집합이다.
따라서 Var, expression, store을 포함한다. var는 파라미터, e는 함수 바디, store는 함수가 정의될 때의 abstract memory를 의미한다.
기존에 존재하는 도메인들의 합으로서, 새로운 도메인을 정의해 보자!
A와 B는 기존의 도메인이고, C는 새로운 도메인일 경우 다음과 같이 정의할 수 있다.
->
A +D B = A U B = { C | C ∈ A or C ∈ B }
Z +D Closure = Z U Closure { v | v ∈ Z or v ∈ Closure }
value의 원소는 'v'로 표시된다.
N : Integer(Z)의 원소.🌱 <ʎx.e, σ> : Closure (Var x E x Store) 의 원소
🌱 Value Domain : in Ocaml
VAE, F1VAE에서 Store는 Var -> Z
였다.
FVAE에서는 Store는 Var -> Value
이다. (즉 integer 혹은 Closure을 반환)
따라서 새로운 Value domain을 다음과 같이 정의할 수 있다.
∀σ∈Store. ∀e ∈E. ∀v∈ Value. σ⊢e ⇓E v ⇔ (σ, e,v) ∈⇓E
∀σ∈Store는 모든 추상 메모리(sigma)에 대해, ∀e ∈E는 모든 표현식(e)에 대해, ∀v∈ Value는 모든 값(v)에 대해, σ⊢e ⇓E v는 추상 메모리(sigma)에서 표현식(e)이 값(v)으로 계산된다는 것을 의미한다.
(FVAE 이전의 언어에서는 e는 정수 n으로 계산되었다)
⇔ (σ, e, v) ∈ ⇓E는 추상 메모리(sigma), 표현식(e), 값(v)의 쌍이 실행 동작(⇓E)을 통해 관련이 있다.
위의 표현식은 "모든 추상 메모리(sigma), 표현식(e), 값(v)에 대해, 추상 메모리(sigma)에서 표현식(e)이 값(v)으로 계산된다면 해당 쌍 (sigma, e, v)은 실행 동작(⇓E)에 속한다"는 의미이다.
❌ FVAE 언어에서는 Abstract Memory Fstore가 필요하지 않다.
우리는 F1VAE 함수 정보를 저장하기 위하여 Fstore을 만들었다. 그러나 FVAE에서는 함수가 변수처럼 취급되기 때문에, Seperate하게 Fstore을 이용할 필요가 없다.
❌ integer 도메인 Z도 필요 없다.
왜냐하면 Value에 integer 도메인이 포함되어 있기 때문이다.
FVAE언어를 위한 Semantic을 정의해 보자.
기존과 다른 점은 n이 아닌 v를 이용하고 있다는 점이다.
다른 언어들은 expression이 n으로 계산되었다면 FVAE에서는 v로 계산된다.
ʎx.e는 Closure <ʎx, e, σ>로 계산된다.
1) Using Substitution = Rule App : e1 e2
σ 하에서, e1의 계산 결과가 <ʎx, e3, σ>이라면, 그리고 e2의 계산 결과가 v1이라면, 그리고 e3[v1/x]의 계산 결과가 v2라면, e1 e2는 v2로 계산된다.
2) Using Store = Rule App : e1 e2
σ 하에서, e1의 계산 결과가 <ʎx, e3, σ>이라면, 그리고 e2의 계산 결과가 v1이라면, 그리고 σ1[x↦v1] 하에서, 만약 e3의 계산 결과가 v2라면, e1 e2는 v2로 계산된다.
여기에서 e1이 function이 아니라 integer값이면 runtime error 발생
여기에서 e1이 function이 아니라 integer값이면 runtime error 발생
두 번째 foo는 앞선 foo에 bound 되었다.
lexical scope은 compile 시점에 value가 바인딩되지만 dynamic은 runtime에 바인딩된다.
free identifier가 있어도 dynamic은 실제 그 함수가 사용되는 시점까지 미뤄지기 때문에 late binding이다.
lexical scope은 함수가 define 됐을 당시의 abstract memory를 사용하고, dynamic은 해당 함수가 호출된 시점의 abstract memory를 사용한다.
-> 빨간 부분을 보면 된다!!