갈루아의 반서재



리스프에서는 코드와 데이터를 어떻게 구분하는가? 이를 위해 Common Lisp 는 2개의 모드를 사용한다. 하나는 코드 모드이고, 다른 하나는 데이터 모드이다. 


Code Mode


무언가를 Lisp REPL 에 입력할 때마다 컴파일러는 여러분이 실행하고자하는명령을 입력하고 있다고 간주한다. 다른 말로 하면, 리스프는 기본 모드가 코드 모드라는 얘기다. 이미 언급했지만, 리스프는 코드가 리스트 형태로 입력된다고 기대한다. 하지만 입력되는 코드는 리스트의 특별한 타입, 즉 폼의 형태이다. 

폼이라는 것은 도입부에 특별한 명령(보통은 명령의 이름)을 가지는 리스트를 말한다. 폼을 읽을 때 리스프는 해당 리스트의 모든 아이템을 파라메터로 함수에게 보낸다. 

1
2
[19]> (expt 2 3)
8
cs

위의 예에서 지수를 계산하는 expt 를 호출함으로써 2^3 을 계산하여 8 을 반환한다. 그리고 아래 예는 2개의 중첩된 폼을 가진 경우이다. 

1
2
]> (expt 2 (+ 3 4))
128
cs


Data Mode


짐작할 수 있듯이 데이터 모드로 쓰여진 모든 것은 데이터로 취급된다. 즉, 컴파일러가 실행할려고 하지 않는다는 얘기다. 이 경우 따옴표를 리스트의 앞 부분에 넣는다(quoting). 입력한 표현식을 그대로 반환하게 된다. quoting 을 통해 다음 부분은 명령이 아니라 데이터 모음이라고 알려주는 것이다. 

1
2
[20]> '(expt 2 3)
(EXPT 2 3)
cs