์ด ๋ฌธ์„œ์˜ ์›๋ณธ์€ ์™ธ๋ถ€ ์œ„ํ‚ค์—์„œ ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค.
(format t "Hello, World!")


1. ๊ฐœ์š”2. ์—ญ์‚ฌ3. ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์— ๋ฏธ์นœ ์˜ํ–ฅ4. ํŠน์ง•
4.1. Atom4.2. ๋ฆฌ์ŠคํŠธ4.3. ๋ฌธ๋ฒ•4.4. Homoiconicity, ๋˜๋Š” Code is data, data is code4.5. ๋žŒ๋‹ค ํ•จ์ˆ˜4.6. ๋งคํฌ๋กœ4.7. Lisp 1, Lisp 2
4.7.1. Lisp 14.7.2. Lisp 2
5. SICP์™€ ๋ฆฌ์Šคํ”„์— ๋Œ€ํ•œ ์˜คํ•ด6. ์ด์•ผ๊ธฐ๊ฑฐ๋ฆฌ7. ๋ฆฌ์Šคํ”„ ์‚ฌํˆฌ๋ฆฌ
7.1. 2๋Œ€ ๋ฆฌ์Šคํ”„ ์‚ฌํˆฌ๋ฆฌ
7.1.1. Common Lisp
7.1.1.1. ์ฃผ์š” ๊ตฌํ˜„์ฒด
7.1.1.1.1. ์ƒ์—…์šฉ ๋ผ์ด์„ ์Šค7.1.1.1.2. ๋ฌด๋ฃŒ ๋ผ์ด์„ ์Šค
7.1.1.2. Quicklisp์™€ asdf
7.1.2. Scheme
7.2. ์œ ๋ช…ํ•œ ๋ฆฌ์Šคํ”„ ์‚ฌํˆฌ๋ฆฌ
8. Lisp ์‚ฌํˆฌ๋ฆฌ ๋น„๊ต9. ์–ธ์–ด์žฅ์• ์˜ ํ•œ ์ข…๋ฅ˜

1. ๊ฐœ์š”[ํŽธ์ง‘]

"LISP์€ ๋ฐ˜ ์„ธ๊ธฐ๊ฐ€ ๋„˜์—ˆ๋Š”๋ฐ๋„ ์—ฌ์ „ํžˆ ๋ณ€์น˜ ์•Š๋Š” ์™„๋ฒฝํ•จ์ด ๋А๊ปด์ ธ."
"์ด ์‹ธ์ดํด์ด ์˜์›ํžˆ ๊ณ„์†๋ ์ง€ ๊ถ๊ธˆํ•˜๋„ค. ์ƒˆ๋กœ์šด ์„ธ๋Œ€์˜ ์ฝ”๋”๋“ค ์ค‘ ๋ช‡ ๋ช…์ด ๋งค๋ฒˆ LISP์„ ์žฌ๋ฐœ๊ฒฌํ•˜๋Š”๊ฑฐ์ง€."
"๋„ค ์•„๋ฒ„์ง€์˜ ๊ด„ํ˜ธ๋“ค์ด๋ž€๋‹ค. ๋” ๊ณ ์ƒํ•œ ์‹œ๋Œ€์— ๊ฑธ๋งž๋Š” ์šฐ์•„ํ•œ ๋ฌด๊ธฐ๋“ค์ด์ง€."

Lots of Irritating Superfluous Parentheses LISt Processor

ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ ํ•œ ์ข…๋ฅ˜. ๋Œ€ํ‘œ์ ์ธ ํ•จ์ˆ˜ํ˜• ์–ธ์–ด์ด๋‹ค.

ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ ์—ญ์‚ฌ๋ฅผ ๋งํ•  ๋•Œ, ํ˜„๋Œ€์˜ ์ปดํ“จํ„ฐ๋ฅผ ์œ„ํ•ด ๋“ฑ์žฅํ•œ ๊ณ ๊ธ‰ ์–ธ์–ด ์ค‘ ๊ฐ€์žฅ ์˜ค๋ž˜๋œ ๊ฒƒ์ด ํฌํŠธ๋ž€์ด๊ณ , ๋‘ ๋ฒˆ์งธ๋กœ ์˜ค๋ž˜๋œ ๊ฒƒ์ด ๋ฐ”๋กœ ์ด ๋ฆฌ์Šคํ”„๋‹ค. ์—ญ์‚ฌ๊ฐ€ ๊ธด ๋งŒํผ, ์†Œ์œ„ Lisp-family๋ผ ๋ถˆ๋ฆฌ๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์‚ฌํˆฌ๋ฆฌ๊ฐ€ ์กด์žฌํ•˜๊ณ , ์ด๊ฒƒ๋“ค์ด ๋„ˆ๋ฌด ๋‹ค์–‘ํ•˜๊ฒŒ ๋‚œ๋ฆฝํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—, ๊ณตํ†ต ํ‘œ์ค€ ๊ทœ๊ฒฉ์„ ๋งŒ๋“ค์–ด 1984๋…„์— ์ปค๋จผ ๋ฆฌ์Šคํ”„(Common Lisp)๊ฐ€ ํƒ„์ƒํ–ˆ๋‹ค. ๋ณดํ†ต ๋ฆฌ์Šคํ”„๋ผ๊ณ  ๋งํ•˜๋ฉด ์ด๋Ÿฌํ•œ ์‚ฌํˆฌ๋ฆฌ๊นŒ์ง€ ๋ชจ๋‘ ํฌํ•จํ•˜๋Š” ์˜๋ฏธ๋กœ ์‚ฌ์šฉ๋œ๋‹ค. ์ตœ์ดˆ ํ‘œ๊ธฐ๋Š” LISP์ด์—ˆ์ง€๋งŒ ์–ด๋А์ƒˆ Lisp์œผ๋กœ ํ‘œ๊ธฐ๋˜๊ธฐ ์‹œ์ž‘ํ–ˆ์œผ๋ฉฐ, ์ง€๊ธˆ์€ Lisp์ด ๋„๋ฆฌ ์“ฐ์ธ๋‹ค.

2. ์—ญ์‚ฌ[ํŽธ์ง‘]

1958๋…„ ๋ฏธ๊ตญ MIT์˜ ์กด ๋งค์นด์‹œ๊ฐ€ ๊ฐœ๋ฐœํ–ˆ๋Š”๋ฐ, ๋‹น์‹œ ๋งค์นด์‹œ๋Š” ์ธ๊ณต์ง€๋Šฅ์„ ์—ฐ๊ตฌํ•˜๋Š” ํ”„๋กœ์ ํŠธ์—์„œ FORTRAN์—์„œ ๋ชฉ๋ก ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์„œ๋ธŒ๋ฃจํ‹ด์˜ ํŒจํ‚ค์ง€๋กœ Fortran List Processing Language(FLPL)์„ ๊ตฌํ˜„ํ•œ๋‹ค. ์ด๊ฒƒ์ด ๋ฆฌ์Šคํ”„์˜ ๋ชจํƒœ๊ฐ€ ๋˜์–ด, 1958๋…„์— ๋ฆฌ์Šคํ”„๊ฐ€ ์„ธ์ƒ์— ๋“ฑ์žฅํ•˜๊ฒŒ ๋œ๋‹ค. ์ดํ›„ ์ƒ๋‹น๊ธฐ๊ฐ„ ๋ฆฌ์Šคํ”„๋Š” ์ธ๊ณต์ง€๋Šฅ ๊ด€๋ จ ์–ธ์–ด๋ผ๋Š” ์ธ์‹์ด ๊ฐ•ํ–ˆ๋Š”๋ฐ, ์ด๋งฅ์Šค(Emacs), AutoCAD ๋“ฑ ์ธ๊ณต์ง€๋Šฅ๊ณผ ์ „ํ˜€ ๊ด€๋ จ์—†๋Š” ๋ถ„์•ผ์—์„œ๋„ ๋ฆฌ์Šคํ”„๊ฐ€ ์‚ฌ์šฉ๋˜๋ฉด์„œ ์ด๋Ÿฌํ•œ ์ธ์‹์ด ๋งŽ์ด ์˜…์–ด์กŒ๋‹ค.

3. ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์— ๋ฏธ์นœ ์˜ํ–ฅ[ํŽธ์ง‘]

์–ธ์–ด ์ž์ฒด๊ฐ€ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ํƒ‘์žฌํ•˜๊ธฐ ๊ฑธ๋งž๊ฒŒ ์œ ์—ฐํ•˜๊ธฐ๋„ ํ•˜๊ณ , ์˜ค๋žซ๋™์•ˆ ํ•™๊ณ„์˜ ํŠน์ • ๋ถ„์•ผ์—์„œ ๊ฑฐ์˜ ํ‘œ์ค€์ ์œผ๋กœ ์‚ฌ์šฉ๋œ ์–ธ์–ด์˜€๊ธฐ ๋•Œ๋ฌธ์—, ๋ฆฌ์Šคํ”„๊ฐ€ ํ›„๋Œ€ ์–ธ์–ด์— ๋ผ์นœ ์˜ํ–ฅ์€ ๋งค์šฐ ํฌ๋‹ค. if-then-else ํ˜•์‹, ์žฌ๊ท€ํ•จ์ˆ˜, ์“ฐ๋ ˆ๊ธฐ์ˆ˜์ง‘, JIT, ๋™์  ํƒ€์ดํ•‘, ๋™์  ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น, ์ผ๊ธ‰ ํ•จ์ˆ˜๊ฐ์ฒด, ์•กํ„ฐ ๋ชจ๋ธ ๋“ฑ ๋ช…๋ นํ˜•์ด๊ณ  ํ•จ์ˆ˜ํ˜•์ด๊ณ ๋ฅผ ๋ถˆ๋ฌธํ•˜๊ณ  ๊ฐ„์ ‘์ ์ธ ์˜ํ–ฅ๊นŒ์ง€ ํฌํ•จํ•˜๋ฉด ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ์ค‘ ๋ฆฌ์Šคํ”„์˜ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š์€ ๊ฒƒ์„ ์ฐพ์•„๋ณด๊ธฐ ํž˜๋“ค ์ •๋„์ด๋‹ค.

4. ํŠน์ง•[ํŽธ์ง‘]

4.1. Atom[ํŽธ์ง‘]

