결과: 이 언어의 프로그램이 프로그램이 다루는 바로 그 목록으로 만들어져 있다는 것을 설명하고, 그게 신기한 이야기가 아니라 왜 쓸모 있는지 말할 수 있습니다.
알아야 할 것: 괄호 읽는 법. 그 외에는 없습니다.
같은 생김새가 두 가지를 뜻합니다
이 생김새는 이미 아십니다.
(+ 2 3)적용하면 5가 나옵니다. 이제 앞에 따옴표를 하나 붙여 보세요.
'(+ 2 3)이건 세 항목짜리 목록이 됩니다. 기호 +, 숫자 2, 숫자 3이요. 아무것도 더해지지 않았고 계산되지도 않았습니다. 따옴표는 이걸 할 일이 아니라 데이터로 다루라고 말합니다.
같은 글자가 호출이 되기도 하고 목록이 되기도 합니다. 차이는 오직 실행을 요청했느냐뿐입니다. 대부분의 언어에서 함수 호출과 세 항목짜리 목록은 우연히 같은 문장부호를 쓸 뿐 서로 무관한 것입니다. 여기서는 하나를 두 방식으로 보는 것입니다.
평범한 코드에서 이게 왜 중요한가
컴파일러를 쓰고 있어야만 이득을 보는 게 아닙니다. 프로그램이 숫자 대신 판정을 돌려주는 순간 바로 드러납니다.
(define answer '(decision allow))
(list (car answer) (car (cdr answer)))결과는 (decision allow)입니다. 프로그램이 자기가 쓰인 바로 그 표기법으로 작은 구조체를 만들고, 평범한 목록 연산으로 그걸 다시 뜯었습니다. 리터럴을 위한 별도 문법도, 골라야 할 직렬화 형식도, 먼저 정의해야 할 객체 모델도 없었습니다.
이게 이 개념의 일상판입니다. 구조를 만들어 내는 프로그램이 자기가 만들어진 것과 같은 종류를 만들어 내니, 한쪽 도구가 다른 쪽에도 그대로 듣습니다.
따옴표와 그 식구들
따옴표에는 나중에 만날 친척들이 있습니다.
'x
`x
,x
,@xs첫째는 quote, 데이터로 다루라. 둘째는 quasiquote, 데이터로 다루되 구멍을 허용하라. 셋째는 그 구멍을 계산된 값으로 채우고, 넷째는 목록을 펼쳐 넣어 채웁니다. 대부분 고정돼 있고 몇 군데만 채워지는 구조를 프로그램이 만들 수 있도록 존재합니다.
아직 쓸 일은 없습니다. 존재를 알아 두면 백틱을 봤을 때 문자열인 줄 알고 놀라는 일이 없습니다.
정직한 단서
코드가 데이터라는 것의 유명한 귀결은 프로그램이 프로그램을 쓸 수 있다는 것입니다. 진짜입니다. 그리고 실제로 돌아가는 코드 대부분이 하는 일은 아닙니다. 대부분은 위에서 본 작은 방식으로 이득을 봅니다. 표기법이 하나이고 도구가 한 벌이라는 것이요.
거창한 쪽은 반드시 들어가야 할 방이 아니라 열려 있는 문 정도로 여기세요.
직접 해 보기
두 결과를 실행 전에 예상해 보세요.
(list (+ 1 2) '(+ 1 2))정답 보기
(3 (+ 1 2))입니다. 첫 원소는 계산되어 3이 됐고, 둘째는 따옴표가 붙어 세 항목짜리 목록 그대로 남았습니다. 같은 글자, 다른 결말, 차이는 오로지 따옴표 하나입니다.
다음으로 넘어갈 준비가 된 시점
따옴표가 무엇을 하는지 말할 수 있고, 프로그램이 구조화된 데이터를 돌려주는 예를 하나 들 수 있고, 데이터의 표기법과 호출의 표기법이 같은 것이 왜 헷갈림이 아니라 편리함인지 설명할 수 있으면 됩니다.
바로 이 조각들로 진짜 규칙을 만드는 데이터, 조건, 결정으로 이어가세요.