sicp ch2 4 - andstudy/forge GitHub Wiki

๋ฐ์ดํ„ฐ ์š”์•ฝ(๋ฐ์ดํ„ฐ ๊ฐ„์ถ”๋ฆฌ๊ธฐ)

  • ํ•œ ํ”„๋กœ๊ทธ๋žจ์„ ์„ค๊ณ„ํ•  ๋•Œ ๊ทธ ํ”„๋กœ๊ทธ๋žจ์—์„œ ๋‹ค๋ฃจ๊ณ ์ž ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ–ˆ๋Š”์ง€๊ฐ€ ์™ธ๋ถ€์— ๋“œ๋Ÿฌ๋‚˜์ง€ ์•Š๋„๋ก ํ”„๋กœ๊ทธ๋žจ์˜ ์ฒด๊ณ„๋ฅผ ์žก์•„๊ฐ€๋Š” ๋ฐฉ๋ฒ•

  • 2.1.1์ ˆ์—์„œ์ฒ˜๋Ÿผ ๋ฆฌ์ŠคํŠธ ๊ตฌ์กฐ๋กœ, ์œ ๋ฆฌ์ˆ˜๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ์‹๊ณผ ๊ทธ๋Ÿฐ ์œ ๋ฆฌ์ˆ˜๋ฅผ ์“ฐ๋Š” ๋ฐฉ์‹์„ ์„œ๋กœ ๊ฐˆ๋ผ๋†“์„ ์ˆ˜ ์žˆ๋„๋ก ๋‘˜ ์‚ฌ์ด์— ์š”์•ฝ์˜ ๊ฒฝ๊ณ„(๊ฐ„์ถ”๋ฆผ ๊ฒฝ๊ณ„)๋ฅผ ์„ธ์šด ๋‹ค๋Š”๊ฒƒ

  • ๋ฐ์ดํ„ฐ ์š”์•ฝ์„ ํ†ตํ•ด ์š”์•ฝ์˜ ๊ฒฝ๊ณ„๋ฅผ ๊ธ‹๋Š” ๋‹ค๋Š” ๊ฒƒ์€ ๋ณต์žกํ•œ ์„ค๊ณ„๋ฅผ ๋‹ค๋ฃจ๋Š” ๋ฐ ๋”ํ•  ๋‚˜์œ„ ์—†์ด ๋›ฐ์–ด๋‚œ ์ˆ˜๋‹จ์ด ๋œ๋‹ค.(ํฐ ํ”„๋กœ๊ทธ๋žจ์˜ ์„ค๊ณ„๋ฅผ ์ž‘์€ ์ผ๋กœ ๋‚˜๋ˆ„์–ด ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์Œ ์ฆ‰ ๋ชจ๋“ˆํ™”)

    • '''ํ•˜. ์ง€. ๋งŒ''' ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ์‹์—๋„ ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Œ
  • ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์‹œ์Šคํ…œ ์„ค๊ณ„๋ผ๋Š” ๊ฒƒ ์ž์ฒด๊ฐ€ ์—ฌ๋Ÿฌ ์‚ฌ๋žŒ์ด ์˜ค๋žœ ์‹œ๊ฐ„์— ๊ฑธ์ณ ํ•จ๊ฒŒ ํ•˜๋Š” ์ผ

  • ๋ฐ์ดํ„ฐ ์š”์•ฝ์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ์˜ ํ‘œํ˜„๋ฒ•๊ณผ ์“ฐ์ž„์ƒˆ๋ฅผ ๋–ผ์–ด๋†“์„ ์ˆ˜ ์žˆ๋„๋ก ๋ฐ์ดํ„ฐ ์‚ฌ์ด์— ์š”์•ฝ์˜ ๊ฒฝ๊ณ„๋ฅผ ์„ธ์›Œ์•ผ ํ•จ์€ ๊ธฐ๋ณธ์ด๊ณ , ์„œ๋กœ ๋‹ค๋ฅธ ์„ค๊ณ„ ๋ฐฉ์‹ ์‚ฌ์ด์—๋„ ์š”์•ฝ์˜ ๊ฒฝ๊ณ„๋ฅผ ์žก์•„์„œ ํ•œ ํ”„๋กœ๊ทธ๋žจ ์†์— ์„œ๋กœ ๋‹ค๋ฅธ ์„ค๊ณ„ ๋ฐฉ์‹ ์‚ฌ์ด์—๋„ ์š”์•ฝ์˜ ๊ฒฝ๊ณ„๋ฅผ ์žก์•„์„œ ํ•œ ํ”„๋กœ๊ทธ๋žจ ์†์— ์„œ๋กœ ๋‹ค๋ฅธ ์„ค๊ณ„ ๋ฐฉ์‹์ดํ•จ๊ป˜ ์ž๋ฆฌ ์žก์„ ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผ ํ•œ๋‹ค.

  • ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ๋ชจ๋“ˆ ์„ค๊ณ„๋‚˜ ๊ตฌํ˜„์„ ์†๋ณด์ง€ ์•Š๊ณ  ์žˆ๋Š” ๊ทธ๋Œ€๋กœ ํฐ ์‹œ์Šคํ…œ ์†์— ๋ง๋ถ™์—ฌ ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์‹์ด ํ•„์š”ํ•˜๋‹ค

  • ํ•œ ํ”„๋กœ๊ทธ๋žจ ์†์—์„œ ์—ฌ๋Ÿฌ ๋ฐฉ์‹์œผ๋กœ ํ‘œํ˜„๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฃจ๋Š”์ง€ ์•Œ์•„๋ณด์ž.

