์ด ๋ฌธ์„œ์˜ ์›๋ณธ์€ ์™ธ๋ถ€ ์œ„ํ‚ค์—์„œ ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค.

(display "Hello, world!") (newline)


1. ๊ฐœ์š”2. ํŠน์ง•3. ์ข…๋ฅ˜4. ๊ธฐํƒ€

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

Lisp ๊ณ„์—ด์˜ ์–ธ์–ด ์ค‘ ์ฝ”๋จผ ๋ฆฌ์Šคํ”„(Common Lisp)์™€ ํ•จ๊ป˜ ๊ฐ€์žฅ ์œ ๋ช…ํ•˜๊ณ  ๋Œ€ํ‘œ์ ์ธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์ด๋‹ค. ๋‹ค๋ฅธ ๋ฆฌ์Šคํ”„ ๊ณ„์—ด[1]๋ณด๋‹ค ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ ๊ทน ์žฅ๋ คํ•˜๋Š” ์–ธ์–ด๋กœ, ์–ธ์–ด ํ‘œ์ค€์— ์ˆœ์ˆ˜ ํ•จ์ˆ˜ํ˜•์—์„œ ๋ฒ—์–ด๋‚˜๋Š” ํ•จ์ˆ˜ ์ด๋ฆ„ ๋’ค์—๋Š” ๊ผญ "!"๋ฅผ ๋ถ™์ด๋Š” ๊ฒƒ์„ ๊ด€๋ก€๋กœ ๋ช…์‹œํ•  ์ •๋„์ด๋‹ค.[2] ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋ณด๋‹ค ๋” ํ•ต์‹ฌ์ ์ธ ํŠน์ง•์€ ์ตœ์†Œํ•œ์˜ ๊ธฐ๋ณธ ๋ช…๋ น๋งŒ ๊ธฐ๊ณ„์–ด๋กœ ์ •์˜๊ฐ€ ๋˜์–ด์žˆ๊ณ , ์–ธ์–ด ํ‘œ์ค€์— ๋ช…์‹œ๋œ ๋‹ค๋ฅธ ๋ช…๋ น๋“ค์€ ๊ธฐ๋ณธ ๋ช…๋ น์— ์†ํ•œ ๋žŒ๋‹ค(lambda)ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ์ •์˜๊ฐ€ ๋˜์–ด์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ด ๋•Œ๋ฌธ์— ์Šคํ‚ด์€ ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์— ๋น„ํ•ด ๋งค์šฐ ์‚ฌ์ด์ฆˆ๊ฐ€ ์ž‘์œผ๋ฉด์„œ๋„, ๊ธฐ๋ณธ๋งŒ ์‚ฌ์šฉํ•ด ํ•„์š”์— ๋”ฐ๋ผ ๋ฌด์—‡์ด๋“  ์ •์˜ํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋…ํŠนํ•œ ๋””์ž์ธ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ์ปค๋จผ ๋ฆฌ์Šคํ”„๋ฅผ 109๊ฐ€์ง€ ๊ธฐ๋Šฅ์ด ๋ถ™์–ด์žˆ๋Š” ๋‹ค๋ชฉ์  ๊ณต๊ตฌ์— ๋น„์œ ํ•˜์ž๋ฉด, ์Šคํ‚ด์€ ๋”ฑ ์ตœ์†Œํ•œ์˜ 10๊ฐœ ๊ธฐ๋Šฅ๋งŒ ๋ถ™์–ด์žˆ๋Š” ๋งฅ๊ฐ€์ด๋ฒ„ ์นผ์— ๋น„์œ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฐ™์€ ๋ฟŒ๋ฆฌ์—์„œ ๋‚˜์˜จ ๋‹ค๋ฅธ ์‚ฌ์ด์ฆˆ์˜ ์–ธ์–ด๋ผ๋Š” ์ ์—์„œ C++์™€ C์˜ ๊ด€๊ณ„์™€๋„ ๋น„์Šทํ• ์ง€๋„ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ, C++์˜ ๊ธฐ๋Šฅ์„ C์—์„œ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด ์˜ค๋งŒ๊ฐ€์ง€ ์‚ฝ์งˆ์„ ํ•ด์•ผํ•˜๋Š”๋ฐ ๋น„ํ•ด ์Šคํ‚ด์€ ์ปค๋จผ ๋ฆฌ์Šคํ”„์˜ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ ๊ฐ€๋Šฅํ•œ, Greenspun's Tenth Rule[3]์—์„œ ๊ฐ€์žฅ ์•ˆ์ „ํ•œ ์–ธ์–ด๋ผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ ์‹œ์ดˆ๋Š” ์นผ ํœด์ž‡(Carl Hewitt)์˜ ์•กํ„ฐ(Actor) ๋ชจ๋ธ์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•œ ์‹œ๋„์—์„œ ๋น„๋กฏ๋˜์—ˆ๋‹ค. ์ œ๋Ÿด๋“œ ์„œ์Šค๋จผ(Gerald Sussman)๊ณผ ๊ฐ€์ด ์Šคํ‹ธ ์ฃผ๋‹ˆ์–ด(Guy Steele Jr)๊ฐ€ Maclisp์— ๊ธฐ๋ฐ˜ํ•œ ์ž‘์€ ๋ฆฌ์Šคํ”„ ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋ฅผ ๋งŒ๋“ค๋ฉด์„œ ์•กํ„ฐ ๋ชจ๋ธ์„ ๊ตฌํ˜„ํ•˜๊ณ  ๋ฉ”์‹œ์ง• ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•œ ๊ฒƒ์ด ๋ฐ”๋กœ Scheme์˜ ์‹œ์ดˆ์ด๋‹ค. 1975๋…„ ๋‹น์‹œ ์ด๋ฆ„์€ Schemer์˜€๋Š”๋ฐ, ์ด๋Š” Plannar, Conniver๋“ฑ ๋ฆฌ์Šคํ”„์—์„œ ํŒŒ์ƒ๋œ ๋‹ค๋ฅธ ์–ธ์–ด์˜ ์ด๋ฆ„์ด ~er๋กœ ๋๋‚˜์„œ ์ด๋ฅผ ๋”ฐ๋ผ ๋ช…๋ช…ํ–ˆ๋‹ค๊ณ  ํ•œ๋‹ค. ์ดํ›„ ๊ฐœ๋ฐœ์ž๋“ค์ด ํŒŒ์ผ์ด๋ฆ„๊ณผ ํ™•์žฅ์ž๊ฐ€ ๊ฐ๊ฐ 6๊ธ€์ž๋กœ ์ œํ•œ๋˜๋Š” ITS ์šด์˜์ฒด์ œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ํ˜„์žฌ์˜ ์ด๋ฆ„์ธ Scheme์œผ๋กœ ์ด๋ฆ„์ด ๋ณ€๊ฒฝ๋˜์—ˆ๋‹ค.

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

