sicp ch2 4 - andstudy/forge GitHub Wiki
-
ํ ํ๋ก๊ทธ๋จ์ ์ค๊ณํ ๋ ๊ทธ ํ๋ก๊ทธ๋จ์์ ๋ค๋ฃจ๊ณ ์ ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ด๋ป๊ฒ ๊ตฌํํ๋์ง๊ฐ ์ธ๋ถ์ ๋๋ฌ๋์ง ์๋๋ก ํ๋ก๊ทธ๋จ์ ์ฒด๊ณ๋ฅผ ์ก์๊ฐ๋ ๋ฐฉ๋ฒ
-
2.1.1์ ์์์ฒ๋ผ ๋ฆฌ์คํธ ๊ตฌ์กฐ๋ก, ์ ๋ฆฌ์๋ฅผ ํํํ๋ ๋ฐฉ์๊ณผ ๊ทธ๋ฐ ์ ๋ฆฌ์๋ฅผ ์ฐ๋ ๋ฐฉ์์ ์๋ก ๊ฐ๋ผ๋์ ์ ์๋๋ก ๋ ์ฌ์ด์ ์์ฝ์ ๊ฒฝ๊ณ(๊ฐ์ถ๋ฆผ ๊ฒฝ๊ณ)๋ฅผ ์ธ์ด ๋ค๋๊ฒ
-
๋ฐ์ดํฐ ์์ฝ์ ํตํด ์์ฝ์ ๊ฒฝ๊ณ๋ฅผ ๊ธ๋ ๋ค๋ ๊ฒ์ ๋ณต์กํ ์ค๊ณ๋ฅผ ๋ค๋ฃจ๋ ๋ฐ ๋ํ ๋์ ์์ด ๋ฐ์ด๋ ์๋จ์ด ๋๋ค.(ํฐ ํ๋ก๊ทธ๋จ์ ์ค๊ณ๋ฅผ ์์ ์ผ๋ก ๋๋์ด ๋ค๋ฃฐ ์ ์์ ์ฆ ๋ชจ๋ํ)
- '''ํ. ์ง. ๋ง''' ํ ๋ฐ์ดํฐ๋ฅผ ํํํ๋ ๋ฐฉ์์๋ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์์ ์ ์์
-
ํ๋ก๊ทธ๋๋ฐ ์์คํ ์ค๊ณ๋ผ๋ ๊ฒ ์์ฒด๊ฐ ์ฌ๋ฌ ์ฌ๋์ด ์ค๋ ์๊ฐ์ ๊ฑธ์ณ ํจ๊ฒ ํ๋ ์ผ
-
๋ฐ์ดํฐ ์์ฝ์ ํตํด ๋ฐ์ดํฐ์ ํํ๋ฒ๊ณผ ์ฐ์์๋ฅผ ๋ผ์ด๋์ ์ ์๋๋ก ๋ฐ์ดํฐ ์ฌ์ด์ ์์ฝ์ ๊ฒฝ๊ณ๋ฅผ ์ธ์์ผ ํจ์ ๊ธฐ๋ณธ์ด๊ณ , ์๋ก ๋ค๋ฅธ ์ค๊ณ ๋ฐฉ์ ์ฌ์ด์๋ ์์ฝ์ ๊ฒฝ๊ณ๋ฅผ ์ก์์ ํ ํ๋ก๊ทธ๋จ ์์ ์๋ก ๋ค๋ฅธ ์ค๊ณ ๋ฐฉ์ ์ฌ์ด์๋ ์์ฝ์ ๊ฒฝ๊ณ๋ฅผ ์ก์์ ํ ํ๋ก๊ทธ๋จ ์์ ์๋ก ๋ค๋ฅธ ์ค๊ณ ๋ฐฉ์์ดํจ๊ป ์๋ฆฌ ์ก์ ์ ์๋๋ก ํด์ผ ํ๋ค.
-
ํ๋ก๊ทธ๋๋จธ๊ฐ ๋ชจ๋ ์ค๊ณ๋ ๊ตฌํ์ ์๋ณด์ง ์๊ณ ์๋ ๊ทธ๋๋ก ํฐ ์์คํ ์์ ๋ง๋ถ์ฌ ๋ฃ์ ์ ์๋ ๋ฐฉ์์ด ํ์ํ๋ค
-
ํ ํ๋ก๊ทธ๋จ ์์์ ์ฌ๋ฌ ๋ฐฉ์์ผ๋ก ํํ๋ ๋ฐ์ดํฐ๋ฅผ ์ด๋ป๊ฒ ๋ค๋ฃจ๋์ง ์์๋ณด์.
-
ํ ๋ฐ์ดํฐ๋ฅผ ํํํ๋ ๋ฐฉ์์ด ํ๋๊ฐ ์๋ ๋ ์ด๋ฐ ๋ฐ์ดํฐ๋ค์ ๋ฐ์๋ค์ฌ ์ ํด์ง ์ฐ์ฐ์ ํด ๋ผ ์ ์๋๋ก ์ ์๋ ํ๋ก์์ ๋ฅผ ๋งํ๋ค.
-
ํ์ ํ์(type tag)
- ์ผ๋ฐํ๋ ํ๋ก์์ ๋ฅผ ์ ์ํ ๋ ์ฃผ๋ก ์ฐ๋ ๊ธฐ๋ฒ์ผ๋ก ๋ฐ์ดํฐ ์์ ๊ทธํํ ๋ฐฉ์์ ์๋ ค์ฃผ๋ ๊ธ๊ท๋ก ํ์ ํ์(type tag)๋ฅผ ๋ถ์ฌ์ ํ๋ก์์ ๊ฐ ๊ทธ ํ์๋ฅผ ์ฝ๊ณ ๊ทธ์ ๋ง์ถ์ด ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋๋ก ํ๋ ๊ฒ.
-
- ๋จ์ํ ๋ณต์์ ์ฐ์ฐ
-
- ์ง๊ฐ ์ขํ์ ๊ทน ์ขํ ํํ์ ์ค๊ณ
-
- ํ์ ํ์์ ๋ฐ์ดํฐ ์ค์ฌ ๋ฐฉ์์ ๋ฐ๋ผ ์ฌ๋ฌ ํํ ๋ฐฉ์์ ๊ฐ์ถ๋ฆผ
-
- ๋ณต์์์ ํํ ๋ฐฉ์์ ๊ฐ๋ฆฌ์ง ์๊ฒ ์ผ๋ฐํ ๋ ๊ณ ๋ฅด๊ฐ๋ฅผ ์ ์, ๋ณต์์ ์ฐ์ฐ์ ์ ์

