Common Lisp: обычная переменная-это сокращение для списка в LET?
Я читаю практический общий Лисп Гигамонки (Питера Зайбеля) , и наткнулся на следующее утверждение в разделе О DO в главе макросов:
Как и в случае с определения переменных в Допустим, если init-формы, получается переменная привязана к нулю. Также как и с LET, вы можете использовать равнину имя переменной как сокращенное обозначение для списка, содержащего только имя.
Я не знаю, что он имеет в виду под " использованием простой переменной в качестве сокращенно для списка, содержащего только имя", то есть второе предложение. Первое предложение поддерживается в ГиперспектреCommon-Lisp для LET и простым примером, таким как (let (n) n) ~~> NIL
, но я не могу найти ничего, что соответствует второму предложению. На самом деле, что-то вроде (let n n)
запускает компилятор SBC.
Что это значит? Каков минимальный пример такого использования?
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 в качестве первого элемента, а необязательно имеет второй элемент, init-form.{var | (var [init-form])}*
Но это означает, что в двух возможных случаях ( var все само по себе, а списка без init-формы) нет init-формы. Вместо того, чтобы иметь несвязанную или неинициализированную переменную, Common Lisp определяет значение в этих случаях как nil.
Почему допускается так много вариаций? Много его для согласованности между различными специальными формами В общем Лиспе. Взгляните наIssue VARIABLE-LIST-ASYMMETRY Writeup . Подробнее о том, как читать спецификации синтаксиса в документации, обратите внимание на раздел1.4.4.20 "синтаксис" словарной статьи .