์—ฌ๊ธฐ์„œ ์Šคํ‚ด์˜ ํ–‰๋ณด๊ฐ€ ์—ฌ๋Ÿฌ ๋ฐฉํ–ฅ์œผ๋กœ ์ฐข์–ด์ง€๊ฒŒ ๋˜๋Š”๋ฐ, ๋Œ€ํ‘œ์ ์œผ๋กœ ๊ทน๋‹จ์ ์œผ๋กœ ๊ฐ„์†Œํ•˜๋ฉด์„œ๋„ ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ์–ธ์–ด๋ฅผ ๊ต์œก์šฉ์œผ๋กœ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๋ฐฉํ–ฅ์€ ์„œ์Šค๋จผ์˜ ๋ช…์ € SICP(Structure and Interpretation of Computer Programs)์—์„œ ๋“œ๋Ÿฌ๋‚œ๋‹ค. ์ด ์ฑ…์€ MIT ์ปดํ“จํ„ฐ ๊ณผํ•™ ์ „๊ณต์˜ ๋™๋ช…์˜ ์ž…๋ฌธ ๊ณผ๋ชฉ ๊ต๊ณผ์„œ๋กœ ์œ ๋ช…ํ•ด์กŒ๊ณ , ํ•œ๋™์•ˆ ๋ฏธ๊ตญ ์ „์—ญ์—์„œ ์ด๋ฅผ ๋”ฐ๋ผ SICP์™€ ์Šคํ‚ด์œผ๋กœ ์ž…๋ฌธ์„ ๊ฐ€๋ฅด์น˜๋Š” ํ•™๊ต๊ฐ€ ๊ฝค ์žˆ์—ˆ๋‹ค.[5][6] ๋ฐ˜๋ฉด์— ํ•œํŽธ์—์„œ๋Š” ์ด ์šฐ์•„ํ•œ ์–ธ์–ด๋ฅผ ์‹ค์ œ๋กœ ์—…๋ฌด์— ์‚ฌ์šฉํ•ด๋ณด๋ ค๋Š” ๋…ธ๋ ฅ์œผ๋กœ, R5RS ํ‘œ์ค€์˜ ์ œ์ • ์ดํ›„ SRFI(Scheme Request for Implementation, ์Šคํ‚ด ๊ตฌํ˜„ ์š”์ฒญ)์„ ํ†ตํ•ด ํ”„๋กœ๊ทธ๋ž˜๋จธ๋“ค์ด ํ•„์š”ํ•œ ๊ธฐ๋Šฅ๋“ค์„ ์š”์ฒญํ•˜๊ณ  ์ง์ ‘ ๊ตฌํ˜„ํ•˜๋Š” ์›€์ง์ž„์ด ํ™œ๋ฐœํ•ด์กŒ๋‹ค. ๊ฐ„๋‹จํ•œ ๊ตฌ์กฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ์„ ์ƒ๊ฐ ์•Š๋Š”๋‹ค๋ฉด ์ทจ๋ฏธ์‚ผ์•„ ๋งŒ๋“ค์–ด๋ณผ๋งŒํ•œ ์‚ฌ์ด์ฆˆ์˜ ์–ธ์–ด์˜€๊ธฐ์— ๊ฐ์ข… ์ปดํŒŒ์ผ๋Ÿฌ์™€ ์ธํ„ฐํ”„๋ฆฌํ„ฐ๊ฐ€ ์šฐํ›„์ฃฝ์ˆœ์ฒ˜๋Ÿผ ์ƒ๊ฒจ๋‚ฌ๊ณ , ๊ฐ๊ฐ์˜ ๋ถ€๋ถ„์€ ํ˜ธํ™˜๋˜๋Š” ๋ถ€๋ถ„์ด ๋งŽ์ง€๋งŒ ์„ธ์„ธํ•œ ๋ฐ์—์„œ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๊ฐ€ ๊ฝค ๋งŽ์•˜๋‹ค.

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