์ดˆ๊ธฐ์˜ ๋ฆฌ์Šคํ”„์— ๋ฐ์ดํ„ฐํ˜•์€ Atom๊ณผ ๋ฆฌ์ŠคํŠธ๋กœ ๊ตฌ๋ถ„๋˜์—ˆ๋‹ค. Atom์€ ์ƒ์ˆ˜๋‚˜ ์‹ฌ๋ณผ์„ ๋œปํ•˜๊ณ , ๋ฆฌ์ŠคํŠธ๋Š” ์ด๋Ÿฌํ•œ Atom ๋˜๋Š” ๋‹ค๋ฅธ ๋ฆฌ์ŠคํŠธ๋ฅผ ์›์†Œ๋กœ ํฌํ•จํ•˜๋ฉฐ ์œ ํ•œํ•œ ๊ธธ์ด๋ฅผ ๊ฐ€์ง„๋‹ค. ์—ฌ๊ธฐ์„œ ๋‘๋“œ๋Ÿฌ์ง€๋Š” ํŠน์ง•์€, Atom์˜ ๊ฐ’์ด ๋ถˆ๋ณ€(immutable)์ด๋ผ๋Š” ์ ์ด๋‹ค.

์ดํ›„ ์—ฌ๋Ÿฌ ๋ฆฌ์Šต ์‚ฌํˆฌ๋ฆฌ๊ฐ€ ๊ฐœ๋ฐœ๋˜๊ณ  ๋ถ„ํ™”๋˜๋Š” ๊ณผ์ •์—์„œ Atom์˜ Immutable ํŠน์„ฑ์ด ์‚ฌ๋ผ์ง€๋Š” ๊ฒฝ์šฐ๋„ ๋งŽ์ด ๋ฐœ์ƒํ–ˆ์œผ๋ฉฐ, ์ด๋Š” ์•„๋งˆ๋„ ์‹ค์šฉ์ ์ธ ๋ชฉ์ ์— ์˜ํ•ด ์ด๋ ‡๊ฒŒ ๋œ ๊ฒƒ์ด ์•„๋‹๊นŒ๋ผ๊ณ  ์ถ”์ธกํ•œ๋‹ค.

4.2. ๋ฆฌ์ŠคํŠธ[ํŽธ์ง‘]

๋ฆฌ์Šคํ”„์—๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐœ์ˆ˜๋ฅผ ์…€ ์ˆ˜ ์žˆ๊ณ  ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ๋ฆฌ์ŠคํŠธ๊ฐ€ ๊ธฐ๋ณธ ์ž๋ฃŒํ˜•์œผ๋กœ ์ฃผ์–ด์ง„๋‹ค. ๋ฆฌ์ŠคํŠธ๋Š” ๊ทธ ์ž์ฒด๋กœ Atom๊ณผ ํ•จ๊ป˜ ๋‹ค๋ฅธ ๋ฆฌ์ŠคํŠธ๊ฐ€ ์›์†Œ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค.

์—ฌ๋‹ด์œผ๋กœ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๋ฆฌ์Šคํ”„ ๋ฐฉ์–ธ์œผ๋กœ ์ง„ํ–‰ํ•˜๊ฒŒ ๋˜๋ฉด ์ฝ”๋”ฉ ๋ถ„๋Ÿ‰์ด ํŒํŒ ์ค„์–ด๋“œ๋Š” ์‹ ์„ธ๊ณ„๋ฅผ ๋ง›๋ณผ ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๋Š” ๋ฆฌ์Šคํ”„๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฆฌ์ŠคํŠธ ์ž๋ฃŒํ˜•์„ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์ธ ๊ฒƒ๋„ ํ•œ ๋ชซ ํ•œ๋‹ค.(Python์œผ๋กœ ํ•ด๋„ ์œ ์‚ฌํ•œ ๊ฒฝํ—˜์„ ํ•  ์ˆ˜ ์žˆ๋‹ค)

4.3. ๋ฌธ๋ฒ•[ํŽธ์ง‘]

๋ฆฌ์Šคํ”„๋Š” ํ‘œํ˜„์‹ ์ง€ํ–ฅ ์–ธ์–ด์ด๋‹ค. ์ฆ‰, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๊ฐ€๋Šฅํ•˜๋‹ค.

(+ 1 (if t 2 3)) ;=> 3
t ๋Š” ๋ฆฌ์Šคํ”„์—์„œ ์ฐธ๊ฐ’์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ’์ด๋‹ค(ํƒ€์–ธ์–ด์—์„œ True ๋˜๋Š” true ์™€ ๊ฐ™์Œ)
ํ‘œํ˜„์‹(expression) ์ง€ํ–ฅ ์–ธ์–ด์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ์‹์€ ๊ฐ’์„ ๊ฐ€์ง„๋‹ค.

๋˜๋‹ค๋ฅธ ํŠน์ง•์œผ๋กœ ๋ฆฌ์Šคํ”„๋Š” ํ•จ์ˆ˜๋ฅผ ์ผ๊ธ‰๊ฐ์ฒด(first-class object)๋กœ ๋‹ค๋ฃฌ๋‹ค. ์ฆ‰, ํ•จ์ˆ˜๋ฅผ ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ๋ฐ›์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ฆฌํ„ด๊ฐ’์œผ๋กœ ์ง€์ •ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ๋˜ํ•œ ๋Ÿฐํƒ€์ž„์‹œ์— ์ƒ์„ฑํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

