ν’€μŠ€νƒ μ›ΉπŸŒ 개발자 지망생 πŸ§‘πŸ½β€πŸ’»
βž• 인곡지λŠ₯ 관심 πŸ€–


Categories


Recent views

  • 1
  • 2
  • 3
  • 4
  • 5

OSSU PL-B Section 1

  1. κ°„λ‹¨ν•œ Racket μ„€λͺ…
    • let, let*, letrec etc.
      • ν‘œν˜„ 지연과 Thunk
        • Stream
          • Memoization
            • Macros
              πŸ—£οΈ quote

              좜처 κ°•μ˜ Programming Languages, Part A, μ›Œμ‹±ν„΄ λŒ€ν•™κ΅

              OSSU PL-B Section 1

              κ°„λ‹¨ν•œ Racket μ„€λͺ…

              이미 μ•žμ„œ Racekt을 μ΄μš©ν•΄λ΄€κΈ° λ•Œλ¬Έμ— κ°„λ‹¨νžˆ μ„€λͺ…ν•œλ‹€.

              • 동적 타이핑을 지원
                • λ”°λΌμ„œ cond와 number? 등을 μ΄μš©ν•΄ λΆ„κΈ° 처리 κ°€λŠ₯
              • κ³Όκ±° 이름은 Schemeμ΄μ˜€μœΌλ©°, 빈 리슀트, cons, mutable λ“±μ˜ λ³€ν™”κ°€ 이뀄진 λ’€ Racket으둜 λ°”λ€Œμ—ˆλ‹€.
              • #lang racket으둜 μ‹œμž‘ν•  것
                |Primitive|Description|Example|
                |β€”|β€”|β€”|
                |null|빈 리슀트|null|
                |car|리슀트 첫번째 μ›μ†Œ|(car some-list)|
                |cdr|리슀트 λ‚˜λ¨Έμ§€ μ›μ†Œλ“€|(cdr some-list)|
                |null?|#t=빈 리슀트, #f=λ‚˜λ¨Έμ§€|(null? some-value)|

              let, let*, letrec etc.

              (let ([local-var local-val] ..) e) : 지역 μŠ€μ½”ν”„ μ„€μ •, 이전 바인딩 μ‚¬μš© λΆˆκ°€λŠ₯
              (let* ([local-var local-val] ..) e) : 이전 지역 μŠ€μ½”ν”„ 바인딩 μ‚¬μš© κ°€λŠ₯
              (letrec ([local-var local-val] ..) e) : μˆœμ„œμ™€ 상관 μ—†λŠ” 지역 μŠ€μ½”ν”„(μƒν˜Έ μž¬κ·€ κ°€λŠ₯)
              set! : 이미 λ°”μΈλ”©λœ λ³€μˆ˜λ₯Ό 변경함
              mcons: λ³€κ²½ κ°€λŠ₯ν•œ pair 생성

              • mcar, mcdr, mpair?등을 이용 해야함
              • set-mcdr!, set-mcar! 등을 μ΄μš©ν•΄ λ³€κ²½

                ν‘œν˜„ 지연과 Thunk

                λͺ¨λ“  ν‘œν˜„ eλŠ” κ³§λ°”λ‘œ ν‘œν˜„λ  ν•„μš”κ°€ μ—†λ‹€. 예λ₯Ό λ“€μ–΄ (if e1 e2 e3)μ—μ„œ e1이 #t이면 e3 값은 μ‚¬μš©λ˜μ§€ μ•ŠμœΌλ―€λ‘œ ν‘œν˜„λ˜μ§€ μ•ŠλŠ”λ‹€.

              • λ‹¨μˆœνžˆ μ„±λŠ₯ 뿐만 μ•„λ‹ˆλΌ, λ¬΄ν•œ 루프 등을 막기 μœ„ν•΄ ν•„μš”ν•˜λ‹€.

              ν•˜μ§€λ§Œ μ΄λŠ” ν•¨μˆ˜μ˜ 인자 전달 λ“±μ—λŠ” μ μš©λ˜μ§€ μ•ŠλŠ”λ‹€. λ”°λΌμ„œ μ˜λ―Έμ—†λŠ” ν‘œν˜„μ„ 막기 μœ„ν•΄ ν•¨μˆ˜μ˜ λ°”λ””λŠ” ν•¨μˆ˜κ°€ μ‚¬μš©λ˜κΈ° μ „κΉŒμ§€ ν‘œν˜„λ˜μ§€ μ•ŠλŠ” νŠΉμ„±μ„ μ΄μš©ν•˜λŠ” 것을 Thunk라고 ν•œλ‹€.

              eλ₯Ό κ·ΈλŒ€λ‘œ μ „λ‹¬ν•˜μ§€ μ•Šκ³ , (define a (lambda () e)) ν˜•μ‹μœΌλ‘œ μ „λ‹¬ν•œ λ’€, μ‚¬μš©ν•  λ•Œ (a)λ₯Ό μ΄μš©ν•΄ eλ₯Ό ν‘œν˜„ν•˜κ²Œ ν•œλ‹€.

              μ΄λ ‡κ²Œ ν‘œν˜„λœ eλŠ” μ–Έμ œλ‚˜ μ¦‰μ‹œ ν‘œν˜„λ˜κΈ°λ³΄λ‹€λŠ”, ν‘œν˜„λœ ν›„, κ²°κ³Όλ₯Ό μ €μž₯ν•˜μ—¬ μ‚¬μš©ν•˜λŠ” 편이 효율적이며, 이λ₯Ό Delay와 Force라고 ν•˜λ©°, λ‹€μŒκ³Ό 같은 ν•¨μˆ˜λ‘œ κ΅¬ν˜„ κ°€λŠ₯ν•˜λ‹€.

              ; fλŠ” (lambda () e) ν˜•μ‹μœΌλ‘œ μ „ν•΄μ£Όλ©΄ 됨
              (define (my-delay f) (mcons #f f))
              
              (define (my-force th) 
              	(if (mcar th) 
              		(mcdr th) 
              		(begin (set-mcar! th #t) (set-mcdr! th ((mcdr th)))
              		(mcdr th))))
              
              

              Stream

              λ¬΄ν•œνžˆ μ „ν•΄μ§€λŠ” 데이터λ₯Ό ν‘œν˜„(ex) Unix pipe)ν•  λ•Œ μ‚¬μš©ν•˜λ©°, 이λ₯Ό μ•žμ„œ 배운 Delay와 Force, Thunkλ₯Ό μ΄μš©ν•΄ μ‰½κ²Œ ν‘œν˜„ν•  수 μžˆλ‹€.

              ; (cons cur-val next-val-thunk) ν˜•μ‹μœΌλ‘œ 생성
              (define (stream-maker fn arg) 
              	(letrec 
              		([f (lambda (x) 
              			(cons x (lambda () (f (fn x arg)))))])
              		(lambda () (f arg))))
              (define ones 
              	(stream-maker (lambda (x y) 1) 1)) 
              (define nats (stream-maker + 1))
              (define powers-of-two (stream-maker * 2))
              
              

              Memoization

              κ°’μ˜ μ €μž₯을 톡해 효율적인 연산을 μ‹œν–‰ν•˜λŠ” 법

              (define fibonacci 
              	(letrec([memo null] 
              			[f (lambda (x) 
              				(let ([ans (assoc x memo)]) # assoc : κ°’ xλ₯Ό 리슀트 memoμ—μ„œ 찾아냄
              					(if ans 
              						(cdr ans) 
              						(let ([new-ans (if (or (= x 1) (= x 2)) 
              								1
              								(+ (f (- x 1)) (f (- x 2))))])
              						(begin (set! memo (cons (cons x new-ans) memo)) new-ans)))))])
              f))
              
              

              Macros

              Racket의 MacroλŠ” C/C++에 λΉ„ν•΄ μ‚¬μš©ν•˜κΈ° 쉽닀.

              • lexical scope와 μžλ™ 유일 지역 λ³€μˆ˜ 적용
              • μž¬κ·€ Macro μ‚¬μš© κ°€λŠ₯
              • ν•¨μˆ˜ λ‚΄ 둜컬 μŠ€μ½”ν”„ λ“±μœΌλ‘œ Macroλ₯Ό shadowing κ°€λŠ₯
              (define-syntax 
              	my-if (syntax-rules (then else) 
              		[(my-if e1 then e2 else e3) (if e1 e2 e3)]))
              
              

              맀크둜λ₯Ό μ΄μš©ν•΄ for-loop 등을 생성할 수 μžˆλ‹€.(while은 λΆˆκ°€λŠ₯ν•˜λ‹€κ³  함?)

              ν•˜μ§€λ§Œ λ‹€μŒκ³Ό 같은 이유둜 μ‚¬μš©μ— μ£Όμ˜ν•΄μ•Ό ν•œλ‹€.

              • 맀크둜 λ‚΄ ν‘œν˜„ e의 ν‘œν˜„ μˆœμ„œ ()
              • ν‘œν˜„μ˜ μ˜λ―Έμ—†λŠ” 반볡 μ—°μ‚°
              • Tokenization : μ •ν™•νžˆ 곡백으둜 λ‚˜λˆ„μ–΄μ§„ 단어λ₯Ό μ€‘μ‹¬μœΌλ‘œ λ³€κ²½ μ‹œν‚΄, ex) (token 1) λ§€ν¬λ‘œλŠ” tokenization을 1ization으둜 바꾸지 μ•ŠλŠ”λ‹€. λ‹€λ§Œ this is token을 this is 1 으둜 λ°”κΎΌλ‹€.