๊ฒฐ๊ตญ ์Šคํ‚ด ์ œ์ • ์œ„์›ํšŒ๋Š” R7RS ํ‘œ์ค€์„ ๊ต์œก์šฉ ๊ธฐ๋ณธ ์–ธ์–ด์™€ ์ด์™€ ํ˜ธํ™˜๋˜๋Š” ์—…๋ฌด์šฉ ๋ฐฉ๋Œ€ํ•œ ์–ธ์–ด๋กœ ๋‚˜๋ˆ„์–ด ๋‘ ํ‘œ์ค€์„ ๋”ฐ๋กœ ์ œ์ •ํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค. ์–ผ๋งˆ ์ „์— ์ƒˆ๋กœ ์ œ์ •๋œ R7RS-small ํ‘œ์ค€์€ R6RS๋ฅผ ์™„์ „ํžˆ ํ‘์—ญ์‚ฌ๋กœ ๋ฌป์–ด๋ฒ„๋ฆฌ๊ณ  R5RS๊ธฐ๋ฐ˜์œผ๋กœ ๋งŒ๋“ค์–ด์กŒ์œผ๋ฉฐ, ์ดํ›„์— ์ œ์ •๋  R7RS-large๋Š” ์ปค๋จผ ๋ฆฌ์Šคํ”„๋ณด๋‹ค ํฐ ๊ทœ๋ชจ์˜ ์–ธ์–ด๋ฅผ ๋ชฉํ‘œ๋กœ ์‚ผ๋Š”๋‹ค๋Š”๋ฐ... ๊ธ€์Ž„, ์œ„์›ํšŒ ์–ธ์–ด๋Š” ๋“€ํฌ ๋ˆ„์ผ ํฌ์—๋ฒ„๋ณด๋‹ค ๋‚˜์˜ค๊ธฐ ํž˜๋“ค๋‹ค. ์–ด์ฐจํ”ผ SRFI ์ƒ๋‹น์ˆ˜๋ฅผ ๊ณต์‹์œผ๋กœ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์ ์ด ๋  ๊ฒƒ์ด๋ผ ํ•˜๋‹ˆ SRFI๊ฐ€ ์ž˜ ์ง€์›๋˜๋Š” ์Šคํ‚ด์„ ์ฐพ์•„๋ณด์ž.

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