- ๊ฐ๋ก๋ก ๊ทธ์ ๊ฒฝ๊ณ๋ ์์ธต์ ์ฐ์ฐ๊ณผ ์๋์ธต์ '''ํํ์ด ๋๋์ด ์์'''์ ๋ณด์ฌ์ค๋ค.
- ์ธ๋ก๋ก ๊ทธ์ ์์ฝ์ ๊ฒฝ๊ณ๋ ํ '''๋ฐ์ดํฐ๋ฅผ ํํํ๋ ๋ฐ ์ฌ๋ฌ ๋ฐฉ์'''์ด ์์ ์ ์๊ณ
- ์ด๋ฅผ '''๋ฐ๋ก ์ค๊ณํ๊ฑฐ๋ ๊ตฌํํ์ฌ ๋ง๋ถ์ฌ ๋ฃ์ ์ ์์'''์ ์๋ ค์ค๋ค.
-
๋จ์ํ ๋ณต์์ ์ฐ์ฐ
-
๋ณต์์
-
์ค์์ ํ์์ถ์ผ๋ก ์ด๋ฃจ์ด์ง ์ด์ฐจ์ ๊ณต๊ฐ์์ ๊ทธ ํ๋ฉด ์์ ๋์ธ ์ ์ ์งํฉ
-
๋ณต์์ ์ฐ์ฐ ๊ตฌํ
-
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)