์ผ๋ฐ˜ํ™”๋œ ํ”„๋กœ์‹œ์ €(generic procedure)

  • ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ์‹์ด ํ•˜๋‚˜๊ฐ€ ์•„๋‹ ๋•Œ ์ด๋Ÿฐ ๋ฐ์ดํ„ฐ๋“ค์„ ๋ฐ›์•„๋“ค์—ฌ ์ •ํ•ด์ง„ ์—ฐ์‚ฐ์„ ํ•ด ๋‚ผ ์ˆ˜ ์žˆ๋„๋ก ์ •์˜๋œ ํ”„๋กœ์‹œ์ €๋ฅผ ๋งํ•œ๋‹ค.

  • ํƒ€์ž…ํ‘œ์‹œ(type tag)

    • ์ผ๋ฐ˜ํ™”๋œ ํ”„๋กœ์‹œ์ €๋ฅผ ์ •์˜ํ• ๋•Œ ์ฃผ๋กœ ์“ฐ๋Š” ๊ธฐ๋ฒ•์œผ๋กœ ๋ฐ์ดํ„ฐ ์†์— ๊ทธํ‘œํ˜„ ๋ฐฉ์‹์„ ์•Œ๋ ค์ฃผ๋Š” ๊ธ€๊ท€๋กœ ํƒ€์ž…ํ‘œ์‹œ(type tag)๋ฅผ ๋ถ™์—ฌ์„œ ํ”„๋กœ์‹œ์ €๊ฐ€ ๊ทธ ํ‘œ์‹œ๋ฅผ ์ฝ๊ณ  ๊ทธ์— ๋งž์ถ”์–ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ.
    1. ๋‹จ์ˆœํ•œ ๋ณต์†Œ์ˆ˜ ์—ฐ์‚ฐ
    1. ์ง๊ฐ ์ขŒํ‘œ์™€ ๊ทน ์ขŒํ‘œ ํ‘œํ˜„์„ ์„ค๊ณ„
    1. ํƒ€์ž… ํ‘œ์‹œ์™€ ๋ฐ์ดํ„ฐ ์ค‘์‹ฌ ๋ฐฉ์‹์— ๋”ฐ๋ผ ์—ฌ๋Ÿฌ ํ‘œํ˜„ ๋ฐฉ์‹์„ ๊ฐ„์ถ”๋ฆผ
    1. ๋ณต์†Œ์ˆ˜์˜ ํ‘œํ˜„ ๋ฐฉ์‹์„ ๊ฐ€๋ฆฌ์ง€ ์•Š๊ฒŒ ์ผ๋ฐ˜ํ™” ๋œ ๊ณ ๋ฅด๊ฐœ๋ฅผ ์ •์˜, ๋ณต์†Œ์ˆ˜ ์—ฐ์‚ฐ์„ ์ •์˜

  • ๊ฐ€๋กœ๋กœ ๊ทธ์€ ๊ฒฝ๊ณ„๋Š” ์œ„์ธต์˜ ์—ฐ์‚ฐ๊ณผ ์•„๋ž˜์ธต์˜ '''ํ‘œํ˜„์ด ๋‚˜๋‰˜์–ด ์žˆ์Œ'''์„ ๋ณด์—ฌ์ค€๋‹ค.
  • ์„ธ๋กœ๋กœ ๊ทธ์€ ์š”์•ฝ์˜ ๊ฒฝ๊ณ„๋Š” ํ•œ '''๋ฐ์ดํ„ฐ๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๋ฐ ์—ฌ๋Ÿฌ ๋ฐฉ์‹'''์ด ์žˆ์„ ์ˆ˜ ์žˆ๊ณ 
  • ์ด๋ฅผ '''๋”ฐ๋กœ ์„ค๊ณ„ํ•˜๊ฑฐ๋‚˜ ๊ตฌํ˜„ํ•˜์—ฌ ๋ง๋ถ™์—ฌ ๋„ฃ์„ ์ˆ˜ ์žˆ์Œ'''์„ ์•Œ๋ ค์ค€๋‹ค.

