PLT - Lecture 11

λ‘œλ‘λ§ˆλ‹ˆΒ·2025λ…„ 6μ›” 13일
post-thumbnail

πŸ“˜ 11μž₯: Extensions μš”μ•½

βœ… 1. Variable Initialization (λ³€μˆ˜ μ΄ˆκΈ°ν™”)

πŸ“Œ κ°œλ…
λ³€μˆ˜ μ΄ˆκΈ°ν™”λŠ” 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

βœ… 2. Desugaring (섀탕 제거: letCλ₯Ό appC둜 λ³€ν™˜)

πŸ“Œ 아이디어
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) 둜 ν•΄μ„λ©λ‹ˆλ‹€.

βœ… 3. Lists (리슀트 ꡬ쑰)

πŸ“Œ ν‘œν˜„
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 ...)))))]

βœ… 4. Objects (객체 ꡬ쑰)

πŸ“Œ μ˜ˆμ‹œ (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 μ‹€ν–‰
DesugaringletC β†’ appC(lamC ...)let을 ν•¨μˆ˜ 호좜둜 λ‹¨μˆœν™”
listconsC head tailμž¬κ·€μ  리슀트 ꡬ성
listV리슀트 νƒ€μž… κ²°κ³Όκ°’Value νƒ€μž…μ— 리슀트 μΆ”κ°€
objC(objC names vals)이름-κ°’ ν™˜κ²½ ꡬ쑰, 객체 ν‘œν˜„
profile
해적왕이 될 μ‚¬λ‚˜μ΄

0개의 λŒ“κΈ€