์ด ๋ฌธ์์ ์๋ณธ์ ์ธ๋ถ ์ํค์์ ๊ฐ์ ธ์์ต๋๋ค.
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๊ฐ ์ ์ง์๋๋ ์คํด์ ์ฐพ์๋ณด์.
๊ทธ ์์ด๋ ์นผ ํด์(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์ด๋ผ๊ณ ํ๋ค.
[6] ๊ตญ๋ด์๋ ์นด์ด์คํธ, ๊ณ ๋ ค๋, ๋์๋ ๋ฑ ๋ช๋ช ํ๊ต๊ฐ ๊ต์กํ๋ค
[7] B๋ฅผ ๋ถ๋ฅธ ํ์ ํ ๊ฒ์ด return๋ฐ์ ์๋ ๊ฒฝ์ฐ
[8] GCC์์ -O2๋ฅผ ํ๋ฉด C์์๋ ์ ์ฝ์ด ๋ง์ง๋ง TCE๊ฐ ๋๋ค!
[9] call-with-current-continuation
[10] "..." ์ 3๊ฐ๋ก ๋ญ๋ ์ง ํจํด๋งค์นญ์ด ๊ฐ๋ฅํ๋ค!
[11] ์๊ณจ ์๋ฎฌ๋ ์ดํฐ๊ฐ ๋ด์ฅ๋์ด์๋ค!