ํƒ€์ž…์— ๋”ฐ๋ผ ๋‚˜๋ˆ„์–ด ๋งก๊ธฐ๊ธฐ(dispatching on type) ๊ตฌํ˜„

  • ๋‹จ์ˆœํ•œ ๋ณต์†Œ์ˆ˜ ์—ฐ์‚ฐ

    • ๋ณต์†Œ์ˆ˜

      • ์‹ค์ˆ˜์™€ ํ—ˆ์ˆ˜์ถ•์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ์ด์ฐจ์› ๊ณต๊ฐ„์—์„œ ๊ทธ ํ‰๋ฉด ์œ„์— ๋†“์ธ ์ ์˜ ์ง‘ํ•ฉ

      • ๋ณต์†Œ์ˆ˜ ์—ฐ์‚ฐ ๊ตฌํ˜„

      • real-part, imag-part, magnitude, angle

      • ๋ณต์†Œ์ˆ˜๋ฅผ ์งœ๋งž์ถ”์€ ํ”„๋กœ์‹œ์ €

      • make-from-real imag : ์‹ค์ˆ˜๋ถ€์™€ ํ—ˆ์ˆ˜๋ถ€๋กœ ์ด๋ฃจ์–ด์ง„ ๋ณต์†Œ์ˆ˜๋ฅผ ๋‚ด๋†“์Œ

      • make-from-mag-ang : ํฌ๊ธฐ์™€ ๊ฐ๋„๋ฅผ ๋ฐ›์•„์„œ ๋ณต์†Œ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด ๋ƒ„

      • ๋ณต์†Œ์ˆ˜ ์‚ฐ์ˆ  ์—ฐ์‚ฐ์„ ๊ตฌํ˜„

      • add-complex, sub-complex (์‹ค์ˆ˜๋ถ€์™€ ํ—ˆ์ˆ˜๋ถ€๋ฅผ ์‚ฌ์šฉ)

      • mul-complex, div-complex (ํฌ๊ธฐ์™€ ๊ฐ์„ ์‚ฌ์šฉ)

    • ์ง๊ฐ ์ขŒํ‘œ์™€ ๊ทน ์ขŒํ‘œ ํ‘œํ˜„์„ ์„ค๊ณ„

    • ์ง๊ฐ ์ขŒํ‘œ์— ๋”ฐ๋ผ ์Œ์œผ๋กœ ๋ณต์†Œ์ˆ˜๋ฅผ ํ‘œํ˜„(์‹ค์ˆ˜๋ถ€, ํ—ˆ์ˆ˜๋ถ€) ๋ฐฉ์‹๊ณผ ๊ทน์ขŒํ‘œ(ํฌ๊ธฐ, ๊ฐ๋„)

    • ์— ๋”ฐ๋ผ ์Œ์œผ๋กœ ๋ณต์†Œ์ˆ˜๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ์‹ ๋‘๊ฐ€์ง€ ์ค‘ ์–ด๋А์ชฝ์„ ๋”ฐ๋ฅด๋Š”๊ฒŒ ์ข‹์„๊นŒ?

    • '''๊ทธ๋•Œ ๊ทธ๋•Œ ๋‹ฌ๋ผ์š”~'''

      • ์ฆ‰, ๋ฐ์ดํ„ฐ ์š”์•ฝ(๋ฐ์ดํ„ฐ ๊ฐ„์ถ”๋ฆฌ๊ธฐ)์›์น™์— ๋”ฐ๋ฅด๋ฉด ๋ฌด์—‡์„ ์“ฐ๋“  ๋ณต์†Œ์ˆ˜ ์—ฐ์‚ฐ์€
      • ๋˜‘๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ตฌํ˜„ ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๋ฉฐ, ์ด ์—ฐ์‚ฐ๋“ค์€ ๋‘ ํ‘œํ˜„ ๋ฐฉ์‹ ๋ชจ๋‘์™€ ์ž˜
      • ๋งž๋ฌผ๋ ค ๋Œ์•„๊ฐ€์•ผ ํ•œ๋‹ค.
  • ํƒ€์ž… ํ‘œ์‹œ์™€ ๋ฐ์ดํ„ฐ ์ค‘์‹ฌ ๋ฐฉ์‹์— ๋”ฐ๋ผ ์—ฌ๋Ÿฌ ํ‘œํ˜„ ๋ฐฉ์‹์„ ๊ฐ„์ถ”๋ฆผ

    • ๋ฐ์ดํ„ฐ ์š”์•ฝ์ด๋ž€?

      • ํŒ๋‹จ์„ ํ•œ๊ป ๋ฏธ๋ฃจ์ž๋Š” ์›์น™์— ๋”ฐ๋ผ ํ”„๋กœ๊ทธ๋žจ์„ ์„ค๊ณ„ํ•˜๋Š”๊ฒƒ(runtime?)
      • ๊ณ ๋ฅด๊ฐœ์™€ ์งœ๋งž์ถ”๊ฐœ ์—ฐ์‚ฐ์œผ๋กœ ์š”์•ฝํ•œ ๋ฐ์ดํ„ฐ ์‚ฌ์ด์— ์š”์•ฝ์˜ ๊ฒฝ๊ณ„๋ฅผ ์žก์•„ ๋†“์œผ๋ฉด ๋ฐ์ดํ„ฐ์˜ ํŒ๋‹จ์„ ๋’ค๋กœ ๋ฏธ๋ฃฐ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ์‹œ์Šคํ…œ์„ ์„ค๊ณ„ํ•˜๋Š” ์ผ์—์„œ ์„ ํƒ์˜ ํญ์ด ๊ทธ๋งŒํผ ๋„“์–ด์ง„๋‹ค.
    • ํƒ€์ž… ํ‘œ์‹œ(type-tag)

      • ๋ฐ์ดํ„ฐ์˜ ํ‘œํ˜„ ๋ฐฉ์‹์ด ๋ฌด์—‡์ธ์ง€ ์•Œ ์ˆ˜ ์žˆ๋„๋ก ์ •์˜ํ•˜๋Š”๊ฒƒ
      • ์˜ˆ์ œ๋กœ ๋“  ๋ชจ๋“  ๋ณต์†Œ์ˆ˜ ๋ฌผ์ฒด์— ํƒ€์ž… ํ‘œ์‹œ๊ฐ€ ๋ถ™์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์˜ˆ์ œ์˜ ํ‘œํ˜„ ๋ฐฉ์‹์ด ํ•œ ์‹œ์Šคํ…œ์— ์ž๋ฆฌ์žก๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.
    • ๋ณต์ˆ˜์ˆ˜์˜ ํ‘œํ˜„ ๋ฐฉ์‹์„ ๊ฐ€๋ฆฌ์ง€ ์•Š๊ฒŒ ์ผ๋ฐ˜ํ™” ๋œ ๊ณ ๋ฅด๊ฐœ๋ฅผ ์ •์˜, ๋ณต์†Œ์ˆ˜ ์—ฐ์‚ฐ์„ ์ •์˜

    • ๋ฌผ์ฒด์— ๋ถ™์€ ํ‘œ์‹œ๋ฅผ ์‚ดํŽด๋ณด๊ณ , ์•Œ๋งž์€ ํ”„๋กœ์‹œ์ €๋ฅผ ํ˜ธ์ถœ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋จ

      (define (attach-tag type-tag contents) (cons type-tag contents)) (define (type-tag datum) (if (pair? datum) (car datum) (error "Bad tagged datum -- TYPE-TAG" datum))) (define (contents datum) (if (pair? datum) (cdr datum) (error "Bad tagged datum -- CONTENTS" datum)))

      (define (rectangular? z) (eq? (type-tag z) 'rectangular))

      (define (real-part z) (cond ((rectangular? z) (real-part-rectangular (contents z))) ((polar? z) (real-part-polar (contents z))) (else (error "Unknown type -- REAL-PART" z))))

    • ์ผ๋ฐ˜ํ™”๋œ ์—ฐ์‚ฐ์œผ๋กœ ์ •์˜ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ฌ๋ฆฌ ์†๋ณด์ง€ ์•Š๋”๋ผ๋„ ๋‘ ํ‘œํ˜„ ๋ฐฉ์‹๊ณผ ์ž˜ ๋งž๋ฌผ๋ ค ๋Œ์•„๊ฐ„๋‹ค.

  • ๊ณ ๋ฅด๊ฐœ ์—ฐ์‚ฐ์ด ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ๊ฐ€๋ฆฌ์ง€ ์•Š๊ณ  ๋Œ์•„๊ฐ€๋А ๊นŒ๋‹ญ์€, ๋ฐ์ดํ„ฐ ๋ฌผ์ฒด๋งˆ๋‹ค ํƒ€์ž…์„ ๋‚˜ํƒ€๋‚ด๋Š” ํ‘œ์‹œ๊ฐ€ ๋ถ™์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

  • ๊ณ ๋ฅด๊ฐœ ์—ฐ์‚ฐ์€ ์ €๋งˆ๋‹ค ์ธ์ž๋กœ ๋ฐ›์€ ๋ฐ์ดํ„ฐ ํƒ€์ž…์— ๋”ฐ๋ผ ์•Œ๋งž์€ ๋ฐฉ์‹์œผ๋กœ ๋Œ์•„๊ฐ€๊ฒŒ๋” ์ •์˜๋˜์–ด ์žˆ๋‹ค.

  • ์ธต๊ณผ ์ธต ์‚ฌ์ด์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›์œผ๋ฉฐ ํ‘œ์‹œ๋ฅผ ๋ถ™์˜€๋‹ค ๋—๋‹ค ํ•˜๋Š” ๊ธฐ๋ฒ•์€, ํฐ ํ”„๋กœ๊ทธ๋žจ์„ ์งœ๋งž์ถœ ๋•Œ ์“ธ ์ˆ˜ ์žˆ๋Š” ์ค‘์š”ํ•œ ๋ฐฉ๋ฒ•์ด๋‹ค.

๋ฐ์ดํ„ฐ ์ค‘์‹ฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ ๋ง๋ถ™์ž„ ์„ฑ์งˆ ๊ตฌํ˜„

  • ํƒ€์ž…์— ๋”ฐ๋ผ ๋‚˜๋ˆ„์–ด ๋งก๊ธฐ๊ธฐ์˜ ๋ฌธ์ œ์ 
    • ์ผ๋ฐ˜ํ™”๋œ ์ธํ„ฐํŽ˜์ด์Šค ํ”„๋กœ์‹œ์ €๋ฅผ ๋งŒ๋“ค๊ณ ์ž ํ•  ๋•Œ ๋ชจ๋“  ํ‘œํ˜„๋ฐฉ์‹์„ ๋ฏธ๋ฆฌ ์•Œ์•„์•ผ ํ•œ๋‹ค.

    • ๋”ฐ๋กœ ์„ค๊ณ„๋œ ์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ ํ‘œํ˜„์„ ๋ญ‰์ณ์„œ ํ•œ ์‹œ์Šคํ…œ์œผ๋กœ ์—ฎ์–ด ๋‚ด๋Š”๋ฐ ์„œ๋กœ ๋‹ค๋ฅธ ํ‘œํ˜„ ์†์—์„œ ๋˜‘๊ฐ™์ด ์ด๋ฆ„ ์ง€์€ ํ”„๋กœ์‹œ์ €๊ฐ€ ์—†๋‹ค๋Š” ์‚ฌ์‹ค์ด ๋’ท๋ฐ›์นจ ๋˜์–ด์•ผ ํ•œ๋‹ค.

    • ์ƒˆ๋กœ์šด ํ‘œํ˜„์„ ๋ฐ›์•„ ๋“ค์ผ ๋•Œ๋งˆ๋‹ค ์ผ๋ฐ˜ํ™”๋œ ๊ณ ๋ฅด๊ฐœ ์—ฐ์‚ฐ์„ ๊ทธ์— ๋งž๊ฒŒ ๊ณ ์ณ์•ผ ํ•  ๋ฟ ์•„๋‹ˆ๋ผ, ๋”ฐ๋กœ ๋งŒ๋“  ์—ฌ๋Ÿฌ ํ‘œํ˜„์„ ์ด์–ด ๋ถ™์ผ ์ ์—๋„ ๊ฐ™์€ ์ด๋ฆ„์„ ์“ฐ๋Š” ์ผ์ด ์—†๋„๋ก ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ์†๋ด์•ผ ํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ์•ฝ์ ์„ ๊ฑท์–ด๋‚ด๊ธฐ ์œ„ํ•ด์„œ ํ›จ์”ฌ ๋” ๋ชจ๋“ˆ ๋ฐฉ์‹์— ๋งž๊ฒŒ ์‹œ์Šคํ…œ ์„ ์„ค๊ณ„ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•˜๋‹ค.

    • ์ด๋ฅธ๋ฐ” '''๋ฐ์ดํ„ฐ ์ค‘์‹ฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ'''์ด ์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ํ‘ธ๋Š” ๋ฐ ์“ธ ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ฒ• ๊ฐ€์šด๋ฐ ํ•˜๋‚˜์ด๋‹ค.

    • ๋ฐ์ดํ„ฐ ์ค‘์‹ฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

      • ํ”„๋กœ๊ทธ๋žจ์„ ์งค ๋•Œ ์•„๋ž˜ ํ‘œ์™€ ๊ฐ™์ด ์„œ๋กœ ๋‹ค๋ฅธ ์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ ํƒ€์ž… ์‚ฌ์ด์— ๊ณตํ†ต๋œ ์—ฐ์‚ฐ์„ ๋‹ค๋ฃธ
      • ์—ฐ์‚ฐ๊ณผ ํƒ€์ž…์„ ๋‘์ถ•์œผ๋กœ ํ•˜๋Š” ์ด์ฐจ์› ํ‘œ๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ฒƒ๊ณผ ๊ฐ™๋‹ค. ํ”„๋กœ๊ทธ๋žจ์„ ์งค ๋•Œ ์ด๋Ÿฐ ํ‘œ๋ฅผ ๊ณง๋ฐ”๋กœ ์“ธ ์ˆ˜ ์žˆ๋„๋ก ํ•˜์—ฌ ์ด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ผ๋ฐ˜ํ™”๋œ ์—ฐ์‚ฐ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ธฐ๋ฒ•
      • ์ด์ฐจ์› ํ‘œ ์†์— ํƒ€์ž…๊ณผ ์—ฐ์‚ฐ์ด ๋งŒ๋‚˜๋Š” ์ž๋ฆฌ์—๋Š” ๊ทธ ํƒ€์ž…์— ์•Œ๋งž์€ ์—ฐ์‚ฐ์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ์‹œ์ €๊ฐ€ ๋“ค์–ด ์žˆ๋‹ค.

  • ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„

    • ์—ฐ์‚ฐ์ด๋ฆ„๊ณผ ์ธ์ž ํƒ€์ž…์— ๋”ฐ๋ผ ํ‘œ์—์„œ ์•Œ๋งž์€ ํ”„๋กœ์‹œ์ €๋ฅผ ์ฐพ์•„๋‚ด์–ด ๊ทธ ํ”„๋กœ์‹œ์ €๋ฅผ

    • ์ธ์ž์˜ ๋‚ด์šฉ๋ฌผ์— ์ ์šฉํ•˜๋Š” ์ผ์„ ํ•œ๋‹ค.

    • (put <''op''> <''type''> <''item''>)

    • <''op''>์™€ <''type''>์œผ๋กœ <''item''>์„ ๊บผ๋‚ด ์“ธ ์ˆ˜ ์žˆ๋„๋ก <''item''>์„ ํ‘œ์— ์ง‘์–ด ๋„ฃ๋Š”๋‹ค.

    • (get <''op''> <''type''> <''item''>)

    • ํ‘œ์—์„œ <''op''>, <''type''>์ž๋ฆฌ์— ์žˆ๋Š” ์›์†Œ๋ฅผ ๊บผ๋‚ด์˜จ๋‹ค. ๊ทธ๋Ÿฐ ์›์†Œ๊ฐ€ ํ‘œ์— ์—†์œผ๋ฉด ๊ฑฐ์ง“์ด๋ผ๊ณ  ๋‹ตํ•œ๋‹ค.

  • ๊พธ๋Ÿฌ๋ฏธ ๋‚ด๋ถ€์— ํ”„๋กœ์‹œ์ €๊ฐ€ ์ •์˜๋˜๊ธฐ ๋•Œ๋ฌด์— ์ด๋ฆ„์ด ๊ฒน์ณ์งˆ ๊ฑฑ์ •์€ ์—†๋‹ค.

  • ํ”„๋กœ์‹œ์ € ์ •์˜ ํ›„ ์—ฐ์‚ฐ-ํƒ€์ž… ํ‘œ์— ์ง‘์–ด ๋„ฃ์–ด์„œ ์‹œ์Šคํ…œ์— ๋งž๋ฌผ๋ฆฌ๋„๋ก ๋งŒ๋“ ๋‹ค.

  • ์ผ๋ฐ˜ํ™”๋œ ๊ณ ๋ฅด๊ฐœ ์—ฐ์‚ฐ์„ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•ด ํ‘œ์—์„œ ์•Œ๋งž์€ ํ”„๋กœ์‹œ์ €๋ฅผ ๊บผ๋ƒ„ ์—ฐ์‚ฐ ์ด๋ฆ„๊ณผ ์ธ์ž ํƒ€์ž…์— ๋งž๋Š” ํ”„๋กœ์‹œ์ €๋ฅผ ์ฐพ์•„๋‚ธ ๋‹ค์Œ ๊ทธ ํ”„๋กœ์‹œ์ €๋ฅผ ์ธ์ž์— ์ ์šฉํ•˜๋Š” apply-generic์ด๋ผ๋Š” ์—ฐ์‚ฐ์„ ์ •์˜ํ•˜์—ฌ ์‚ฌ์šฉ

       (define (install-rectangular-package)
      ;; internal procedures
      (define (real-part z) (car z))
      (define (imag-part z) (cdr z))
      (define (make-from-real-imag x y) (cons x y))
      (define (magnitude z)
        (sqrt (+ (square (real-part z))
                 (square (imag-part z)))))
      (define (angle z)
        (atan (imag-part z) (real-part z)))
      (define (make-from-mag-ang r a) 
        (cons (* r (cos a)) (* r (sin a))))
      ;; interface to the rest of the system
      (define (tag x) (attach-tag 'rectangular x))
      (put 'real-part '(rectangular) real-part)
      (put 'imag-part '(rectangular) imag-part)
      (put 'magnitude '(rectangular) magnitude)
      (put 'angle '(rectangular) angle)
      (put 'make-from-real-imag 'rectangular 
           (lambda (x y) (tag (make-from-real-imag x y))))
      (put 'make-from-mag-ang 'rectangular 
           (lambda (r a) (tag (make-from-mag-ang r a))))
      'done)
    
    
    (define (apply-generic op . args)
      (let ((type-tags (map type-tag args)))
        (let ((proc (get op type-tags)))
          (if proc
              (apply proc (map contents args))
              (error
                "No method for these types -- APPLY-GENERIC"
                (list op type-tags))))))
    
    
    
    Using apply-generic, we can define our generic selectors as follows:
    
    
    
    (define (real-part z) (apply-generic 'real-part z))
    (define (imag-part z) (apply-generic 'imag-part z))
    (define (magnitude z) (apply-generic 'magnitude z))
    (define (angle z) (apply-generic 'angle z))
    

๋ฉ”์‹œ์ง€ ํŒจ์‹ฑ

  • ๋ฐ์ดํ„ฐ ๋ฌผ์ฒด๊ฐ€ ์—ฐ์‚ฐ ์ด๋ฆ„์„ ๋ฉ”์‹œ์ง€ ์ฒ˜๋Ÿผ ๋ฐ›๋Š”๋‹ค๋Š”๋‹ค๋Š” ์ƒ๊ฐ์—์„œ ๋น„๋กฏ๋œ ์ด๋ฆ„

         (define (make-from-real-imag x y)
        (define (dispatch op)
          (cond ((eq? op 'real-part) x)
                ((eq? op 'imag-part) y)
                ((eq? op 'magnitude)
                 (sqrt (+ (square x) (square y))))
                ((eq? op 'angle) (atan y x))
                (else
                 (error "Unknown op -- MAKE-FROM-REAL-IMAG" op))))
        dispatch)
    
โš ๏ธ **GitHub.com Fallback** โš ๏ธ