
π κ°λ
λ³μ μ΄κΈ°νλ Cμμ int a = 1;μ²λΌ μλ‘μ΄ λ³μμ κ°μ ν λΉνλ ꡬ쑰μ
λλ€.
Racketμμλ κ°μ μλ―Έλ‘ (let ([a 1]) ...) ννλ₯Ό μ¬μ©ν©λλ€.
π AST νν
racket
(letC 'a (numC 10) ; a = 10
(plusC (idC 'a) (numC 5))) ; a + 5
ν΄μ: 'aλ₯Ό 10μΌλ‘ λ°μΈλ©νκ³ , κ·Έ νκ²½μμ a + 5λ₯Ό μννλΌ.
π μΆμ ꡬ문 νΈλ¦¬ (AST)
letC
/ | \
'a numC plusC
10 / \
idC numC
'a 5
π μμ΄λμ΄
letCλ νΉλ³ν κ΅¬μ‘°κ° μλλ©°, λλ€(lamC)μ ν¨μ νΈμΆ(appC)μ μ΄μ©ν΄μ λκ°μ΄ ννν μ μμ΅λλ€.
π λ³ν μμ (desugaring)
racket
(letC 'a (numC 10)
(plusC (idC 'a) (numC 5)))
β¨ μλμ κ°μ΄ λ³νλ¨
racket
(appC
(lamC 'a (plusC (idC 'a) (numC 5)))
(numC 10))
π μΈν°ν리ν°μμμ letC ν΄μ
racket
[letC (name val body)
(interp (appC (lamC name body) val) env store)]
μ¦, letμ ν¨μμ νΈμΆ(appC) λ‘ ν΄μλ©λλ€.
π νν
racket
(list 10 20 30) ; λλ (cons 10 (cons 20 (cons 30 empty)))
π AST μμ
racket
(consC (numC 10)
(consC (numC 20)
(consC (numC 30) emptyC)))
π μ¬κ·μ ꡬ쑰
consCλ 리μ€νΈμ headμ tailλ‘ κ΅¬μ±λ¨
μ¬κ·μ μΌλ‘ μ°κ²°λμ΄ λ¦¬μ€νΈ μ 체λ₯Ό ꡬμ±ν¨
π Value νμ
νμ₯
racket
(listV elems) ; listof Value νμ
μΌλ‘ ν΄μλ¨
π ν΄μ λ°©μ
racket
[consC (head tail)
(let ([head-val (interp head ...)])
(listV (cons head-val (listV-elems (interp tail ...)))))]
π μμ (C μ€νμΌ)
c
class Point2D {
int x = 3;
int y = 5;
int add(int a) { return x + a; }
}
π AST νν
racket
(objC
(list 'x 'y 'add)
(list (numC 3) (numC 5)
(lamC 'a (plusC (idC 'x) (idC 'a)))))
π λ΄λΆ ꡬμ±
objCλ λ κ°μ 리μ€νΈλ‘ ꡬμ±λ¨
names : λ³μλͺ /λ©μλλͺ (symbol 리μ€νΈ)
vals : ν΄λΉ κ° (numC λλ lamC κ°μ ExprC)
π μλ―Έ
κ°μ²΄λ μΌμ’
μ νκ²½(environment) μΌλ‘ ν΄μλ¨
μ¦, namesμ valsλ₯Ό μ§μ§μ΄ λ°μΈλ©νλ©΄ νκ²½μ²λΌ μλν¨
π ν΅μ¬ μμ½ν
| κ°λ | νν | μν |
|---|---|---|
letC | (letC name val body) | μ§μ λ³μ μ μΈ, μ΄κΈ°ν ν body μ€ν |
| Desugaring | letC β appC(lamC ...) | letμ ν¨μ νΈμΆλ‘ λ¨μν |
list | consC head tail | μ¬κ·μ 리μ€νΈ κ΅¬μ± |
listV | 리μ€νΈ νμ κ²°κ³Όκ° | Value νμ μ 리μ€νΈ μΆκ° |
objC | (objC names vals) | μ΄λ¦-κ° νκ²½ ꡬ쑰, κ°μ²΄ νν |