Как Пол Грэхем решает круговое значение ma c в своей ссылке на Бел? - PullRequest
2 голосов
/ 13 января 2020

в спецификации Бела Пола Грэма ( ссылка на бел ) он определяет макрос 'ma c' следующим образом:

(mac mac (n . rest)
`(set ,n (macro ,@rest)))

Разве это не круг? как интерпретатор узнает, каково значение ma c, если вы используете 'ma c' для определения ma c?

Ответы [ 2 ]

5 голосов
/ 13 января 2020

Не используется для определения оператора mac. Компилятор уже обладает встроенными знаниями о том, как компилировать макросы.

Это используется для того, чтобы сделать определение видимым для кода приложения.

Этот вид кажущейся округлости можно найти в большинстве реализаций Lisp , Много лет go я был сбит с толку, когда увидел это в исходном коде Symbolics:

(defun car (cons)
  (car cons))
(defun cdr (cons)
  (cdr cons))
(defun cons (car cdr)
  (cons car cdr))

В SBCL есть похожий код.

Он работает, потому что компилятор имеет встроенный код генераторы для этих функций. Этот код предназначен для создания для них объектов функций времени выполнения, поэтому вы можете использовать такие вещи, как

(symbol-function 'car)
1 голос
/ 13 января 2020

Бел не реализован, поэтому такой проблемы нет. Человеческий интеллект, читающий спецификацию, не пугается округлости. Мы читаем его как «учитывая, что у нас уже есть работающий макрос mac, вот как его можно определить с помощью самого себя, и это определение следует понимать как определение того, что делает mac».

Кто-то реализация Bel просто использовала бы это определение в качестве руководства для создания расширенной версии mac, которая не зависит от mac syntacti c sugar.

Версия с расширенным вручную может выглядеть например:

(set mac (macro (n . rest) `(set ,n (macro ,@rest))))

То есть мы используем set, чтобы связать определение macro с символом mac, как если бы у нас был макрос mac, если бы он у нас уже был. Как только мы это сделаем, мы получим mac; мы можем обработать исходное определение из spe c, если мы будем sh.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...