(sort '(3 2 1) #'<) ;=> (1 2 3)
(mapcar #'(lambda (x) (1+ x)) '(1 2 3)) ;=> (2 3 4)


๋˜ํ•œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ „์œ„ ํ‘œ๊ธฐ๋ฒ•(Prefix Notation)์„ ์‚ฌ์šฉํ•œ๋‹ค. ์ฆ‰, ํ†ต์ƒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ 1+2 ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋˜๋Š”๋ฐ

1 + 2

๋ฆฌ์Šคํ”„์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด +์ด ์ œ์ผ ์•ž์— ๋‚˜์˜ค๊ณ  ์ˆซ์ž๊ฐ€ ๋’ค์— ํ‘œ๊ธฐ๋˜๋Š” ํ˜•์‹์„ ์ทจํ•œ๋‹ค. ์ด๋Š” +๋ผ๋Š” ํ•จ์ˆ˜์— ์ˆซ์ž 1๊ณผ 2์ธ ์ธ์ž๋ฅผ ์ฃผ์–ด ํ˜ธ์ถœํ•จ์„ ๋œปํ•œ๋‹ค.

(+ 1 2)


์ด์™€ ๊ฐ™์ด ๊ด„ํ˜ธ์™€ Atom์„ ์‚ฌ์šฉํ•˜์—ฌ ํ‘œ๊ธฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฆฌ์Šคํ”„์—์„œ๋Š” S-Expression(Symbolic Expression) ์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ์ด๊ฒƒ ๋•Œ๋ฌธ์— ๋ฆฌ์Šคํ”„์˜ ์†Œ์Šค ์ฝ”๋“œ๋Š” ์ค‘์ฒฉ๊ด„ํ˜ธ์˜ ์—ฐ์†์ด ๋œ๋‹ค. ํ•˜์ง€๋งŒ ํŽธ์ง‘๊ธฐ(Emacs + SLIME)์—์„œ ์ž๋™์œผ๋กœ ์ง์ด๋งž๋Š” ๊ด„ํ˜ธ๋ฅผ ํ‘œ์‹œํ•ด์ฃผ๊ณ , ๋“ค์—ฌ์“ฐ๊ธฐ๋„ ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ์ฝ”๋”ฉ์— ์žˆ์–ด์„  ๋ณ„๋‹ค๋ฅธ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š๋Š”๋‹ค.

M-Expression(Meta Expression)์ด๋ผ๋Š” ๊ฒƒ์ด ์ดˆ๊ธฐ ๋ฆฌ์Šคํ”„์— ์กด์žฌํ–ˆ๋Š”๋ฐ, ์ด๊ฒƒ์€ ์ผ๋ฐ˜์ ์ธ ์ ˆ์ฐจํ˜• ์–ธ์–ด์—์„œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ตฌ๋ฌธ์„ ๋– ์˜ฌ๋ฆฌ๋ฉด ๋œ๋‹ค. ๋ฆฌ์Šคํ”„๋ฅผ ์ตœ์ดˆ๋กœ ๊ตฌ์ƒํ•œ MIT ์ธ๊ณต์ง€๋Šฅ ๋žฉ์˜ ๋งค์นด์‹œ๋Š” ํฌํŠธ๋ž€ ๋“ฑ ์ฃผ๋ณ€์˜ ์—ฌ๋Ÿฌ ์–ธ์–ด์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ฆฌ์Šคํ”„๋ฅผ M-Expression ์œผ๋กœ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์—ฐ๊ตฌ์— ๋ชฐ๋‘ํ–ˆ์ง€๋งŒ ๋ณ„๋‹ค๋ฅธ ์ง„์ „์ด ์—†์—ˆ๊ณ  ๊ทธ ์™€์ค‘์— M-exp ๋ณด๋‹ค S-exp ๋ฅผ ๋” ์„ ํ˜ธํ•˜๋Š” ์‹ ์„ธ๋Œ€ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋“ค์ด ๋‚˜ํƒ€๋‚จ์œผ๋กœ์จ ๊ทธ๋ƒฅ M-S ์น˜ํ™˜ ์—ฐ๊ตฌ๋ฅผ ํฌ๊ธฐํ•˜์˜€๋‹ค. ๋ณด๋‹ค ์ž์„ธํ•œ ์ •๋ณด๋Š” History of Lisp, ์ฐธ๊ณ ๋กœ ์œ„์— ์–ธ๊ธ‰ํ•œ ๋‚ด์šฉ์€ ๋งˆ์ง€๋ง‰ ๋ฌธ๋‹จ์— ์žˆ๋‹ค.

4.4. Homoiconicity, ๋˜๋Š” Code is data, data is code[ํŽธ์ง‘]

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

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

๋ฆฌ์Šคํ”„๊ฐ€ ์•„๋‹Œ ์–ธ์–ด ์ค‘์—๋„ ๋ฌผ๋ก  ์ด๋Ÿฐ ํŠน์„ฑ์„ ๊ฐ€์ง„ ์–ธ์–ด๋Š” ์กด์žฌํ•œ๋‹ค.io๊ฐ™์€ ์–ธ์–ด๊ฐ€ ์ด๋Ÿฌํ•œ ํŠน์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์•„๋ฌด๋„ ์•ˆ ์“ฐ๊ณ  ์žˆ๋‹ค Julia ์–ธ์–ด๋„ ์ด ํŠน์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

4.5. ๋žŒ๋‹ค ํ•จ์ˆ˜[ํŽธ์ง‘]

์‚ฌ์‹ค ๋ฆฌ์Šคํ”„๋Š” Lambda Calculus๋ฅผ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ํ˜•ํƒœ๋กœ ๊ตฌํ˜„ํ•œ ๊ฒƒ์— ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•œ ๊ฒƒ์— ์ง€๋‚˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์†Œ์œ„ ์ต๋ช… ํ•จ์ˆ˜๋ฅผ ๋œปํ•˜๋Š” Lambda Function ๋„ ์ •์˜ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ์ž์ฒด๋งŒ์œผ๋กœ๋Š” "ํ‘œํ˜„ ๊ฐ€๋Šฅ"ํ•˜๋‹ค๋Š” ๊ฒƒ ์™ธ์— ์˜๋ฏธ๊ฐ€ ์—†์ง€๋งŒ ๋ฆฌ์Šคํ”„ ๊ณ„ํ†ต ์–ธ์–ด์—์„œ ์ฃผ์–ด์ง€๋Š” ๊ธฐ๋ณธ ํ•จ์ˆ˜๋‚˜ API ๋“ค์ด ์ด๋ฅผ ์ ๊ทน ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋”ฉ ๋…ธ๊ฐ€๋‹ค๋ฅผ ์ค„์ด๋ฉด์„œ ๋™์‹œ์— ํŽธ๋ฆฌํ•˜๊ฒŒ ์ฝ”๋”ฉ์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๊ฐ•๋ ฅํ•œ ์š”์†Œ์ด๋‹ค.

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

4.6. ๋งคํฌ๋กœ[ํŽธ์ง‘]

๋ฆฌ์Šคํ”„์˜ ๋‹๋ณด์ด๋Š” ํŠน์ง• ์ค‘ ํ•˜๋‚˜๋กœ ๋งคํฌ๋กœ๊ฐ€ ์žˆ๋‹ค. ์ด๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋ฉด ์›ํ•˜๋Š” ๋ฐ”์— ๋”ฐ๋ผ ํ•จ์ˆ˜ํ˜•์œผ๋กœ๋„, ์ ˆ์ฐจํ˜•์œผ๋กœ๋„, OOP๋กœ๋„, ๋…ผ๋ฆฌํ˜•์œผ๋กœ๋„ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋“ค์˜ ์šฐ์›”๊ฐ์ด ์ฉ”๊ธฐ๋กœ ์œ ๋ช…ํ•˜๋‹ค

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

๋ฆฌ์Šคํ”„์˜ ํŠน์„ฑ๊ณผ ๋งž๋ฌผ๋ฆฐ ์ด ๊ธฐ๋Šฅ์ด ๋„ˆ๋ฌด๋‚˜ ๊ฐ•๋ ฅํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋ฆฌ์Šคํ”„๋Š” (์ž๊ธฐ์ž์‹ ์„) ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด(Programmable programming language[1])๋ผ๊ณ ๋„ ๋ถˆ๋ฆฌ๋ฉฐ, ๋งคํฌ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ๋ฆฌ์Šคํ”„ ๋‚ด์—์„œ ์ƒˆ๋กœ์šด ๋ฌธ๋ฒ•์„ ์ •์˜ํ•˜๋ฉฐ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•  ์ •๋„๋กœ ๊ฐ•๋ ฅํ•˜๋‹ค. ๋”ฐ๋ผ์„œ ์ƒˆ๋กœ์šด ํŒจ๋Ÿฌ๋‹ค์ž„์ด ๋‚˜ํƒ€๋‚˜๋„ ๋ฆฌ์Šคํ”„ ๋‚ด์—์„œ ๊ทธ ๊ธฐ๋Šฅ์„ ๋งคํฌ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„ ํ›„, ๋™์ผํ•œ ๋ฆฌ์Šคํ”„ ์–ธ์–ด๋กœ, ๋™์ผํ•œ ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์–ผ๋งˆ๋“ ์ง€ ๊ฐ€๋Šฅํ•˜๋‹ค.[2] ๋ฆฌ์Šคํ”„๋กœ ๋งŒ๋“ค์–ด์ง„ ํ”„๋กœ๊ทธ๋žจ๋“ค๋„ ์ด๋Ÿฐ ํŠน์ง•์„ ์ด์–ด๋ฐ›๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์€๋ฐ, ๋ฆฌ์Šคํ”„์˜ ์ด๋Ÿฐ ํŠน์ง•์„ ํ•œ๊ณ„๊นŒ์ง€ ๋Œ์–ด๋‚ธ ์ด๋งฅ์Šค๋„ ์ž์ฒด ๊ธฐ๋Šฅ์„ ๊ฑฐ์˜ ์ „๋ถ€ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ ์—๋””ํ„ฐ๊ฐ€ ์•„๋‹ˆ๋ผ ๊ทธ๋ƒฅ ๊ฑฐ๋Œ€ํ•œ ๋ฆฌ์Šคํ”„ ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋ผ๋Š” ํ‰๊ฐ€๋ฅผ ๋ฐ›๋Š”๋‹ค.(...)

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

๊ทธ๋ฆฌ๊ณ , ์„ฑ๋Šฅ์ƒ์˜ ๋ฌธ์ œ๋‚˜ ๊ธฐํƒ€ ๋‹ค๋ฅธ ์ด์œ  ๋•Œ๋ฌธ์— ๋งคํฌ๋กœ๊ฐ€ ์—†๋Š” ๊ตฌํ˜„์ฒด๋„ ๊ฝค ๋งŽ์ด ์กด์žฌํ•œ๋‹ค.

4.7. Lisp 1, Lisp 2[ํŽธ์ง‘]

4.7.1. Lisp 1[ํŽธ์ง‘]

์ดˆ๊ธฐ์˜ ๋ฆฌ์Šคํ”„๋Š” ๋ณดํ†ต ๋งํ•˜๋Š” ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜์˜ ์ด๋ฆ„์ด ๊ฒน์น  ์ˆ˜ ์—†์—ˆ๋‹ค. ์ฆ‰, ํ•จ์ˆ˜์— ์‚ฌ์šฉ๋˜๋Š” ์‹ฌ๋ณผ๊ณผ ๊ฐ’์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ์‹ฌ๋ณผ์ด ๊ฒน์น  ์ˆ˜ ์—†์—ˆ๋‹ค. ์š”์ฆ˜ ์‹์œผ๋กœ ํ‘œํ˜„ํ•˜๋ฉด ๋‘˜์ด ๊ฐ™์€ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์ด ์•ˆ๋œ๋‹ค. ๋‹ค์Œ์€ Lisp 1์ธ Clojure ์˜ˆ์ œ ์ฝ”๋“œ๋กœ, a์— ๊ฐ’ 4๋ฅผ ํ• ๋‹นํ•˜๊ณ , ์ดํ›„ 2๋ฅผ ๊ณฑํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•œ ํ›„ aํ•จ์ˆ˜์— ๊ฐ’ a์˜ ์‹ฌ๋ณผ์„ ๋„˜๊ฒจ์„œ ํ˜ธ์ถœ์„ ์‹œ๋„ํ•˜๋Š” ์ฝ”๋“œ์ด๋‹ค. Clojure๋Š” Lisp 1์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‹น์—ฐํžˆ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.


user=> (def a 4)
#'user/a
;; ์•„๋žซ์ค„์—์„œ ์‹ฌ๋ณผ a ๋Š” (fn [x] (* x 2)) ํ•จ์ˆ˜๋กœ ๋ฐ”๋€๋‹ค.
user=> (defn a [x] (* x 2))
#'user/a
user=> (a a)

ClassCastException user$a cannot be cast to java.lang.Number  clojure.lang.Numbers.multiply (Numbers.java:146) 
;; ํ•จ์ˆ˜์ธ a๋ฅผ ๋ฐ›์•„์„œ *๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” clojure.lang.Number.multiply์— ์ „๋‹ฌํ–ˆ์œผ๋ฏ€๋กœ, ์ž๋™์œผ๋กœ ํ˜•๋ณ€ํ™˜์„ ํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

4.7.2. Lisp 2[ํŽธ์ง‘]

1966๋…„์— ์ œ์•ˆ๋œ ๊ฐœ๋…์œผ๋กœ, Lisp 1๊ณผ ๋‹ฌ๋ฆฌ ํ•จ์ˆ˜ ์‹ฌ๋ณผ๊ณผ ๊ฐ’ ์‹ฌ๋ณผ์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ๋ถ„๋ฆฌ์‹œ์ผฐ๋‹ค. ์ด๊ฒƒ์ด Common Lisp ํ‘œ์ค€ ์‚ฌ์–‘์— ํฌํ•จ๋˜๋ฉด์„œ ๋„๋ฆฌ ์•Œ๋ ค์ง€๊ฒŒ ๋˜์—ˆ๋‹ค. ๋‹ค์Œ ์˜ˆ์ œ ์ฝ”๋“œ๋Š” ์œ„์˜ Clojure ์˜ˆ์ œ์™€ ๋™์ผํ•œ ๋‚ด์šฉ์˜ ์ฝ”๋“œ๋กœ, Common Lisp์—์„œ ์•„๋ฌด๋Ÿฐ ๋ฌธ์ œ ์—†์ด ์‹คํ–‰๋œ๋‹ค.


[1]> (setq a 4)
4
[2]> (defun a (x) (* x 2))
A
[3]> (a a)
8


ํ•˜์ง€๋งŒ ํ•ด๋‹น ์‹ฌ๋ณผ์ด ํ•จ์ˆ˜ ์‹ฌ๋ณผ์ž„์„ ๋‚˜ํƒ€๋‚ด๋Š” #'์„ ๋ถ™์—ฌ์„œ a๋ฅผ ๋„˜๊ธฐ๋ฉด Clojure์™€ ์œ ์‚ฌํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

[4]> (a #'a)

*** - *: #<FUNCTION A (X) (DECLARE (SYSTEM::IN-DEFUN A)) (BLOCK A (* X 2))> is
      not a number
The following restarts are available:
USE-VALUE      :R1      Input a value to be used instead.
ABORT          :R2      Abort main loop
Break 1 [5]> 

5. SICP์™€ ๋ฆฌ์Šคํ”„์— ๋Œ€ํ•œ ์˜คํ•ด[ํŽธ์ง‘]

Structure and Interpretation of Computer Programs, ์ผ๋ช… SICP๋Š” ์ปดํ“จํ„ฐ ๊ณผํ•™ ์ž…๋ฌธ์„œ์ด๋ฉฐ, Stream, Continuation, Closure ๋“ฑ ๋งค์šฐ ๊ธฐ์ดˆ์ ์ด๊ณ  ๊ธฐ๋ณธ์ ์ธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฐœ๋…์„ ์‹ฌ๋„์žˆ๊ฒŒ ๊ณต๋ถ€ํ•  ์ˆ˜ ์žˆ๋Š” ๋ช…์ €์ด๋‹ค. ๊ทธ๋Ÿฐ๋ฐ, ์ฑ…์—์„œ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๊ฐ€ ๋ฆฌ์Šคํ”„์˜ ์‚ฌํˆฌ๋ฆฌ์ค‘ ํ•˜๋‚˜์ธ Scheme์ด๋‹ค. ๋”ฐ๋ผ์„œ ๋ฆฌ์Šคํ”„๋ฅผ ์ž˜ ํ•˜๋ ค๋ฉด ์ด ์ฑ…์„ ๋ฐ˜๋“œ์‹œ ๊ณต๋ถ€ํ•ด์•ผ๋งŒ ํ•  ๊ฒƒ ๊ฐ™์€ ๋А๋‚Œ์„ ์ฃผ๊ณ , ์‹ค์ œ๋กœ ๋ฆฌ์Šคํ”„๋ฅผ ๊ณต๋ถ€ํ•˜๊ธฐ ์œ„ํ•ด ์ด ์ฑ…์„ ์ฐพ๋Š” ์‚ฌ๋žŒ๋„ ๋งŽ๋‹ค.

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

MIT์—์„œ๋Š” 1980๋…„์— ์‹œ์ž‘๋œ 6.001 SICP ๊ฐ•์˜๊ฐ€ 2008๋…„์— 6.01 "Introduction to Electrical Engineering and Computer Science I" ๊ฐ•์˜๋กœ ๋ณ€๊ฒฝ๋˜๋ฉด์„œ Python์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. ๊ฐ•์˜ ๋ชฉ์ ๋„ ์ „์‚ฐํ•™์˜ ๊ธฐ์ดˆ ๊ฐœ๋…์„ ๊ฐ€๋ฅด์น˜๋Š” ๊ฒƒ์—์„œ Python์„ ๊ฐ€๋ฅด์น˜๋Š” ๊ฒƒ์œผ๋กœ ๋ฐ”๋€Œ์—ˆ๋‹ค. ์ด ์‹œ๊ธฐ์—, Scheme์„ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค๋ฅธ ์—ฌ๋Ÿฌ ๊ฐ•์˜๋„ ๋ชจ๋‘ Python์„ ์“ฐ๋Š” ๊ฒƒ์œผ๋กœ ๋ฐ”๋€Œ์—ˆ๋‹ค๊ณ  ํ•œ๋‹ค. ๋‚˜์ค‘์—, ์ด์ „์˜ 6.001๊ณผ ๊ฐ™์€ ๊ณผ๋ชฉ์ด๋ฉด์„œ Scheme์„ ์‚ฌ์šฉํ•˜๋Š” 6.037์ด 2011๋…„ ์‹œ์ž‘๋˜์—ˆ๋‹ค.

Gerald Sussman์ด ์ง์ ‘ ๋ฐํžŒ Scheme์„ ์‚ฌ์šฉํ•˜๋Š” MIT์˜ 6.001์ด Python ์„ ์‚ฌ์šฉํ•˜๋Š” 6.01๋กœ ๋ฐ”๋€ ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. (1) Sussman๊ณผ Hal Abelson์€ 1980๋…„๋Œ€๋ถ€ํ„ฐ ๊ฐ€๋ฅด์ณ ์˜จ ์ด ๊ณผ๋ชฉ์— ๋Œ€ํ•ด ํ”ผ๋กœ๊ฐ์„ ๋А๊ผˆ๊ณ , 1997๋…„์— ํ•™๊ณผ์žฅ ์‚ฌ๋ฌด์‹ค๋กœ ์ฐพ์•„๊ฐ€์„œ "์ด ๊ณผ๋ชฉ์„ ๋” ์ด์ƒ ๊ฐ€๋ฅด์น˜์ง€ ์•Š๊ฒ ๋‹ค"๋Š” ์˜๊ฒฌ์„ ์ „๋‹ฌํ–ˆ๋‹ค๊ณ  ํ•œ๋‹ค. (2) ๋”์šฑ์ด, SICP ์ปค๋ฆฌํ˜๋Ÿผ์ด ๋” ์ด์ƒ ์˜ค๋Š˜๋‚ ์˜ ์—”์ง€๋‹ˆ์–ด๋ง์— ์ ํ•ฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋ผ๊ณ  ์„ค๋ช…ํ–ˆ๋‹ค.

Sussman์ด ์„ค๋ช…ํ•˜๋Š” ์˜ค๋Š˜๋‚ ์˜ ์—”์ง€๋‹ˆ์–ด๋Š”, ์™„๋ฒฝํ•˜๊ฒŒ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•œ(๋•Œ๋กœ๋Š” ์ƒ์—…์  ๋ณดํ˜ธ์ •์ฑ…์— ์˜ํ•ด ๋‚ด๋ถ€๊ฐ€ ๊ณต๊ฐœ๋˜์ง€ ์•Š์•„์„œ ์™„๋ฒฝํ•˜๊ฒŒ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•œ) ๋งค์šฐ ๋ณต์žกํ•œ ํ•˜๋“œ์›จ์–ด๋ฅผ ์œ„ํ•œ ์ฝ”๋“œ๋ฅผ ๋ฐ˜๋ณต์ ์œผ๋กœ ์ž‘์„ฑํ•œ๋‹ค. ์†Œํ”„ํŠธ์›จ์–ด ๋˜ํ•œ ๋ฐฉ๋Œ€ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์†Œํ”„ํŠธ์›จ์–ด์ชฝ๋„ ํ•˜๋“œ์›จ์–ด์™€ ๋™์ผํ•œ ํ™˜๊ฒฝ์— ์ฒ˜ํ•ด์žˆ๋‹ค. Sussman์€ ์ž์‹ ์ด ๊ฐ€๋ฅด์น˜๋˜ ํ•™์ƒ๋“ค์ด ์ด๋Ÿฌํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์„ ์—ฎ์–ด์„œ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋งค๋‰ด์–ผ์„ ์ฝ๋Š” ๋ฐ์— ๋Œ€๋ถ€๋ถ„์˜ ์‹œ๊ฐ„์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋ณด์•„์™”๋‹ค๊ณ  ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์ž‘๊ณ  ๋‹จ์ˆœํ•œ ๋ถ€๋ถ„๋“ค์„ ์‚ฌ์šฉํ•˜์—ฌ ํฐ ์‹œ์Šคํ…œ์„ ๋งŒ๋“œ๋Š” SICP์˜ "ํ•ฉ์„ฑ์„ ํ†ตํ•œ ๋ถ„์„(analysis-by-synthesis)" ๊ด€์ ์€ ๋” ์ด์ƒ ์œ ํšจํ•˜์ง€ ์•Š๊ฒŒ ๋˜์—ˆ๋‹ค๊ณ  ํ•œ๋‹ค. ์˜ค๋Š˜๋‚ ์—๋Š” ์ผ๋‹จ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๊ธฐ๋Šฅ์„ ์‹คํ–‰ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€๋ฅผ ๊ด€์ฐฐํ•˜๊ณ , ์ด๋ฅผ ์—”์ง€๋‹ˆ์–ด๊ฐ€ ์›ํ•˜๋Š” ์˜๋„๋Œ€๋กœ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ๊ณ ๋ฏผํ•˜๊ฒŒ ๋˜๋Š” ์‹(poking๋ฐฉ์‹)์œผ๋กœ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์ž‘์„ฑํ•˜๊ฒŒ ๋œ๋‹ค๊ณ  ํ•œ๋‹ค. (์ฐธ์กฐ)

๋ฆฌ์Šคํ”„ ์ž์ฒด ๋˜๋Š” ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ดํ•ดํ•˜๋Š” ๋ฐ์—๋Š” SICP๋ณด๋‹ค๋Š” John Allen, "Anatomy of Lisp", McGraw-Hill, 1980 (ISBN: 978-0070011151)์ด ๋” ๋‚˜์€ ์„ ํƒ์ผ ์ˆ˜ ์žˆ๋‹ค.

6. ์ด์•ผ๊ธฐ๊ฑฐ๋ฆฌ[ํŽธ์ง‘]

๋ฆฌ์Šคํ”„์™€ ๊ด€๋ จ๋œ ๊ฒฉ์–ธ(?)์œผ๋กœ Greenspun's tenth rule์ด๋ผ๋Š” ๊ฒŒ ์žˆ๋‹ค.[3]
Any sufficiently complicated C or Fortran program contains an ad hoc, informally-specified, bug-ridden, slow implementation of half of Common Lisp.
์„ค๋ช…ํ•˜์ž๋ฉด, ์ปค๋จผ ๋ฆฌ์Šคํ”„์˜ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ๋“ค์€ ํ”„๋กœ๊ทธ๋žจ์ด ์–ด๋А์ •๋„ ๋ณต์žกํ•ด์ง€๋ฉด ์–ด๋”˜๊ฐ€์— ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•˜๊ฒŒ ๋˜๊ณ , ๊ทธ๋Ÿฐ ๊ธฐ๋Šฅ์„ ๊ฐ–๊ณ ์žˆ์ง€ ์•Š์€ C์™€ ๊ฐ™์€ ์–ธ์–ด๋กœ ๊ทธ๋Ÿฐ ๋ณต์žกํ•œ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค๋ฉด, ๊ฒฐ๊ตญ ๋ณธ์ธ๋„ ๋ชจ๋ฅด๋Š” ์‚ฌ์ด์— ์ปค๋จผ ๋ฆฌ์Šคํ”„์˜ ๊ทธ๋Ÿฐ ๊ธฐ๋Šฅ์„ C ์–ธ์–ด๋กœ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ๊ฒŒ ๋˜๋ฉฐ, ๋‹น์—ฐํžˆ ๊ทธ๋Ÿฐ ์ฆ‰ํฅ์ (?) ๊ตฌํ˜„์€ ์˜ค๋žœ ์‹œ๊ฐ„์— ๊ฑธ์ณ ์ž˜ ๋””์ž์ธ๋œ ์ปค๋จผ ๋ฆฌ์Šคํ”„์— ๋น„ํ•ด ์งˆ์ ์œผ๋กœ ๋–จ์–ด์งˆ์ˆ˜๋ฐ–์— ์—†๋‹ค๋Š” ์†Œ๋ฆฌ. ๋ญ”๊ฐ€ ์˜ค๋งŒํ•œ ๊ฒƒ ๊ฐ™์€๋ฐ, ๋ฆฌ์Šคํ”„ ์ฑ… ๋ช‡ ๊ถŒ ๋ณด๋ฉด ์ •๋ง ๋ฆฌ์Šคํ”„ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋“ค์˜ ์ฝง๋Œ€๋Š” ํ•˜๋Š˜์„ ๋šซ๋Š” ๊ฒƒ์„ ์‰ฝ๊ฒŒ ์•Œ ์ˆ˜ ์žˆ๋‹ค

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

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

๋Œ€๋ถ€๋ถ„์˜ ์˜ค๋ž˜๋œ ์–ธ์–ด๋“ค์ด ๊ทธ๋ ‡๋“ฏ, ์ ์  ์ธ๊ธฐ๊ฐ€ ์‚ฌ๊ทธ๋ผ๋“œ๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ธ๋ฐ, ๋ฆฌ์Šคํ”„๋Š” ์˜คํžˆ๋ ค 2000๋…„๋Œ€ ๋“ค์–ด ๊ณ ์ „์˜ ํ–ฅ์ˆ˜๋ฅผ ๋А๋ผ๋ ค๋Š”(?) ์ Š์€ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋“ค๊ณผ, ๊ธฐ์กด OOP์™€ ์ ˆ์ฐจํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ ํ•œ๊ณ„๋ฅผ ๋А๋‚€ ๊ฐœ๋ฐœ์ž๋“ค์— ์˜ํ•ด ์ธ๊ธฐ๋ฅผ ๋Œ๊ณ  ๋ถ€ํ™œํ•˜์˜€๋‹ค. ๊ทธ ์ธ๊ธฐ์˜ ์ค‘์‹ฌ์—๋Š” ์‹ค์šฉ์„ฑ์„ ์ค‘์‹ฌ์œผ๋กœ C++์ฒ˜๋Ÿผ ์–ธ์–ด๋ฅผ ์—„์ฒญ๋‚˜๊ฒŒ ๊ฑฐ๋Œ€ํ•˜๊ฒŒ ํ‚ค์šด ์ปค๋จผ ๋ฆฌ์Šคํ”„์™€ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ์ค‘์ ์„ ๋‘” ์ž‘์€ ์–ธ์–ด์ธ ์Šคํ‚ด(Scheme)์ด ์žˆ๋‹ค. ๋ณดํ†ต ์‹ค์ œ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์ปค๋จผ ๋ฆฌ์Šคํ”„๊ฐ€ ์ฃผ๋กœ ์‚ฌ์šฉ๋˜์—ˆ๊ณ , ๋Œ€ํ•™์ด๋‚˜ ๊ธฐํƒ€ ๊ต์œก ๋ชฉ์ ์œผ๋กœ๋Š” ์Šคํ‚ด์ด ๋งŽ์ด ์‚ฌ์šฉ๋˜์—ˆ๋‹ค.

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

์ด์™€ ๋ณ„๋„๋กœ 2007๋…„์— ๊ฐ‘ํˆญํŠ€ํ•˜์—ฌ Java Virtual Machine ์œ„์—์„œ ๋Œ์•„๊ฐ€๋„๋ก ๋งŒ๋“ค์–ด์ ธ ์ž๋ฐ”์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ทธ๋Œ€๋กœ ๋Œ์–ด๋‹ค ์“ฐ๋ฉด์„œ ์ž๋ฐ”๋ณด๋‹ค ๋†’์€ ์ƒ์‚ฐ์„ฑ์„ ์ž๋ž‘ํ•˜๋Š” ํด๋กœ์ €(Clojure)๊ฐ€ ์žˆ๋‹ค.

๋ฆฌ์Šคํ”„๋Š” ๋„ˆ๋ฌด๋‚˜ ๋งŽ์€ ์‚ฌํˆฌ๋ฆฌ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋ณดํ†ต "๋ฆฌ์Šคํ”„ ์ปค๋ฎค๋‹ˆํ‹ฐ"๋ผ๊ณ  ๋ถ€๋ฅผ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋Œ€์‹  "์ปค๋จผ ๋ฆฌ์Šคํ”„ ์ปค๋ฎค๋‹ˆํ‹ฐ", "์Šคํ‚ด ์ปค๋ฎค๋‹ˆํ‹ฐ", "๋ž˜ํ‚ท ์ปค๋ฎค๋‹ˆํ‹ฐ" ๋“ฑ ๋งŽ์ด ์“ฐ์ด๋Š” ์‚ฌํˆฌ๋ฆฌ์˜ ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ๋”ฐ๋กœ ์กด์žฌํ•œ๋‹ค. ๋‹น์—ฐํ•˜๊ฒŒ๋„, ์ธํ„ฐ๋„ท์—์„œ ๊ฒ€์ƒ‰ํ•ด์„œ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ์ž๋ฃŒ ๋˜ํ•œ ์ด ํ•ญ๋ชฉ๊ณผ ๊ฐ™์ด ๋ฆฌ์Šคํ”„ ์ „๋ฐ˜์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ๋ฉด, ์ด๋Ÿฐ ์‹์œผ๋กœ ํŠน์ • ๋ฐฉ์–ธ์— ์†ํ•˜๋Š” ๋ฆฌ์Šคํ”„์— ๋Œ€ํ•œ ๊ฒƒ์ด ๋Œ€๋ถ€๋ถ„์ด๋‹ค. ํ•˜์ง€๋งŒ ํ•œ๊ตญ์—์„œ ๋ฆฌ์Šคํ”„ ๊ณ„์—ด ์–ธ์–ด๋Š” ๋งค์šฐ ๋งˆ์ด๋„ˆํ•œ ์–ธ์–ด์— ์†ํ•˜๋ฉฐ, ๋”ฐ๋ผ์„œ "๋ฆฌ์Šคํ”„ ์ปค๋ฎค๋‹ˆํ‹ฐ"๋ผ๋Š” ์ œ๋ชฉ ์•„๋ž˜์— ๋ฆฌ์Šคํ”„์˜ ์—ฌ๋Ÿฌ ์‚ฌํˆฌ๋ฆฌ์— ๋Œ€ํ•ด ๋…ผ์˜๋˜๋Š” ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ๊ทน์†Œ์ˆ˜ ์กด์žฌํ•œ๋‹ค.

์˜๋ฌธ๊ถŒ ๋ฆฌ์Šคํ”„ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋“ค์€ ์˜ˆ/์•„๋‹ˆ์˜ค ๊ตฌ๋ฌธ์ธ P๋ฅผ ์ผ์ƒ์ƒํ™œ์— ์ด์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•˜๋‹ค๊ณ  ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด:
Q: "Foodp" (๋ฐฅ๋จน์„๋ž˜?)
A: "T" (True = ์‘.)
A: "NIL" (False = ์•„๋‹ˆ.)

7. ๋ฆฌ์Šคํ”„ ์‚ฌํˆฌ๋ฆฌ[ํŽธ์ง‘]

7.1. 2๋Œ€ ๋ฆฌ์Šคํ”„ ์‚ฌํˆฌ๋ฆฌ[ํŽธ์ง‘]

ํ˜„์žฌ ๊ฐ€์žฅ ์œ ๋ช…ํ•˜๋ฉด์„œ ๋งŽ์ด ์“ฐ์ด๋Š” ๋ฆฌ์Šคํ”„ ์‚ฌํˆฌ๋ฆฌ๋Š” ๋‹ค์Œ 2๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ตœ๊ทผ ์‚ฌ์šฉ๋Ÿ‰๊ณผ ์ธ๊ธฐ๋„๋Š” ๊ฐ‘ํˆญํŠ€ํ•œ Clojureํ•œํ…Œ ๋ฐ€๋ฆฌ๋Š” ๊ฒƒ ๊ฐ™๊ธฐ๋„ ํ•˜๋‹ค

7.1.1. Common Lisp[ํŽธ์ง‘]

๋Œ€ํ‘œ์ ์ธ Lisp-2. ๊ธฐ์กด์— ๋‚œ๋ฆฝํ•˜๋˜ ์—ฌ๋Ÿฌ ๋ฆฌ์Šคํ”„ ๊ตฌํ˜„์ฒด์˜ ์ŠคํŽ™์„ ํ‘œ์ค€ํ™”ํ•˜๋ฉด์„œ ๋™์‹œ์— ๋‹ค์–‘ํ•œ ๊ฐœ๋…์„ ์†Œํ™”ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฉ€ํ‹ฐ ํŒจ๋Ÿฌ๋‹ค์ž„ ์–ธ์–ด๋กœ ์„ค๊ณ„๋˜์–ด 1984๋…„์— ํ‘œ์ค€์•ˆ์ด ๋ฐœํ‘œ๋˜์—ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  1994๋…„์— ๊ฐœ์ •๋œ ๊ฒƒ์ด ANSI ํ‘œ์ค€์œผ๋กœ ์ฑ„ํƒ๋œ๋‹ค.

Common Lisp๋Š” ๋‹ค๋ชฉ์ , ๋ฉ€ํ‹ฐ ํŒจ๋Ÿฌ๋‹ค์ž„ ์–ธ์–ด๋กœ ์ ˆ์ฐจํ˜•, ํ•จ์ˆ˜ํ˜•, OOP๋ฅผ ๋ชจ๋‘ ์ง€์›ํ•˜๋Š” ๋‹ค์ด๋‚ด๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ ํ‘œ์ค€์•ˆ์ด๋‹ค. ์ฆ‰ ์ด ์ž์ฒด๋กœ๋Š” ๊ทธ๋ƒฅ ์–ธ์–ด ์‚ฌ์–‘์ผ ๋ฟ์ด๋‹ค.

๋”ฐ๋ผ์„œ ์ด ํ‘œ์ค€ ์‚ฌ์–‘์— ๊ทผ๊ฑฐํ•˜์—ฌ ๋‹ค์–‘ํ•œ ๊ตฌํ˜„์ด ๋“ฑ์žฅํ–ˆ๋Š”๋ฐ, ๋‹น์—ฐํžˆ ๊ตฌํ˜„์ฒด๋ณ„๋กœ ๊ธฐ๋Šฅ์„ ์กฐ๊ธˆ์”ฉ ํ™•์žฅํ•˜์—ฌ ๋‹ค๋ฅธ ๋ถ€๋ถ„์ด ์กด์žฌํ•˜๋ฉฐ, ์ด๋Ÿฌํ•œ ํŠน์„ฑ์„ ๊ณ ๋ คํ•˜์—ฌ ์–ด๋А ๊ตฌํ˜„์ฒด๋ฅผ ์‚ฌ์šฉํ•  ์ง€ ๊ฒฐ์ •ํ•ด์•ผ ํ•œ๋‹ค.
7.1.1.1. ์ฃผ์š” ๊ตฌํ˜„์ฒด[ํŽธ์ง‘]
๊ด„ํ˜ธ ์•ˆ์˜ ์†Œ๋ฌธ์ž ์•ฝ์นญ์€ Common Lisp ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ํ•ด๋‹น ๊ตฌํ˜„์ฒด๋ฅผ ์–ธ๊ธ‰ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์•ฝ์นญ์ด๋‹ค.

๊ธฐ๊ณ„์–ด ๋ฐ”์ด๋„ˆ๋ฆฌ ๊ตฌํ˜„์ฒด๋Š” ๋Œ€๋ถ€๋ถ„ Foreign Function Interface(FFI)๋ฅผ ์ง€์›ํ•˜์—ฌ ์ด๋ฏธ ์กด์žฌํ•˜๋Š” *.so, *.dll, *.dylib ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. Java Virtual Machine์—์„œ ๋™์ž‘ํ•˜๋Š” ๊ตฌํ˜„์ฒด๋Š” JNI์™€ ๋”๋ถˆ์–ด Java Native Acces๊ฐ€ ๋“ฑ์žฅํ•˜์—ฌ ์ด์ „๋ณด๋‹ค ํŽธ๋ฆฌํ•˜๊ฒŒ ํ”Œ๋žซํผ์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๊ณ„์–ด ์ž์›์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฌผ๋ก  ์—ฌ๊ธฐ์— ์†Œ๊ฐœ๋˜์ง€ ์•Š์€ ๊ตฌํ˜„์ฒด๋„ ์–ผ๋งˆ๋“ ์ง€ ์กด์žฌํ•œ๋‹ค.
7.1.1.1.1. ์ƒ์—…์šฉ ๋ผ์ด์„ ์Šค[ํŽธ์ง‘]
7.1.1.1.2. ๋ฌด๋ฃŒ ๋ผ์ด์„ ์Šค[ํŽธ์ง‘]
  • Armed Bear Common Lisp(abcl): JVM ์œ„์—์„œ ๋™์ž‘ํ•˜๋Š” Common Lisp.
  • Clozure CL(ccl): Macintosh Common Lisp์˜ Fork์—์„œ ์‹œ์ž‘ํ•œ ๊ตฌํ˜„์ฒด. ํ˜„์žฌ๋Š” ๋‹ค๋ฅธ Unix ๊ณ„์—ด ์šด์˜์ฒด์ œ๋‚˜ Windows ๋„ ์ง€์›ํ•œ๋‹ค. Clojure์™€๋Š” ๋‹ค๋ฅด๋‹ค! Clojure์™€๋Š”!!
  • GNU Common Lisp(clisp): ๋ฐ”์ดํŠธ ์ฝ”๋“œ(์ž๋ฐ”์˜ ๊ทธ๊ฒƒ๊ณผ๋Š” ๋‹ค๋ฅด๋‹ค. CPython๋„ ์ผ๋‹จ ์ปดํŒŒ์ผ ์ž์ฒด๋Š” ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋กœ ๋œ๋‹ค) ํ˜•ํƒœ๋กœ ์ปดํŒŒ์ผํ•˜์—ฌ ์‹คํ–‰๋˜๋Š” ๊ตฌํ˜„์ฒด. ์•„์ง๊นŒ์ง€ Thread ์ง€์›์ด ์ œํ•œ์ ์ด๋‹ค. ๋‹ค๋ฅด๊ฒŒ ์‹œ์ž‘๋œ GNU CL(gcl)์ด๋ผ๋Š” ๊ตฌํ˜„์ฒด๊ฐ€ ์žˆ์œผ๋ฉฐ, ์ด๊ฒƒ๊ณผ ํ—ท๊ฐˆ๋ฆฌ๋ฉด ์•ˆ๋œ๋‹ค.
  • CMUCL(cmucl): ์นด๋„ค๊ธฐ ๋ฉœ๋ก  ๋Œ€ํ•™์—์„œ ์‹œ์ž‘๋œ ๊ตฌํ˜„์ฒด. ์œˆ๋„์šฐ๋Š” ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค. Thread๋„ ์ง€์›๋˜์ง€ ์•Š๋Š”๋‹ค.
  • Embeddable Common Lisp(ecl): C์–ธ์–ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ œ์ž‘๋œ ํ”„๋กœ๊ทธ๋žจ์— ์ž„๋ฒ ๋”ฉํ•˜์—ฌ ์‚ฌ์šฉ๋  ๋ชฉ์ ์œผ๋กœ ํƒ„์ƒํ–ˆ๋‹ค. ์ฆ‰ ์ด๊ฒƒ์„ C ํ”„๋กœ๊ทธ๋žจ ๋‚ด๋ถ€์—์„œ ๋ถˆ๋Ÿฌ์™€ ์‚ฌ์šฉํ•˜๋ฉด ๋ฆฌ์Šคํ”„ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰์‹œํ‚ฌ ์ˆ˜๋„, ์กฐ๊ธˆ ๋‹ค๋ฅด๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ํ•ด๋‹น C ํ”„๋กœ๊ทธ๋žจ์ด ์Šคํฌ๋ฆฝํŠธ๋กœ ๋ฆฌ์Šคํ”„๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ManKai Common Lisp(mkcl): ecl์˜ ๋ธŒ๋žœ์น˜๋กœ, ecl์˜ ์—ฌ๋Ÿฌ ๋ถ€๋ถ„์„ ์žฌ์ž‘์„ฑํ•˜์—ฌ ecl๋ณด๋‹ค ์•ˆ์ •์„ฑ์„ ๋†’์ธ ๊ตฌํ˜„์ฒด.
  • Steel Bank Common Lisp(sbcl): cmucl์˜ ๋ธŒ๋žœ์น˜๋กœ ๊ด€๋ฆฌ, ์šด์˜ ํŠน์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚จ ๊ตฌํ˜„์ฒด. ๋‹น์—ฐํžˆ cmucl์ด ๋™์ž‘ํ•˜๋Š” ๋ชจ๋“  ํ™˜๊ฒฝ์—์„œ ๋™์ž‘ํ•˜๋ฉฐ, ์‹คํ—˜์ ์œผ๋กœ ์œˆ๋„์šฐ ํ™˜๊ฒฝ๋„ ์ง€์›ํ•˜๋ฉฐ ๋น ๋ฅธ ์‹คํ–‰ ์†๋„๋กœ ์œ ๋ช…ํ•˜๋‹ค. ๋ฆฌ๋ˆ…์Šค์—์„œ๋งŒ Thread๋ฅผ ์™„์ „ํ•˜๊ฒŒ ์ง€์›ํ•˜๋ฉฐ ๋‹ค๋ฅธ ํ”Œ๋žซํผ์—์„œ๋Š” ์•„์ง ์‹คํ—˜๋‹จ๊ณ„์ด๋‹ค.
  • XCL(xcl): abcl์˜ ์ œ์ž‘์ž๊ฐ€ ๋งŒ๋“œ๋Š” ๋˜ ๋‹ค๋ฅธ ๊ตฌํ˜„์ฒด. abcl๊ณผ๋Š” ๋‹ฌ๋ฆฌ ํƒ€๊ฒŸ ํ”Œ๋žซํผ์˜ ๊ธฐ๊ณ„์–ด๋กœ ๋™์ž‘ํ•œ๋‹ค.
7.1.1.2. Quicklisp์™€ asdf[ํŽธ์ง‘]
Common Lisp๋ฅผ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒจํ‚ค์ง€ ์‹œ์Šคํ…œ๊ณผ ๋นŒ๋“œ ์‹œ์Šคํ…œ์ด ์กด์žฌํ•œ๋‹ค. Quicklisp์€ ์ธํ„ฐ๋„ท์„ ํ†ตํ•œ ํŒจํ‚ค์ง€๋ฅผ ๋ฐฐํฌํ•˜์—ฌ ํŽธ๋ฆฌํ•˜๊ฒŒ ๋ฐ›์„ ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“  ์‹œ์Šคํ…œ์ด๋ฉฐ, asdf๋Š” ์ผ์ข…์˜ ๋นŒ๋“œ ํˆด์ด๋‹ค.

7.1.2. Scheme[ํŽธ์ง‘]

๋Œ€ํ‘œ์ ์ธ Lisp-1 ์ด๋‹ค.

7.2. ์œ ๋ช…ํ•œ ๋ฆฌ์Šคํ”„ ์‚ฌํˆฌ๋ฆฌ[ํŽธ์ง‘]

  • AutoLISP, VisualLisp - AutoCAD์— ๋‚ด์žฅ๋˜์–ด ์ผ๋ถ€ ๋ณ€ํ˜•๋œ ๋ฆฌ์Šคํ”„. ์‹ค์šฉ์ ์œผ๋กœ ๋ฆฌ์Šคํ”„๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ๋Œ€ํ‘œ์ ์ธ ์˜ˆ.
  • Clojure - JVM ์œ„์—์„œ ์šด์šฉ๋˜๋ฉฐ, Lisp ๊ณ„์—ด ์–ธ์–ด์˜ ๊ฐ„๊ฒฐํ•จ๊ณผ ๊ฐ•๋ ฅํ•จ, JVM์˜ ์ด์‹์„ฑ์„ ๊ฐ€์ง€๋ฉฐ ์–ธ์–ด์—์„œ ์ง€์›ํ•˜๋Š” Software Transactional Memory(STM)๊ณผ ์ž˜ ์ถ”์ƒํ™”๋œ ๊ด€๋ จ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•œ ๋น„๊ต์  ์‰ฌ์šด ๋ณ‘ํ–‰์„ฑ ๊ตฌํ˜„,[5] ์ „์šฉ Build Tool์ธ Leiningen[6]๊ณผ Maven Repository๊ฐ€ ๊ฒฐํ•ฉํ•˜์—ฌ ํŽธ๋ฆฌํ•œ Build, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ๊ณผ ๊ด€๋ฆฌ, Jenkins, Travis ๋“ฑ์˜ CI์™€ ์—ฐ๋™์ด ์‰ฝ๊ณ , Java๋ฅผ ์ง€์›ํ•˜๋Š” ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค์— ์‰ฝ๊ฒŒ ์˜ฌ๋ฆด ์ˆ˜ ์žˆ๋Š” ๋“ฑ์˜ ์žฅ์ ์œผ๋กœ ์ตœ๊ทผ ์ฃผ๋ชฉ๋ฐ›๊ณ  ์žˆ๋‹ค. 20์„ธ๊ธฐ ์Šคํƒ€์ผ์„ ์œ ์ง€ํ•˜๋ฉด์„œ ์ตœ์ฒจ๋‹จ ๋ณด์กฐ๋„๊ตฌ๋ฅผ ๋‹ฌ๊ณ  ๋‚˜์˜จ 21์„ธ๊ธฐํ˜• Lisp ๋ฐฉ์–ธ์ผ์ง€๋„. ๋งค์šฐ ๋ณด์ˆ˜์ ์ธ ๊ธˆ์œต๊ณ„์—์„œ ์œ ๋ณ„๋‚˜๊ฒŒ ์‹ ๊ธฐ์ˆ  ๋„์ž…์— ์ ๊ทน์ ์ธ ์”จํ‹ฐ์€ํ–‰ ๋ณธ์‚ฌ์—์„œ Clojure๋ฅผ ๋„์ž…ํ•ด ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ๋ฐํ˜”๋‹ค.
  • Emacs Lisp (elisp) - ์ด๋งฅ์Šค์˜ ๊ธฐ๋ฐ˜. Lisp-2์ด๋ฉฐ, Lisp ๊ณ„์—ด ์–ธ์–ด๋ฅผ ์ฝ”๋”ฉํ•˜๋Š”๋ฐ Emacs ๋ณด๋‹ค ์ข‹์€ ํˆด์€ 21์„ธ๊ธฐ์—๋„ ๊ทธ๋‹ค์ง€ ๋งŽ์ง€ ์•Š๋‹ค. ์•„์ด๋Ÿฌ๋‹ˆํ•˜์ง€๋งŒ, Lisp ๋ฐฉ์–ธ์ด ์•„๋ฌด๋ฆฌ ๋งŽ๋”๋ผ๋„ ๊ฒฐ๊ตญ ๊ทธ๋“ค์ค‘ ๋Œ€๋‹ค์ˆ˜๊ฐ€ ๊ณตํ†ต์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์—๋””ํ„ฐ๋Š” ๊ฒฐ๊ตญ ์ด๋งฅ์Šค์ด๊ณ , ์ด๋งฅ์Šค ํŠน์ง•์ƒ elisp์„ ๋ชจ๋ฅด๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ๋Š” ์ข€ ๊ฑฐ์‹œ๊ธฐํ•˜๋‹ค๋ณด๋‹ˆ Lisp ๋ฐฉ์–ธ ์ค‘ ๊ฐ€์žฅ ๋งŽ์€ ์‚ฌ์šฉ์ž๋ฅผ ํ™•๋ณดํ•˜๊ณ  ์žˆ๋Š” ์–ธ์–ด์ด๊ธฐ๋„ ํ•˜๋‹ค.
  • EuLisp - ์œ ๋Ÿฝ ๋ฒ„์ „์˜ Lisp. Lisp ํ‘œ์ค€์˜ ๊ถŒ์œ„์ž ์ค‘ ํ•œ๋ช…์ธ Kent Pitman์˜ ํšŒ๊ณ ์— ์˜ํ•˜๋ฉด, Common Lisp์ด ๋งŒ๋“ค์–ด์งˆ ๋‹น์‹œ, uucp(unix-2-unix copy) ๋กœ ์„œ๋กœ ์†Œํ†ต์„ ํ–ˆ์—ˆ๋Š”๋ฐ, ์•„๋ฌด๋ž˜๋„ ๊ตญ์ œ ๋„คํŠธ์›Œํฌ๊ฐ€ ํ™œ์„ฑํ™”๋˜์ง€ ์•Š์•„์„œ ๋Œ€๋ฅ™๊ฐ„ ๋ฉ”์‹œ์ง€๊ฐ€ ์˜ค๊ฐ€๋Š”๋ฐ ๋ฉฐ์น  ์ด์ƒ์”ฉ ์†Œ์š”๋˜์—ˆ๊ณ , ๋•๋ถ„์— ์•„์‹œ์•„(ํŠนํžˆ ์ผ๋ณธ)์™€ ์œ ๋Ÿฝ์€ ๋…ผ์˜์—์„œ ๊ฑฐ์˜ ๋ฐฐ์ œ๋˜์—ˆ๋‹ค๊ณ  ํ•œ๋‹ค. ์ด ๋•Œ๋ฌธ์— ๊ธฐ๋ถ„๋‚˜๋ป์„œ ์œ ๋Ÿฝ ์ž์ฒด์ ์œผ๋กœ ๋งŒ๋“ค์–ด ๋“ฑ์žฅํ•œ Lisp์ด๋ผ๊ณ ๋„ ํ•˜๋Š”๋ฐ, Lisp-1์ด๋ฉฐ Common Lisp์€ ๊ณผ๊ฑฐ(ํ•˜์œ„ํ˜ธํ™˜)์— ๋ฐœ๋ชฉ์„ ์žกํ˜”๊ณ , Scheme์€ ๋„ˆ๋ฌด ์ž‘์œผ๋‹ˆ ๊ทธ ์ค‘๊ฐ„ ์ •๋„๋ฅผ ๋…ธ๋ฆฌ๊ณ  ๋งŒ๋“ค์–ด์กŒ๋‹ค๊ณ  ํ•œ๋‹ค.
  • ISLISP - ISO ํ‘œ์ค€์˜ LISP์ด๋‹ค. ๋‹ค๋งŒ, ISO์—์„œ LISP ํ‘œ์ค€์„ ์ •์˜ํ•˜๋ ค ํ•œ ๊ฒƒ์€ ์•„๋‹ˆ๊ณ  ๊ทธ๋ƒฅ ISLISP์˜ ํ‘œ์ค€์ด ISO์—์„œ ๋งŒ๋“ค์–ด์กŒ๋‹ค๊ณ  ๋ด์•ผ ํ•œ๋‹ค. LISP์˜ ์ฐฝ์‹œ์ž์ธ ์กด ๋งค์นด์‹œ ๊ต์ˆ˜๊ฐ€ LISP์„ ํ•˜๋‚˜์˜ ํ‘œ์ค€์œผ๋กœ ๊ฐ€๋‘๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•˜์ง€ ์•Š์•˜๊ธฐ๋•Œ๋ฌธ์— LISP์˜ ISO ํ‘œ์ค€์ด ์•„๋‹Œ, ISLISP ๋ฐฉ์–ธ์˜ ISO ํ‘œ์ค€์œผ๋กœ ํ•ด๋‹ฌ๋ผ๊ณ  ์ง์ ‘์ ์œผ๋กœ ์š”์ฒญํ–ˆ๋‹ค๊ณ  ํ•œ๋‹ค.[7] Lisp-2์ด๋ฉฐ, ์—ฌ๋Ÿฌ ๋ฐฉ์–ธ์ธ Common Lisp, Scheme, EuLisp, Le Lisp์— ๊ณตํ†ต์ ์œผ๋กœ ๋“ค์–ด๊ฐ„ ๊ต์ง‘ํ•ฉ ์œ„์ฃผ๋กœ ๋ฌถ์–ด์„œ ์–ธ์–ด๋ฅผ ๋งŒ๋“ค๊ณ  ํ‘œ์ค€ํ™”๋ฅผ ์‹œํ‚จ๋‹ค๊ณ  ํ•œ๋‹ค.
  • Javelin - ์Šคํฌ๋ฆฝํŒ…์— ์ ํ•ฉํ•œ JVM ๊ธฐ๋ฐ˜ Lisp. ๊ณต์‹ ์‚ฌ์ดํŠธ
  • Le Lisp - ํ”„๋ž‘์Šค์˜ ์œ ๋ช…ํ•œ ์ „์‚ฐํ•™ ์—ฐ๊ตฌ์†Œ์ธ INRIA์—์„œ ๋งŒ๋“ค์–ด์ง„ Lisp ๋ฐฉ์–ธ.
  • newLISP - Perl์ด๋‚˜ Python์ฒ˜๋Ÿผ ํŽธ๋ฆฌํ•˜๊ฒŒ ์“ธ ์ˆ˜ ์žˆ๋Š” ์Šคํฌ๋ฆฝํŠธ ์–ธ์–ด. ๊ณต์‹ ์‚ฌ์ดํŠธ
  • Racket - ๊ต์œก์šฉ์œผ๋กœ ๋งŽ์ด ์“ฐ์ด๋Š” ์Šคํ‚ด ๋ฐฉ์–ธ์œผ๋กœ, ๋ฆฌ์Šคํ”„๋ฅผ ๋ฐฐ์šฐ๊ธฐ ๊ฐ€์žฅ ํŽธํ•œ ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•œ๋‹ค. ์‹ค์ œ๋กœ ์œˆ๋„์šฐ, ๋งฅ, ์œ ๋‹‰์Šค ๊ณ„์—ด์— ๋‹ค ํ˜ธํ™˜๋˜๋Š” IDE๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ, ๊ฑฐ๊ธฐ์— GUI, ๋„คํŠธ์›Œํฌ ๋“ฑ ์›ฌ๋งŒํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋„ ๋‹ค ํฌํ•จ๋˜์–ด์žˆ๊ณ ,(Batteries Included!) ์‹ค์ œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ ๊ธฐ๋ณธ์ ์ธ ๊ฐœ๋…์€ ๋น„์Šทํ•˜๋ฉด์„œ, ๋…ธ๊ฐ€๋‹ค๊ฐ€ ๋  ์ˆ˜ ์žˆ๋Š” ๋ถ€์ฐจ์ ์ธ ๊ธฐ๋Šฅ๋“ค์„ ๋‹จ์ˆœํ™”์‹œํ‚จ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ต์œก์šฉ ๋ชจ๋“ˆ๊นŒ์ง€ ๋”ฐ๋กœ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค. Realm of Racket์ด๋ผ๋Š” ๊ต์žฌ๋ฅผ ๋ณด๋ฉด, ์ค‘๊ณ ๊ต์ƒ ๋Œ€์ƒ์˜ ๊ธฐ์ดˆ์ ์ธ ์ˆ˜์ค€์ด๊ธด ํ•˜์ง€๋งŒ ์Šคํ‚ด ๋ฌธ๋ฒ•๊ณผ GUI, ๋„คํŠธ์›Œํฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ, ์ธ๊ณต์ง€๋Šฅ ๋“ฑ์„ ๊ฒŒ์ž„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์‹ค์Šต์„ ํ†ตํ•ด ๊ฒจ์šฐ 300ํŽ˜์ด์ง€ ์ดํ•˜์˜ ๋ถ„๋Ÿ‰์œผ๋กœ ์„ค๋ช…ํ•˜๊ณ  ์žˆ๋‹ค! ์‚ฌ์‹ค, ๋ฆฌ์Šคํ”„๋ผ๋Š” ์–ธ์–ด ์ž์ฒด๊ฐ€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋ฅผ ๋งŒ๋“ค๊ธฐ ํŽธ๋ฆฌํ•œ ์–ธ์–ด์ด๊ธฐ๋„ ํ•˜๊ณ , Racket์€ ์Šคํ‚ด์˜ ์ €๋Ÿฐ ์–ธ์–ด ์ž์ฒด์˜ ํ™•์žฅ์„ฑ์„ ๋‹ค์†Œ ๊ทน๋‹จ์ ์ธ ๋ ˆ๋ฒจ๋กœ ๋Œ์–ด์˜ฌ๋ฆฐ ์–ธ์–ด์ด๊ธฐ์— ๊ฐ€๋Šฅํ•œ ๊ฒƒ.

8. Lisp ์‚ฌํˆฌ๋ฆฌ ๋น„๊ต[ํŽธ์ง‘]

9. ์–ธ์–ด์žฅ์• ์˜ ํ•œ ์ข…๋ฅ˜[ํŽธ์ง‘]

์ผ๋ช… ํ˜€์งง์€ ์†Œ๋ฆฌ. ใ……๊ณผ ๊ฐ™์€ ๋‹จ์„ค์Œ ๋ฐœ์Œ์„ ๋ชปํ•˜๋Š” ์–ธ์–ด ์žฅ์• ์ด๋‹ค. ์งˆ๋ณ‘ ์ฝ”๋“œ๋Š” F80.8
[1] C ์–ธ์–ด๊ฐ€ ์œ ๋‹‰์Šค๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ํƒ„์ƒํ•œ ์–ธ์–ด๋ผ๋ฉด, LISP ์€ LISP์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ํƒ„์ƒํ•œ ์–ธ์–ด๋ผ๋Š” ๋†๋‹ด๋„ ์žˆ๋‹ค.
[2] ์–ด์ฐจํ”ผ ๋ชจ๋“  ๋ฒ”์šฉ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋Š” ํŠœ๋ง ์™„์ „ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋Šฅ๋ฉด์—์„œ๋Š” ๋™์ผํ•˜๋‹ค. ์ƒˆ๋กœ์šด ํŒจ๋Ÿฌ๋‹ค์ž„์˜ ์–ธ์–ด๊ฐ€ ๋“ฑ์žฅํ•œ๋‹ค๊ณ  ํ•ด์„œ ์ „์— ์—†๋˜ ์™„์ „ํžˆ ์ƒˆ๋กœ์šด ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๊ณ , ๊ทธ์ € ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ์‹์ด ๋ฐ”๋€Œ๋Š” ๊ฒƒ ๋ฟ์ด๋ฉฐ ๋ฆฌ์Šคํ”„๋Š” ์–ธ์–ด ์ž์ฒด๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ด๋Ÿฌํ•œ ํŠน์ง•์„ ์ด์šฉํ•˜์—ฌ ์ƒˆ๋กœ์šด ํ‘œํ˜„ ๋ฐฉ์‹, ๋ฌธ๋ฒ• ๋“ฑ์„ embedding ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ๋ฌผ๋ก  ์ด๋Ÿด ๊ฒฝ์šฐ, ํ•ญ์ƒ ์‹คํ–‰ ํšจ์œจ๊ณผ ์„ฑ๋Šฅ์ด ์ข‹๋‹ค๊ณ  ๋ณด์žฅํ•  ์ˆ˜ ์—†๋‹ค. ๊ตฌํ˜„ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š”๋ฐ ์˜์˜๊ฐ€ ์žˆ๋‹ค. ์ฆ‰ ๋งคํฌ๋กœ๋ฅผ ์“ฐ๋ ค๋ฉด ์ž˜ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.
[3] Greenspun์˜ 10๋ฒˆ์งธ ๋ฒ•์น™. Greenspun์˜ ๋ง์— ์˜ํ•˜๋ฉด, 1-9๋ฒˆ์งธ ๋ฒ•์น™์ด ์žˆ์ง€๋Š” ์•Š๊ณ  ๊ทธ๋ƒฅ 10๋ฒˆ์งธ ๋ฒ•์น™์ด๋ผ ํ•˜๋ฉด ๊ธฐ์–ต์— ์ž˜ ๋‚จ์„ ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ–ˆ๋‹ค๊ณ  ํ•œ๋‹ค. [์ถœ์ฒ˜]
[4] ๊ทธ๋ž˜์„œ, ๊ธฐ์กด์—๋„ ์Šคํ‚ด ์ปดํŒŒ์ผ๋Ÿฌ๋“ค์€ ํ‘œ์ค€์ ์ธ ๋ถ€๋ถ„ ์ด์™ธ์— ๋‹ค๋“ค ๋‚˜๋ฆ„์˜ ๊ฝค ์ปค๋‹ค๋ž€ ํ™•์žฅ์„ ๊ฐ™์ด ํƒ‘์žฌํ•ด์„œ ๋ฐฐํฌํ–ˆ์—ˆ๋‹ค. ์ด๋Ÿฐ ๊ฒฝํ–ฅ์ด ๋ฐ˜์˜๋œ ํƒ“์ธ์ง€, ์ตœ๊ทผ์˜ ํ‘œ์ค€์ธ R6RS๋ถ€ํ„ฐ๋Š” ๋”์ด์ƒ ์ž‘๋‹ค๊ณ  ๋ณด๊ธด ํž˜๋“ค์–ด์กŒ๋Š”๋ฐ, ์Šคํ‚ด ์œ„์›ํšŒ์ชฝ์—์„œ ์ด๋Ÿฐ ๊ฒฝํ–ฅ์— ๋ฐ˜๋ฐœ์„ธ๋ ฅ๋„ ๊ฝค ์žˆ๋˜ ํƒ“์ธ์ง€, ์ด์ œ๋Š” ์•„์˜ˆ small scheme, large scheme ๋‘ ๊ฐ€์ง€ ํ‘œ์ค€์„ ์šด์˜ํ•˜๋Š”์‹์œผ๋กœ ๋ฐ”๋€Œ์–ด ๋ฒ„๋ ธ๋‹ค.
[5] ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ๊ธฐ์ˆ ์ ์ธ ๋‚œ์ด๋„๋กœ ๊ฐ€์žฅ ์–ด๋ ค์šด ๊ฒƒ์œผ๋กœ ๊ผฝ๋Š” ๊ฒƒ ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋ฐ”๋กœ ์ด๊ฒƒ์ด๋‹ค. ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๋‚˜ ์“ฐ๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ํ•œ ๊ณณ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ์“ธ ๋•Œ, ํ†ต์ œ๋ฅผ ์•ˆํ•˜๋ฉด ๋‹น์—ฐํžˆ ๊ฐ’์ด ์—‰๋ง์ด ๋˜๋Š”๋ฐ, ํ†ต์ œํ•˜๋Š” ๊ฒŒ ์–ด๋ ค์šธ ๋ฟ๋”๋Ÿฌ ์„ฑ๊ณตํ•ด๋„ ์ œ๋Œ€๋กœ ๋ชป ํ•˜๋ฉด ์„ฑ๋Šฅ์ด ๊ทน์•…์œผ๋กœ ๋–จ์–ด์ง„๋‹ค. ์ด๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ž˜ ํ•˜๋Š” ๊ฒƒ์ด ๊ด€๊ฑด์ด๋‹ค.
[6] ์ด๋ฆ„์€ 'Leiningen Versus the Ants'๋ผ๋Š” ๋‹จํŽธ์†Œ์„ค์—์„œ ๋”ฐ์˜จ ๋“ฏํ•˜๋‹ค. ์ฐธ๊ณ ๋กœ ์ž๋ฐ”์˜ ๋Œ€ํ‘œ์ ์ธ ๋นŒ๋“œ ํˆด์ด Ant์ด๋‹ค.
[7] ์ฐธ๊ณ ๋กœ, ๋งค์นด์‹œ ๊ต์ˆ˜๋Š” ANSI Common Lisp์˜ ์ŠคํŽ™์ด ๋งŒ๋“ค์–ด์งˆ ๋•Œ๋„ ๋น„์Šทํ•œ ์š”์ฒญ์„ ํ–ˆ๋‹ค๊ณ  ํ•œ๋‹ค.