์œ„์— ๋งํ–ˆ๋“ฏ์ด ์Šคํ‚ด์€ ์›Œ๋‚™ ํ‘œ์ค€์— ๋”ฐ๋ผ ๋‹ค์–‘ํ•œ ๊ตฌํ˜„์ด ์žˆ๊ณ , ๊ทธ๋งˆ์ €๋„ ํ‘œ์ค€์€ ๊ทธ์ € ๋Œ€์ถฉ ๊ฑฐ์˜ ๋‹ค ์ง€ํ‚ค๋ฉด ๋˜๋Š” ๊ฒƒ. ์ˆ˜์ค€์˜ ์ธ์‹์ด ์žˆ์–ด์„œ ๊ฐ๊ฐ์˜ ๊ตฌํ˜„์ด ์กฐ๊ธˆ์”ฉ ๋‹ค๋ฅธ ์–ธ์–ด๋‚˜ ๋ฐฉ์–ธ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ด€๊ณ„๊ฐ€ ์กฐ๊ธˆ ๋จผ Racket์„ ์ œ์™ธํ•˜๋ฉด, ์Šคํ‚ด์„ ์Šคํ‚ด์œผ๋กœ ๋ฌถ๋Š” ํŠน์„ฑ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
  • Lambda: ์Šคํ‚ด์˜ ๋ฟŒ๋ฆฌ์ธ ๋žŒ๋‹ค์‹. (lambda (x) ...)๋กœ ์Šคํ‚ด์— ์กด์žฌํ•˜๋Š” ๊ฑฐ์˜ ๋ชจ๋“  ๊ฒƒ์„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ๋žŒ๋Œ€ ๋Œ€์ˆ˜์—์„œ์˜ ๊ทธ ๋žŒ๋‹ค ๋งž๋‹ค.
  • Tail-call elimination (TCE): ์œ„์—์„œ ๋‚˜์™”๋“ฏ "ํ•จ์ˆ˜๊ฐ„์— ๊ฐ’์„ ์ฃผ๊ณ ๋ฐ›๋Š” ํ˜•์‹"์ด ์•„๋‹Œ "๊ฐ’์„ ํ™˜๊ฒฝ์œผ๋กœ ๋‘๊ณ  ํ•จ์ˆ˜๋ฅผ ์ ํ”„ํ•ด์„œ ๊ฐˆ์•„๋ผ์šฐ๋Š” ๋ฐฉ์‹"์„ ์ผ๋ฐ˜ํ™”ํ•œ ๊ฒƒ์œผ๋กœ, ํ•จ์ˆ˜ A๊ฐ€ B๋ฅผ ๋ถ€๋ฅผ ๋•Œ B๋ฅผ ๋ถ€๋ฅด๋Š” ์žฅ์†Œ๊ฐ€ Tail[7]์ธ ๊ฒฝ์šฐ ๊ทธ๋ƒฅ B์˜ ์ฃผ์†Œ๋กœ ์ ํ”„ํ•ด๋ฒ„๋ฆฌ๋Š” ๋ฐฉ์‹์ด๋‹ค. ํ•˜๋Š” ๋ฒ•์„ ์•Œ๋ฉด ์žฌ๊ท€์  ํ•จ์ˆ˜๋ฅผ ๋ถ€๋ฅผ ๋•Œ ์ ˆ๋Œ€ ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๊ฐ€ ๋‚˜์ง€ ์•Š์œผ๋ฉฐ ํ•จ์ˆ˜ ํ˜ธ์ถœ ์†๋„๋„ ๋น ๋ฅธ ์Šคํ‚ด์˜ ์ „๋งคํŠนํ—ˆ ํŠน์ง•์œผ๋กœ, ์–ธ์–ด ์ƒ์„ธ์— "tail-call elimination์„ ํ•˜์ง€ ์•Š์œผ๋ฉด ์Šคํ‚ด์ด ์•„๋‹ˆ๋‹ค"๋ผ๊ณ  ๋ช…์‹œ๋˜์–ด ์žˆ์„ ์ •๋„๋‹ค. ์ดํ›„์— ๋งŽ์€ ์–ธ์–ด(์ฃผ๋กœ ํ•จ์ˆ˜ํ˜•) ์—์„œ ์ฑ„์šฉํ–ˆ๋‹ค.[8]
  • Continuation: TCE๊ณผ ํ•จ๊ป˜ ์—ฐ๊ตฌ์˜ ๋ถ€์‚ฐ๋ฌผ๋กœ, TCE๊ฐ€ ํ•จ์ˆ˜์— ๋Œ€ํ•œ ์„ค๋ช…์ด๋ผ๋ฉด Continuation์€ ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ์„ค๋ช…์ด๋‹ค. ํ•จ์ˆ˜๊ฐ€ ์„œ๋กœ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์ž๋ฆฌ๋ฅผ ๋„˜๊ฒจ์ค„ ๋•Œ ์ฃผ๋ณ€ ํ™˜๊ฒฝ์„ ๊ฐ™์ด ์—ฐ์†์ (continuous)์œผ๋กœ ๋„˜๊ฒจ์ค€๋‹ค๋Š” ์˜๋ฏธ๋กœ, ํ•ต์‹ฌ call/cc[9]๋ผ๋Š” ๋ช…๋ น์–ด๋Š” "ํ˜„์žฌ ํ™˜๊ฒฝ์„ ๊ธฐ์–ตํ–ˆ๋‹ค๊ฐ€ ์ƒˆ ๊ฐ’์„ ๋„˜๊ฒจ๋ฐ›์œผ๋ฉด ์ด ์ž๋ฆฌ๋กœ ์ฆ‰์‹œ ๋Œ์•„์™€์„œ ๊ฐ’์„ ์ „๋‹ฌํ•ด๋ผ"๋ผ๋Š” ๋œป์œผ๋กœ ์“ฐ์ธ๋‹ค. ์‹ค ์šฉ๋ก€๋กœ๋Š” ๊ฐ„๋‹จํ•˜๊ฒŒ๋Š” return, break ๋“ฑ์˜ ๋Œ€์šฉํ’ˆ, ๋ณต์žกํ•˜๊ฒŒ๋Š” ๋ฉ€ํ‹ฐํƒœ์Šคํ‚น ๊ด€๋ฆฌ(!) ๋“ฑ์ด ์žˆ๋‹ค. ์ดํ•ดํ•˜๊ธฐ ๋ณต์žกํ•˜๋ฉด C์˜ setjmp/longjmp์˜ ์—…๊ทธ๋ ˆ์ด๋“œ ๋ฒ„์ „์ด๋ผ ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.
  • S-expression: ๋ฆฌ์Šคํ”„๋ผ๋ฉด ๋นผ๋†“์„ ์ˆ˜ ์—†๋Š” ๋ฌธ๋ฒ• ๊ตฌ์กฐ๋กœ, atom(์‹ฌ๋ณผ, ๋ฌธ์ž, ๋ฌธ์ž์—ด, ์ˆซ์ž ๋“ฑ)๊ณผ ๊ด„ํ˜ธ ๋ฆฌ์ŠคํŠธ ๋”ฑ ๋‘๊ฐœ๋กœ๋งŒ ์ด๋ฃจ์–ด์ ธ์žˆ์–ด ์ฝ”๋“œ (car a)์™€ ๋ฐ์ดํ„ฐ '(car a)์˜ ๊ตฌ์กฐ๊ฐ€ ๋˜‘๊ฐ™๊ณ  ๋ฐ”๊ฟ”์น˜๊ธฐ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค. ์ด๋ฅผ Homoiconicity๋ผ๊ณ  ํ•œ๋‹ค.
  • Macro: ๋ฐ”๋กœ ๊ทธ ๋ฐ”๊ฟ”์น˜๊ธฐ๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ์ผ๋“ฑ๊ณต์‹ ์œผ๋กœ, ๊ธฐ๋ณธ ๋งคํฌ๋กœ๋Š” ์ปค๋จผ ๋ฆฌ์Šคํ”„์˜ ๋งคํฌ๋กœ๋ณด๋‹ค ๋œ ๊ฐ•๋ ฅํ•˜์ง€๋งŒ ์˜ค๋ฅ˜๊ฐ€ ์ ๊ณ  ๊ฐ„ํŽธํ•œ ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉฐ[10], ๋Œ€๋ถ€๋ถ„์˜ ์Šคํ‚ด์€ ์ž์ฒด์ ์œผ๋กœ ์ปค๋จผ ๋ฆฌ์Šคํ”„ ์ˆ˜์ค€์˜ ๋งคํฌ๋กœ๋„ ํ•จ๊ป˜ ์ง€์›ํ•œ๋‹ค.

