코드가 곧 데이터

따옴표 붙은 목록과 호출은 같은 생김새이고, 이 사실 하나가 이 언어 계열을 다르게 만드는 것의 대부분을 설명합니다.

이 페이지를 마치면 이 언어의 프로그램이 자신이 다루는 바로 그 목록으로 이루어져 있음을 설명하고, 그 사실이 신기한 특성에 그치지 않고 왜 유용한지 말할 수 있게 됩니다.

미리 읽어 둘 것은 괄호 읽는 법 하나입니다. 그 외에는 없습니다.

같은 생김새가 두 가지를 뜻합니다

이 생김새는 이미 아십니다.

LISPEX
(+ 2 3)

이 코드를 실행하면 5가 나옵니다. 이제 앞에 따옴표를 하나 붙여 보세요.

LISPEX
'(+ 2 3)

그러면 기호 +, 숫자 2, 숫자 3으로 이루어진 세 항목짜리 목록이 나옵니다. 아무것도 더해지지 않았고 계산되지도 않았습니다. 따옴표는 이 코드를 실행할 명령이 아니라 데이터로 다루라는 뜻입니다.

같은 텍스트가 함수 호출이 되기도 하고 목록이 되기도 합니다. 차이는 오직 실행을 요청했는지 하나입니다. 대부분의 언어에서 함수 호출과 세 항목짜리 목록은 우연히 같은 문장부호를 쓸 뿐 서로 관련이 없는 개념입니다. 여기서는 하나의 대상을 두 가지 방식으로 바라보는 것입니다.

평범한 코드에서 이게 왜 중요한가

컴파일러를 직접 작성해야만 이점이 생기는 것이 아닙니다. 프로그램이 숫자 대신 판정을 반환하는 순간 바로 드러납니다.

answer라는 이름에 두 항목짜리 목록을 담았다고 해 봅시다. 목록에서 값을 꺼낼 때 쓰는 이름이 둘 있습니다. car는 첫 항목을 돌려주고, cdr은 첫 항목을 뺀 나머지 목록을 돌려줍니다. 두 이름은 생김새로 뜻을 짐작할 수 없는데, 리스프가 처음 돌아간 기계의 레지스터 이름에서 그대로 온 것이라 그렇습니다. 뜻을 캐지 마시고 두 이름만 외워 두시면 됩니다.

LISPEX
(define answer '(decision allow))
(car (cdr answer))

cdr(allow)라는 한 항목짜리 목록을 주고 거기에 car를 씌웠으니 결과는 allow입니다. 프로그램이 자신이 작성된 바로 그 표기법으로 작은 구조화된 데이터를 만들었고, 평범한 목록 연산으로 그중 필요한 조각을 다시 꺼냈습니다. 리터럴을 위한 별도의 문법도, 데이터를 저장하거나 전송하기 전에 변환할 별도의 형식도, 먼저 정의해야 할 객체 모델도 없었습니다.

이것이 이 개념이 일상적인 코드에서 나타나는 모습입니다. 구조를 만들어 내는 프로그램은 자신이 이루어진 것과 같은 종류를 만들어 내므로, 한쪽에 쓰는 도구가 다른 쪽에도 그대로 적용됩니다.

따옴표와 그 식구들

따옴표에는 나중에 만나게 될 친척들이 있습니다. 아래 네 표시는 표기법이라, 실행하지 말고 읽어만 두세요.

'x
`x
,x
,@xs

첫째는 quote, 데이터로 다루라는 뜻입니다. 둘째는 quasiquote, 데이터로 다루되 구멍을 허용하라는 뜻입니다. 셋째는 unquote로 그 구멍을 계산된 값으로 채우고, 넷째는 unquote-splicing으로 목록을 펼쳐 넣어 구멍을 채웁니다. 이 표시들은 대부분 고정되어 있고 몇 군데만 채워 넣는 구조를 프로그램이 만들 수 있도록 존재합니다.

아직 사용할 일은 없습니다. 이런 표시가 있다는 것만 알아 두어도 백틱을 마주쳤을 때 문자열인 줄 알고 당황하는 일이 없습니다.

정직한 단서

코드가 곧 데이터라는 것의 유명한 귀결은 프로그램이 프로그램을 쓸 수 있다는 것입니다. 이는 사실이며, 동시에 실제로 돌아가는 코드 대부분이 하는 일은 아닙니다. 실제로 돌아가는 코드 대부분은 표기법이 하나이고 도구가 한 벌이라는, 위에서 본 소소한 방식으로 이득을 봅니다.

프로그램이 프로그램을 쓰는 거창한 쪽은 반드시 들어서야 하는 방이 아니라, 열려 있는 문 정도로 여기시면 됩니다.

직접 해 보기

두 결과를 실행하기 전에 먼저 예상해 보세요.

LISPEX
(list (+ 1 2) '(+ 1 2))
정답 보기

(3 (+ 1 2))입니다. 첫 번째 원소는 계산되어 3이 되었고, 두 번째 원소는 따옴표가 붙어 세 항목짜리 목록 그대로 남았습니다. 같은 텍스트에서 두 가지 결말이 나왔고, 그 차이를 만든 것은 오직 따옴표 하나입니다.

다음으로 넘어갈 준비가 된 시점

따옴표가 어떤 역할을 하는지 설명할 수 있고, 프로그램이 구조화된 데이터를 돌려주는 예를 하나 들 수 있으면 됩니다. 데이터의 표기법과 호출의 표기법이 같은 것이 왜 헷갈림이 아니라 편리함인지도 설명할 수 있으면 됩니다.

바로 이 조각들로 진짜 규칙을 만드는 데이터, 조건, 결정 문서로 이어가세요.