
๐ท Result ๊ธฐ๋ฐ ์ธํฐํ๋ฆฌํฐ์ ์ ์ฒด ๊ตฌ์กฐ ๋ฐ ๋์ ์๋ฆฌ
๊ธฐ์กด์ ์ธํฐํ๋ฆฌํฐ๋ ๋ค์์ฒ๋ผ ์ค์ง ๊ฐ๋ง ๋ฐํํ์ต๋๋ค
racket
(define (interp [expr : ExprC] [env : Env]) : Value
...)
ํ์ง๋ง ์๋ ๊ฐ์ ์ํฉ์์๋ "๊ฐ๋ง"์ผ๋ก ๋ถ์กฑํฉ๋๋ค:
racket
(set x 3)
(set x 5)
์ ์์์ฒ๋ผ ๋ณ์์ ๊ฐ์ ์ฌํ ๋นํ๋ mutation (์ํ ๋ณํ) ๋ฅผ ํํํ๋ ค๋ฉด, ๋จ์ํ ๊ฐ๋ง ๋ฐํํด์๋ ๋ณ๊ฒฝ๋ ๋ฉ๋ชจ๋ฆฌ ์ํ(store) ๋ฅผ ์ถ์ ํ ์ ์์ต๋๋ค.
โ
Result ํ์
๋์
racket
(define-type Result
[vs (v : Value) (s : Store)])
v: ๊ณ์ฐ ๊ฒฐ๊ณผ (Value)
s: ๊ณ์ฐ ํ์ ๋ฉ๋ชจ๋ฆฌ ์ํ (Store)
vs๋ value์ store๋ฅผ ํ๋์ ๋จ์๋ก ํฌ์ฅํ ๊ฒฐ๊ณผ
โ
์ด์
racket
(define (interp expr env) : Value)
โ
์ดํ (store ์ถ๊ฐ + ๊ฒฐ๊ณผ ํ์
๋ณ๊ฒฝ)
racket
(define (interp [expr : ExprC] [env : Env] [store : Store]) : Result)
์ด์ ์ธํฐํ๋ฆฌํฐ๋ store๋ฅผ ์ ๋ ฅ์ผ๋ก ๋ฐ์, ๊ณ์ฐ๋ value์ store๋ฅผ ํจ๊ป ๋ฐํํฉ๋๋ค.
โ
numC (์ซ์ ๋ฆฌํฐ๋ด)
racket
[numC (n)
(vs (numV n) store)]
์ซ์๋ฅผ ๊ทธ๋๋ก numV๋ก ๊ฐ์ธ๊ณ , store๋ ๋ฐ๋์ง ์์ผ๋ฏ๋ก ๊ทธ๋๋ก ๋ฐํ.
โ
idC (๋ณ์)
racket
[idC (n)
(vs (fetch (lookup n env) store) store)]
env๋ก๋ถํฐ ๋ณ์ n์ ์์น๋ฅผ lookup
๊ทธ ์์น์์ ๊ฐ์ fetch
๊ฐ์ ๋ฐํํ๋, store๋ ๊ทธ๋๋ก ์ ์ง
โ
lamC (ํจ์ ์ ์)
racket
[lamC (a b)
(vs (closV a b env) store)]
lambda๋ ํด๋ก์ ๋ก ํ๊ฐ๋จ: (closV arg body env)
์ ์ ๋น์์ ํ๊ฒฝ๋ ํจ๊ป ์ ์ฅํด์ผ ๋์ค์ ์ ์ฉ ๊ฐ๋ฅ
store๋ ๋ณํ ์์
โ
seqC (์์ฐจ ์คํ)
racket
[seqC (e1 e2)
(type-case Result (interp e1 env store)
[vs (v1 s1)
(interp e2 env s1)])]
e1์ ๋จผ์ ํ๊ฐํ์ฌ ๊ฒฐ๊ณผ store์ธ s1์ ์ป์
s1์ ๋ฐ์ํ์ฌ e2๋ฅผ ํ๊ฐ
์ต์ข ๊ฒฐ๊ณผ๋ e2์ ํ๊ฐ ๊ฒฐ๊ณผ
โ
setC (๊ฐ ํ ๋น)
racket
[setC (var val)
(type-case Result (interp val env store)
[vs (v s)
(let ([loc (lookup var env)])
(vs v (override-store (cell loc v) s)))])]
val์ ๋จผ์ ํ๊ฐํด ๊ฐ v์ store s๋ฅผ ์ป์
๋ณ์ var์ ์์น๋ฅผ lookup
store์ ์๋ก์ด cell (loc โ v)์ ์ถ๊ฐ๋ก ๋ฎ์ด์ฐ๊ธฐ (mutation)
์ ๋ฐ์ดํธ๋ store์ ํจ๊ป ๊ฐ v ๋ฐํ
โ
plusC (๋ง์
)
racket
[plusC (l r)
(type-case Result (interp l env store)
[vs (vl sl)
(type-case Result (interp r env sl)
[vs (vr sr)
(vs (num+ vl vr) sr)])])]
l์ ๋จผ์ ํ๊ฐํ๊ณ store๊ฐ sl๋ก ๋ฐ๋
๊ทธ ์ํ์์ r์ ํ๊ฐํด์ผ ํ๋ฏ๋ก sl์ ๋๊น
์ต์ข ๊ฒฐ๊ณผ๋ vl + vr, store๋ sr๋ก ์ ๋ฐ์ดํธ๋ ์ํ
โ
appC (ํจ์ ํธ์ถ)
racket
[appC (f a)
(type-case Result (interp f env store)
[vs (vf sf)
(type-case Result (interp a env sf)
[vs (va sa)
(let ([loc (new-loc)])
(interp (closV-body vf)
(extend-env (bind (closV-arg vf) loc)
(closV-env vf))
(override-store (cell loc va) sa)))]))]
f๋ฅผ ํด์ํ์ฌ ํด๋ก์ vf์ store sf ํ๋
a๋ฅผ ํด์ํ์ฌ ์ธ์๊ฐ va์ store sa ํ๋
new-loc์ ์์ฑํ์ฌ ์ธ์ ์ด๋ฆ โ ์์น ๋ฐ์ธ๋ฉ ์ถ๊ฐ
ํ๊ฒฝ๊ณผ store๋ฅผ ํ์ฅํ ํ ํด๋ก์ ๋ณธ๋ฌธ ์คํ
์ฐ์ฐ ์ค๋ช
lookup name env name โ location (Environment)
fetch loc store location โ value (Store)
override-store store์ ์๋ก์ด cell ์ถ๊ฐ (์์ ๋ฎ์ด์ฐ๊ธฐ์ฒ๋ผ ๋ถ์)
extend-env ํ๊ฒฝ์ ์๋ก์ด ๋ฐ์ธ๋ฉ ์ถ๊ฐ
new-loc ์๋ก์ด ์์น (๋ฉ๋ชจ๋ฆฌ ์ฃผ์) ์์ฑ ํจ์
Result ํ์ ๋์ ์ โ๊ฐ + ์ํ(store)โ ๋์ ์ถ์ ์ ๊ฐ๋ฅํ๊ฒ ํ๋ค.
์ด์ ๋ชจ๋ ExprC๋ store๋ฅผ ์ ๋ ฅ๋ฐ๊ณ , ๊ฐ์ ๊ณ์ฐํ๋ ๋์์ ์ํ ๋ณ๊ฒฝ ๊ฒฐ๊ณผ๋ฅผ ํจ๊ป ์ถ๋ ฅํ๋ค.
์ด๋ ๊ฒ ํ๋ฉด mutable ์ํ, ๋ณ์ ์ฌํ ๋น, ์์ฐจ์ ์คํ ๋ฑ์ด ์ ํํ ํด์ ๊ฐ๋ฅํ๋ค.