3. ์ข…๋ฅ˜[ํŽธ์ง‘]

์›Œ๋‚™ ์ข…๋ฅ˜๊ฐ€ ๋งŽ์•„์„œ ๊ณ ๋ฅด๊ธฐ ํž˜๋“ค์ง€๋งŒ ๊ฐ€์žฅ ํŠน์ง•์ ์ด๊ณ  ๋ฉ”์ด์ €ํ•œ ์Šคํ‚ด์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
  • Chicken: ๊ฐ€์žฅ ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ํ™œ์„ฑํ™”๋œ R5RS ์Šคํ‚ด์œผ๋กœ, Freenode IRC์˜ #Chicken์—๋Š” ์–ธ์ œ๋‚˜ ๋งŽ์€ ์‚ฌ๋žŒ์ด ์ƒ์ฃผํ•ด์žˆ๊ณ  ์ฆ‰๊ฐ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต์ด ์˜ฌ๋ผ์˜จ๋‹ค. C๋ฅผ ํ†ตํ•ด ์ปดํŒŒ์ผํ•˜๋ฉฐ ๊ฐ€์žฅ ๋งŽ์€ ์ˆ˜์˜ SRFI์™€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ง€์›ํ•œ๋‹ค. ํŠน์ง•์€ ๊ตฌํ˜„๋ฐฉ์‹์œผ๋กœ, ์ƒˆ ํ•จ์ˆ˜๋กœ ๋„˜์–ด๊ฐˆ๋•Œ ๋ฆฌํ„ด ์—†์ด ํ•จ์ˆ˜๋ฅผ ๊ณ„์† ๋ถ€๋ฅด๋‹ค ์Šคํƒ์ด ๊ฝ‰ ์ฐจ๋ฉด GC๋ฅผ ๋ถ€๋ฅด๊ณ  ์ฒ˜์Œ์— ์‹œ์ž‘ํ•œ ํ•จ์ˆ˜๋กœ longjmp๋ฅผ ํ•ด๋ฒ„๋ฆฐ๋‹ค. ์—ฌ๊ธฐ ๋‚˜์—ด๋œ ์Šคํ‚ด ์ค‘ ์œ ์ผํ•˜๊ฒŒ R7RS ์ง€์› ์˜์ง€๋ฅผ ํ‘œํ˜„ํ•œ ์Šคํ‚ด. ๊ต์œก์ด ์•„๋‹Œ ์‹ค์ œ ์—…๊ณ„์—์„œ ์‚ฌ์šฉ๋  ๊ฒƒ์„ ์—ผ๋‘์— ๋‘๊ณ  ๋งŒ๋“ค์–ด์ง„ ์ปดํŒŒ์ผ๋Ÿฌ/์ธํ„ฐํ”„๋ฆฌํ„ฐ์ด๋‹ค.
  • Gambit: ๊ฐ€์žฅ ์†๋„๊ฐ€ ๋น ๋ฅธ ํŽธ์ธ R5RS ์Šคํ‚ด. ๋‹ค๋งŒ SRFI์™€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ง€์›์€ ์ƒ๋Œ€์ ์œผ๋กœ ์ข‹์€ ํŽธ์€ ์•„๋‹ˆ๋‹ค. LambdaNative๋ผ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์Šคํ‚ด์œผ๋กœ iOS์™€ ์•ˆ๋“œ๋กœ์ด๋“œ ๊ฐœ๋ฐœ์ด ๊ฐ€๋Šฅํ•˜๋‹ค(!). C๋ฅผ ํ†ตํ•ด ์ปดํŒŒ์ผํ•œ๋‹ค.
  • Guile GNU ๊ณต์‹ ์Šคํฌ๋ฆฝํŠธ ์–ธ์–ด(R5RS/R6RS ํ˜ธํ™˜). ํŠน์ง•์€ GNU์™€ ๋ฆฌ๋ˆ…์Šค ๊ณ„์—ด์˜ ์‹œ์Šคํ…œ(ํ˜น์€ ๊ฑฐ๊ธฐ์„œ ํŒŒ์ƒ๋œ) ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋งŽ๋‹ค. 2020๋…„ 1์›” 16์ผ ๋ฆด๋ฆฌ์ฆˆํ•œ 3.0๋ถ€ํ„ฐ JIT๋ฅผ ์ง€์›ํ•œ๋‹ค! ์„ฑ๋Šฅ์€ 2.2 ๋ฒ„์ „ ๋Œ€๋น„ ํ‰๊ท  2๋ฐฐ ํ–ฅ์ƒ๋˜์—ˆ์œผ๋ฉฐ ์ผ๋ถ€ ๋ฒค์น˜๋งˆํฌ ํ•ญ๋ชฉ์€ ์ตœ๋Œ€ 32๋ฐฐ๊นŒ์ง€ ์˜ฌ๋ผ๊ฐ„๋‹ค๊ณ  ํ•œ๋‹ค. #
  • Stalin: ์•ฝ ๋นค ๋„ค์ด๋ฐ์— ๊ฑธ๋งž๊ฒŒ ์•ฝ ๋นค ์„ฑ๋Šฅ. C๋ฅผ ํ†ตํ•ด ์ปดํŒŒ์ผํ•˜๋Š”๋ฐ, ์ˆ˜์น˜๊ณ„์‚ฐ์— ํ•œํ•ด ์‚ฌ๋žŒ์ด ์ง  C๋ณด๋‹ค ๋น ๋ฅธ ์ˆ˜์ค€์„ ๋„˜์–ด์„œ ํฌํŠธ๋ž€ ์ˆ˜์ค€์ด๋‹ค. ๋‹จ R4RS์ธ๋ฐ๋‹ค ์ปดํŒŒ์ผํ•˜๋Š”๋ฐ ์กฐ๊ธˆ ํฐ ํŒŒ์ผ ํ•˜๋‚˜์— ๋ฐ˜๋‚˜์ ˆ ๊ฑธ๋ฆฐ๋‹ค.
  • Chez Scheme ์ธ๋””์• ๋‚˜ ๋Œ€ํ•™์˜ ํ•œ ๊ต์ˆ˜๊ฐ€ ๋งŒ๋“  ์ปดํŒŒ์ผ๋Ÿฌ๋กœ, Common Lisp ์ชฝ์˜ LispWorks ์— ๋Œ€์‘ํ•˜๋Š” ๊ณ ๊ฐ€์˜ ์ƒ์šฉ ์ปดํŒŒ์ผ๋Ÿฌ์˜€์œผ๋‚˜ 2016๋…„ 4์›” 27์ผ๋ถ€๋กœ 9.4 ๋ฒ„์ ผ์„ GitHub ์— ์˜คํ”ˆ์†Œ์Šค๋กœ ๊ณต๊ฐœํ–ˆ๋‹ค. # ์ด์ „๊นŒ์ง€๋Š” Petite Chez Scheme ์ด๋ผ๋Š” ์ธํ„ฐํ”„๋ฆฌํ„ฐ์˜ ๋ฐ”์ด๋„ˆ๋ฆฌ๋งŒ ๋ฌด๋ฃŒ๋กœ ๊ณต๊ฐœํ–ˆ๋‹ค. LispWorks ์™€ ๊ฐ™์ด ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ง€์›๋„ ์ข‹์€ํŽธ์ด๋ฉฐ (๋ฌผ๋ก  ์ด ์ง€์›์„ ๋ฐ›์œผ๋ ค๋ฉด ์œ ๋ฃŒ๋กœ ๊ตฌ๋งคํ•ด์•ผ ํ•œ๋‹ค.) ์ •์ƒ์ ์ธ Scheme ์ปดํŒŒ์ผ๋Ÿฌ์ค‘์—์„œ๋Š” ๋Œ€์ ํ• ์ž๊ฐ€ ์—†์„์ •๋„๋กœ ํผํฌ๋จผ์Šค๊ฐ€ ์••๋„์ ์ด๋‹ค. ์•„๋ž˜ ๋‚˜์˜ค๋Š” Racket ์ด PLT-scheme ์ด๋˜ ์‹œ์ ˆ test-suite ์„ ๋Œ๋ ธ์„๋•Œ 10๋ถ„์ด ๋„˜๊ฒŒ ๊ฑธ๋ฆฌ๋˜ ํ”„๋กœ๊ทธ๋žจ์ด chez scheme ๋กœ ์ปดํŒŒ์ผํ•˜๋‹ˆ ์ปดํŒŒ์ผ ์†๋„๋„ ํ›จ์”ฌ ๋นจ๋ž์œผ๋ฉฐ, ์‹คํ–‰์†๋„์—์„œ๋„ ๊ฐ™์€ test-suite ์„ 30์ดˆ์ปท ํ–ˆ๋‹ค๋Š” ์œ ์ € ๊ฒฝํ—˜๋‹ด๋„ ์žˆ์„์ •๋„. ๋ฌผ๋ก , PLT-scheme ๊ฐ€ ํผํฌ๋จผ์Šค๋กœ ์œ ๋ช…ํ•œ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์•„๋‹ˆ์—ˆ์ง€๋งŒ ํƒ€ ์˜คํ”ˆ์†Œ์Šค Scheme ์ปดํŒŒ์ผ๋Ÿฌ์™€ ๋น„๊ตํ•˜์—ฌ ํผํฌ๋จผ์Šค๊ฐ€ ๋”ฑํžˆ ํฌ๊ฒŒ ๋–จ์–ด์ง€๋Š” ์ˆ˜์ค€์€ ์•„๋‹ˆ์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ๊ฐ์•ˆํ•œ๋‹ค๋ฉด ๋Œ€์ถฉ ์ƒ์ƒ์ด ๋  ๊ฒƒ์ด๋‹ค.
  • Ikarus: R6RS ๋ฅผ ์ง€์›ํ•˜๋Š” ์˜คํ”ˆ์†Œ์Šค scheme ์ปดํŒŒ์ผ๋Ÿฌ๋กœ, ํŠน์ดํ•˜๊ฒŒ๋„ ์œ„ chez scheme ๋ฅผ ๋งŒ๋“  ๊ต์ˆ˜์—๊ฒŒ์„œ ๋ฐ•์‚ฌ๊ณผ์ •์„ ํ–ˆ๋˜ ์‚ฌ๋žŒ์ด ๋งŒ๋“  ์ปดํŒŒ์ผ๋Ÿฌ์ด๋‹ค.์ง€๋„๊ต์ˆ˜ ๋ˆ์ค„์„ ๋Š๋Š” ํ•™์ƒ์˜ ๋ชจ๋ฒ”์ ์ธ ์˜ˆ์‹œ ํผํฌ๋จผ์Šค๋Š” ์ƒ๋‹นํ•œ ์ˆ˜์ค€์ด์ง€๋งŒ, ๊ฐœ์ธ์‚ฌ์ •์œผ๋กœ ์ธํ•ด ํ™ˆํŽ˜์ด์ง€๋„ ์ ‘์†๋ถˆ๊ฐ€์ด๊ณ  ํ˜„์žฌ๋Š” ์—…๋ฐ์ดํŠธ๊ฐ€ ๋˜๊ณ ์žˆ์ง€ ์•Š๋Š” ์ƒํ™ฉ.
  • Racket ์Šคํ‚ด์ด๊ธฐ๋ฅผ ๊ทธ๋งŒ ๋‘” ์Šคํ‚ด. ๋”ฑํžˆ ์–ด๋А ํ‘œ์ค€์— ๋งž์ถ”์ง€ ์•Š๊ณ  ๋งคํฌ๋กœ์™€ ํ™•์žฅ์„ฑ์„ ์ด์šฉํ•ด ์–ด๋–ค ์–ธ์–ด๋“ [11] ๋ชจ๋ฐฉ ๊ฐ€๋Šฅํ•˜๋‹ค. ์›๋ž˜๋Š” plt-scheme์ด๋ผ ๋ถˆ๋ ธ์ง€๋งŒ ์ง€์†์ ์œผ๋กœ ์Šคํ‚ด์˜ ํ‹€์—์„œ ๋ฒ—์–ด๋‚˜๋‹ค ๊ฒฐ๊ตญ ์ด๋ฆ„์„ ๋ฐ”๊พธ์—ˆ๋‹ค. (๋” ์ž์„ธํ•œ ๋‚ด์šฉ์€ Racket ํ•ญ๋ชฉ์„ ์ฐธ๊ณ ํ•˜์ž.)

