닫힌 Lisp

Lispex가 또 하나의 Scheme이 아닌 이유. 매크로 없는 결정론적 Lisp는 단 하나의 의미를 갖는다.

Lispex가 R7RS를 그대로 구현하기만 했다면 그것은 R7RS이고 따로 이름을 둘 이유가 없다. 차이는 Lispex가 더한 기능이 아니라 덜어낸 메타 층위, 그리고 제자리에 동결한 의미에서 나온다.

Lispex는 R7RS-small의 어휘를 빌려 오되 프로그램이 언어 자체를 다시 쓰게 하는 장치를 들어낸다. 남는 것은 확장되는 대신 완성된 Lisp이고, 읽는 곳이 어디든 하나의 정전 형태로 수렴한다.

확장할 수 없는 표면

Scheme을 Scheme이게 하는 힘은 매크로다. define-syntaxsyntax-rules는 프로그램이 새 문법을 만들게 하고, 그래서 한 파일이 말하는 언어는 그 파일의 매크로가 만들어 낸 무엇이 된다. Lispex는 이것을 아예 금지한다. 매크로와 리더 확장 형식은 느린 경로가 아니라 즉시 오류다.

손해처럼 들리지만 바로 그것이 핵심이다. 어떤 문법도 재정의하거나 더할 수 없으니 어떤 Lispex 프로그램도 고정된 문법만으로 완전히 이해된다. 쫓아가야 할 매크로가 없고 파일마다 익혀야 할 방언이 없다. 읽는 것이 곧 언어의 전부이고, Lispex를 아는 사람은 모든 Lispex 프로그램을 안다.

하나의 정전 형태

Lispex 소스는 읽는 리더마다 다르게 파싱되지 않는다. 결정론적 규칙에 따라 단 하나의 정전 Core 형태로 정규화되며, 읽는 과정에서 구현 재량에 맡겨지는 것은 없다.

그래서 Lispex를 실행하는 모든 엔진은 같은 소스에 대해 같은 정전 형태에서 출발한다. 읽고 실행할 합의된 형태가 하나 있을 뿐, 구현마다 제멋대로 받아들이는 표면이 아니다. 하나의 형태로 수렴하지 않는 형식은 그 위에 무언가를 쌓을 수 있는 형식이 아니다.

활판이 아니라 한 편의 글

이것이 진짜 구분이다. Scheme은 새 언어를 찍어 내는 활판, 곧 메타 언어다. Lispex는 완성된 하나의 형식이다. 읽고 실행하지만 다시 짜 맞추지는 않는다.

워드마크가 이를 그대로 말한다. 괄호는 구두점이고 재귀는 운율이다. 시는 읽고 낭송하는 것이지 열 때마다 다른 시로 다시 짓는 것이 아니다. Lispex는 Lisp을 그렇게 대한다. 글을 만드는 도구가 아니라 정해진 형태를 가진 한 편의 글로 대한다.

Lispex를 Lispex로 남기는 선

Lispex는 표준의 쓸모 있는 부분을 향해 계속 자란다. 빠져 있던 본질, 가령 복구 가능한 에러 처리를 더할 때 기준은 표준에 그것이 있느냐가 아니라 Lispex가 그것을 어떻게 더하느냐다. 모든 형식은 표면의 고정된 일부로 하나의 정전 방식으로 정규화되어 들어오며, 사용자가 재정의할 수 있는 무엇으로는 결코 들어오지 않는다.

그 제약이 철학의 증명이다. 매크로가 있는 언어에서 guard 같은 형식은 라이브러리 차원의 문법으로 제공될 수 있다. Lispex에는 매크로가 없으니 그런 형식은 언어 위에 덧대는 것이 아니라 표면에 새겨진 고정된 일부로만 존재할 수 있다. 메타 층위를 걷어낸 R7RS-small 표면을 동결한다. 매크로도 확장도 없이 하나의 정전 형태로.