sicp ch3 1 - andstudy/forge GitHub Wiki

3.1 ๋ฎ์–ด์“ฐ๊ธฐ์™€ ๊ฐ™์ธ์ƒํƒœ

๊ฐ‡ํžŒ ์ƒํƒœ ๋ณ€์ˆ˜

  • ์˜ˆ๊ธˆ์—์„œ ๋ˆ์„ ์ธ์ถœํ•˜๋Š” ์˜ˆ์ œ
    • ๋ฒ„์ „ 1: ์™ธ๋ถ€๋ณ€์ˆ˜ ์‚ฌ์šฉ

      • (set! ) : ์˜ ๋‚ด์šฉ์„ ๋กœ ๋ฐ”๊พผ๋‹ค

      • (begin ... ) : ๋“ค์„ ์ฐจ๋ก€๋กœ ์‹คํ–‰ํ•˜๊ณ  ๋งˆ์ง€๋ง‰์„ ๋ฐ˜ํ™˜

        ( define balance 100) (define (withdraw amount) (if (>= balance amount) (begin (set! balance (- balance amount)) balance) "Insufficient funds")) (withdraw 10) (withdraw 20)

    • ๋ฒ„์ „ 2: ํ•จ์ˆ˜ ์•ˆ์œผ๋กœ ๋ณ€์ˆ˜ ์€๋‹‰

      • ๋งž๋ฐ”๊ฟˆ ๊ณ„์‚ฐ๋ฒ•์œผ๋กœ ์„ค๋ช…์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๊ณ  ํ•จ์ˆ˜๋งŒ ๋ณด์•˜์„๋•Œ ์™œ ์ด๋ ‡๊ฒŒ ๋™์ž‘ ๋˜๋Š”์ง€ ์„ค๋ช…์ด ๋˜์ง€ ์•Š์Œ

        (define new-withdraw (let ((balance 100)) (lambda (amount) (if (>= balance amount) (begin (set! balance (- balance amount)) balance) "Insufficient funds"))))

        ( new-withdraw 10 ) ( new-withdraw 20 ) ( new-withdraw (new-withdraw 1))

    • ๋ฒ„์ „ 3 : ๋ˆ ์ฐพ๋Š” ํ”„๋กœ์‹œ์ €๋ฅผ ๋งŒ๋“ค์–ด ๋‚ธ๋‹ค

      • ๋…ผ๋ฆฌ์ ์œผ๋กœ ์˜๋ฏธ๊ฐ€ ๋“ค์–ด๋‚จ

        (define (make-withdraw balance) (lambda (amount) (if (>= balance amount) (begin (set! balance (- balance amount)) balance) "Insufficient funds")))

        (define W1 (make-withdraw 100)) (define W2 (make-withdraw 200))

        (W1 10) (W2 20)

    • ์˜ˆ๊ธˆ์„ ๋„ฃ๊ณ  ๋นผ๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฐ์ฒด (๋ฉ”์„ธ์ง€ ์ด์šฉ)

      (define (make-account balance)
        (define (withdraw amount)
          (if (>= balance amount)
              (begin (set! balance (- balance amount))
                     balance)
              "Insufficient funds"))
        (define (deposit amount)
          (set! balance (+ balance amount))
          balance)
        (define (dispatch m)
          (cond ((eq? m 'withdraw) withdraw)
                ((eq? m 'deposit) deposit)
                (else (error "Unknown request -- MAKE-ACCOUNT"m))))
        dispatch)
      
      (define acc (make-account 100))
      ((acc 'withdraw) 50)
      ((acc 'deposit) 40)
      

๋ฎ์–ด ์“ฐ๊ธฐ๊ฐ€ ์žˆ์–ด ์ข‹์€์ 

  • p.296~297 ์†Œ์Šค๋ฅผ ๋ณด์ž
    • rand ํ•จ์ˆ˜๊ตฌํ˜„์‹œ ๋‹ค์Œ ์ƒํƒœ๋ฅผ ๋ณด๊ด€ํ•˜๊ณ  ์žˆ์„ ์ˆ˜ ์žˆ๊ฒŒ ๋˜์–ด ๊ตฌํ˜„์ด ๊ฐ„๊ฒฐ
    • ์ƒํƒœ๋ณ€์ˆ˜์ด์šฉํ•œ rand๋ฅผ ๊ตฌํ˜„์„ ์ด์šฉํ•˜์—ฌ ๋ชฌํ…Œ์นด๋ฅผ๋กœ ์ •์˜์— ๋”ฐ๋ฅธ ์‹œ๋ฌผ๋ ˆ์ด์…˜ ๊ตฌํ˜„์ด ์ž˜ ๋“ค์–ด๋‚˜๊ฒŒ ๋จ
      • ๋ฌผ์ฒด์•ˆ์— ์ƒํƒœ๋ฅผ ๊ฐ์ถฐ ๋„ฃ์„ ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค~ -> ๊ณผ์—ฐ ๋” ์ข‹๊ฒŒ ๋˜์—ˆ๋Š”๊ฐ€?

๋ฎ์–ด์“ฐ๊ธฐ๋ฅผ ๋Œ์–ด๋“œ๋ฆฐ ๋Œ€๊ฐ€

ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ

  • 1,2์žฅ ์ฒ˜๋Ÿผ ๋ฎ์–ด์“ฐ๊ธฐ ์—†์ด ํ”„๋กœ๊ทธ๋žจ ํ•˜๋Š” ๋ฒ•์„ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ด๋ผ๊ณ ํ•จ

  • ์ƒํƒœ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋งž๋ฐ”๊ฟˆ ๊ณ„์‚ฐ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ

      (define (make-simplified-withdraw balance)
        (lambda (amount)
          (set! balance (- balance amount))
          balance))
      (define W (make-simplified-withdraw 25))
      (W 20)
      5
      (W 10)
      - 5
    
  • (W 20) ์€ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”๊ฐ€? (๋งž๋ฐ”๊ฟˆ ๊ณ„์‚ฐ๋ฒ•์œผ๋กœ ํ™•์ธํ•ด๋ณด๊ธฐ)

    • ((make-simplified-withdraw 25) 20)
    • ((lambda (amount) (set! balance (- 25 amount)) 25) 20)
    • (set! balance (- 25 20)) 25
      • balance์— 5๋ฅผ ๋ฎ์–ด ์ผ์œผ๋‚˜ ๊ฒฐ๊ตญ 25๊ฐ€ ๋˜์—ˆ๋‹ค? (๋ญฅ๋‹ˆ)
  • ๋‹ค์‹œ ๋Œ์•„์™€์„œ !set ์ด ํ•ด์ฃผ๋Š” ๊ฒƒ์€ ๋ฌด์—‡์ธ๊ฐ€?

    • W1 ๊ณผ W2๋Š” ๊ฐ™์€์ผ์€ ํ•˜์ง€๋งŒ , ์„œ๋กœ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ ์˜์—ญ์„ ๊ฐ–๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์—์„œ๋กœ ๋งž๋ฐ”๋€”์ˆ˜๋Š” ์—†๋‹ค.

      (define W1 (make-simplified-withdraw 25))
      (define W2 (make-simplified-withdraw 25))
      (W1 20)
      5
      (W1 20)
      - 15
      (W2 20)
      5
      
  • ๋‘˜์˜ ์ฐจ์ด?

    • peter์™€ paul์€ ๊ฐ๊ฐ ์€ํ–‰ ๊ฐœ์ •์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

      (define peter-acc (make-account 100))
      (define paul-acc (make-account 100))
      
  • peter์™€ paul์€ ๊ฐ™์€ ์€ํ–‰ ๊ณ„์ •์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค

      (define peter-acc (make-account 100))
      (define paul-acc peter-acc)
    

๋ช…๋ น ์ค‘์‹ฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

  • ํ•จ์ˆ˜ํ˜•

      (define (factorial n)
        (define (iter product counter)
          (if (> counter n)
              product
              (iter (* counter product)
                    (+ counter 1))))
        (iter 1 1))
      
      ( factorial 10)
    
  • ๋ช…๋ นํ˜•

      (define (factorial n)
        (let ((product 1)
              (counter 1))
          (define (iter)
            (if (> counter n)
                product
                (begin (set! product (* counter product))
                       (set! counter (+ counter 1))
                       (iter))))
          (iter)))
    
  • ํ˜น์—ฌ๋‚˜ set! ์ด ์žˆ๋Š” ๋ถ€๋ถ„์˜ ์ˆœ์„œ๊ฐ€ ๋‹ฌ๋ผ์ง€๋ฉด ์ž˜๋ชป๋œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•จ

  • ๋™์‹œ์— ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋Œ์•„๊ฐ€๋Š” ์ƒํ™ฉ์ด๋ผ๋ฉด ์˜๋„์น˜ ์•ˆํ” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒ๋  ์ˆ˜ ์žˆ์Œ

โš ๏ธ **GitHub.com Fallback** โš ๏ธ