Common Lisp: обычная переменная-это сокращение для списка в LET?


Я читаю практический общий Лисп Гигамонки (Питера Зайбеля) , и наткнулся на следующее утверждение в разделе О DO в главе макросов:

Как и в случае с определения переменных в Допустим, если init-формы, получается переменная привязана к нулю. Также как и с LET, вы можете использовать равнину имя переменной как сокращенное обозначение для списка, содержащего только имя.

Я не знаю, что он имеет в виду под " использованием простой переменной в качестве сокращенно для списка, содержащего только имя", то есть второе предложение. Первое предложение поддерживается в ГиперспектреCommon-Lisp для LET и простым примером, таким как (let (n) n) ~~> NIL, но я не могу найти ничего, что соответствует второму предложению. На самом деле, что-то вроде (let n n) запускает компилятор SBC.

Что это значит? Каков минимальный пример такого использования?

1 6

1 ответ:

Что это значит?

Это просто означает, что все три из них имеют одинаковый эффект:
(let ((x nil))      (let ((x))        (let (x)
  x)                  x)                x)

В каждом случае x связано с nil. Большинство людей знакомы с первым случаем. Второй случай не включает в себя init-форму , но Common Lisp определен для привязки x к nil и в этом случае. Конечно, второй случай, с одной стороны, имеет больше скобок, которые вам нужны (это просто дополнительный набор скобок вокруг переменная), так что вы можете даже взять другой ярлык и просто написать переменную самостоятельно.

Где это указано?

В документации для пусть, мы видим, что синтаксис для let таков:

Пусть ({var | (var [init-form])}*) объявление * форма* ⇒ результат *

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

(let (…) …)
Но что входит в этот внутренний список?

{var | (var [init-form])}*

* Означает, что в этом списке может быть любое число (ноль или больше) вещей, и каждая из них либо соответствует var, либо (var [init-form]). Var-это просто символ, который можно использовать в качестве переменной. (var [init-form])-это список, который имеет var в качестве первого элемента, а необязательно имеет второй элемент, init-form.

Но это означает, что в двух возможных случаях ( var все само по себе, а списка без init-формы) нет init-формы. Вместо того, чтобы иметь несвязанную или неинициализированную переменную, Common Lisp определяет значение в этих случаях как nil.

Почему допускается так много вариаций? Много его для согласованности между различными специальными формами В общем Лиспе. Взгляните наIssue VARIABLE-LIST-ASYMMETRY Writeup . Подробнее о том, как читать спецификации синтаксиса в документации, обратите внимание на раздел1.4.4.20 "синтаксис" словарной статьи .