Да, вы можете переопределить синтаксис, чтобы Lisp становится компилятор. Вы делаете это с помощью «чтения макросов», которые отличаются от обычного «компилятора Макросы», что вы, вероятно, думаете.
Common Lisp имеет встроенный объект для определения нового синтаксиса для читателя и читатель макросов обработать этот синтаксис. Эта обработка осуществляется при считывании времени (который идет перед компиляцией или Eval времени). Чтобы узнать больше об определении читатель макросов в Common Lisp, см Common Lisp HyperSpec - вы хотите прочитать гл. 2, "Синтаксис" и Ch. 23, "Читатель" . (Я считаю , что схема имеет один и тот же объект, но я не знаком с ней - см источников Scheme для языка программирования Arc ).
В качестве простого примера, давайте предположим, что вы хотите Lisp использовать фигурные скобки, а не круглые скобки. Для этого требуется что-то вроде следующих определений читателя:
;; { and } become list delimiters, along with ( and ).
(set-syntax-from-char #\{ #\( )
(defun lcurly-brace-reader (stream inchar) ; this was way too easy to do.
(declare (ignore inchar))
(read-delimited-list #\} stream t))
(set-macro-character #\{ #'lcurly-brace-reader)
(set-macro-character #\} (get-macro-character #\) ))
(set-syntax-from-char #\} #\) )
;; un-lisp -- make parens meaningless
(set-syntax-from-char #\) #\] ) ; ( and ) become normal braces
(set-syntax-from-char #\( #\[ )
Вы говорите , что Lisp {походит на (и что}, как а). Затем вы создаете функцию ( lcurly-brace-reader
) , что читатель будет вызывать всякий раз , когда он видит {, и вы используете , set-macro-character
чтобы назначить эту функцию к {. Тогда вы скажите , что Lisp (и), как [и] (то есть, не имеет смысла синтаксис).
Другие вещи , которые вы могли бы сделать , включают, например, создание нового синтаксиса строки или с помощью [и] вложить в-затруднительного обозначение и обрабатывать его в S-выражения.
Вы можете также пойти далеко за пределы этого, пересматривая весь синтаксис с собственных макросов символов , которые будут вызывать действия в читателя, так что небо действительно есть предел. Это лишь одна из причин , почему Пол Грэм и другие твердят , что Lisp является хорошим языком , на котором написать компилятор.