4. ๊ธฐํƒ€[ํŽธ์ง‘]

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

[1] Clojure ์ œ์™ธ
[2] ์˜ˆ๋ฅผ ๋“ค์–ด (set! a 1)์€ ์ด๋ฏธ ๋งŒ๋“ค์–ด์ง„ ์ด๋ฆ„ a์—๋‹ค๊ฐ€ ์ƒˆ๋กœ 1์„ ๋ฐฐ์ •ํ•œ๋‹ค.
[3] "Any sufficiently complicated C or Fortran program contains an ad hoc, informally-specified, bug-ridden, slow implementation of half of Common Lisp." ๋ณต์žกํ•œ C๋‚˜ ํฌํŠธ๋ž€ ํ”„๋กœ๊ทธ๋žจ์€ ์ปค๋จผ ๋ฆฌ์Šคํ”„์— ์ด๋ฏธ ๊ธฐ๋ณธ์ ์œผ๋กœ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ง์ ‘ ๋งŒ๋“ค์–ด ์จ์•ผ ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์€๋ฐ, ํฐ ๊ธฐ๋Šฅ๋“ค์„ ์—ฌ๋Ÿฌ ๊ฐœ ๊ตฌํ˜„ํ•˜๋ ค๋‹ค๋ณด๋‹ˆ ๋Œ€์ถฉ ๋ผ์›Œ๋งž์ถ”๊ณ  ์ƒ์„ธ๋„ ๋ถˆ๋ถ„๋ช…ํ•ด ๋ฒ„๊ทธ๊ฐ€ ๋„˜์ณ๋‚˜๊ณ  ๋А๋ฆด ์ˆ˜๋ฐ–์— ์—†๋‹ค๋Š” ๋ง์ด๋‹ค.
[4] ๊ทธ ๋•Œ๋ฌธ์— GCC๊ฐ™์€ C ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ž‘์€ ํ•จ์ˆ˜๋ฅผ ์—ฌ๋Ÿฌ๊ฐœ ํ˜ธ์ถœํ•˜๋Š” ๋ถ€๋ถ„์„ ํŒŒ์•…ํ•ด ํ•˜๋‚˜์˜ ํฐ ํ•จ์ˆ˜๋กœ ํ•ฉ์ณ๋ฒ„๋ฆฌ๊ณ , ์ด๋ฅผ inlining์ด๋ผ๊ณ  ํ•œ๋‹ค.
[5] ํ˜„์žฌ๋Š” MIT๋„ Python์œผ๋กœ ๊ฐˆ์•„ํƒ”๋‹ค.
[6] ๊ตญ๋‚ด์—๋„ ์นด์ด์ŠคํŠธ, ๊ณ ๋ ค๋Œ€, ๋™์•„๋Œ€ ๋“ฑ ๋ช‡๋ช‡ ํ•™๊ต๊ฐ€ ๊ต์œกํ–ˆ๋‹ค
[7] B๋ฅผ ๋ถ€๋ฅธ ํ›„์— ํ•  ๊ฒƒ์ด return๋ฐ–์— ์—†๋Š” ๊ฒฝ์šฐ
[8] GCC์—์„œ -O2๋ฅผ ํ•˜๋ฉด C์—์„œ๋„ ์ œ์•ฝ์ด ๋งŽ์ง€๋งŒ TCE๊ฐ€ ๋œ๋‹ค!
[9] call-with-current-continuation
[10] "..." ์  3๊ฐœ๋กœ ๋ญ๋“ ์ง€ ํŒจํ„ด๋งค์นญ์ด ๊ฐ€๋Šฅํ•˜๋‹ค!
[11] ์•Œ๊ณจ ์—๋ฎฌ๋ ˆ์ดํ„ฐ๊ฐ€ ๋‚ด์žฅ๋˜์–ด์žˆ๋‹ค!