Общий Лисп а Лисп-н?
Мне известно, что в Common Lisp существуют разные среды привязки для функций и переменных, но я считаю, что у него также есть другая среда привязки для меток tagbody. Существуют ли еще более обязательные условия, чем эта? Если так, то справедливо ли классифицировать Common Lisp как Lisp-2?
Эти вопросы не подразумевают педантичность или обход велосипедов, я просто хочу лучше понять Common Lisp и, надеюсь, получить некоторые подсказки, где можно глубже изучить его спецификацию.
4 ответа
Я знаю, что Common Lisp имеет разные среды привязки для функций и переменных,
Это были бы пространства имен, согласно HyperSpec:
пространство имен n. 1. привязки, обозначения которых ограничены определенным видом.
The bindings of names to tags is the tag namespace.'' 2. any mapping whose domain is a set of names.
Пакет определяет пространство имен.
(Пункт 1.)
но я считаю, что у него также есть другая обязательная среда для меток tagbody. Существуют ли еще более обязательные условия, чем эта?
Да, есть больше пространств имен. Я даже помню небольшой фрагмент, разоблачающий большинство из них, но, к сожалению, я больше не могу его найти ". Это, по крайней мере, раскрытые пространства имен переменных, функций, тегов и блоков, но, возможно, также были включены типы и объявления. Есть также другой ответ SO, в котором перечислены эти пространства имен.
Если так, то справедливо ли классифицировать Common Lisp как Lisp-2?
В комментариях к приведенному выше связанному ответу Райнер Йосвиг соглашается с тем, что "общие дебаты касаются Lisp-1 против Lisp-n".
"2" может быть связано с относительной важностью различия между значениями и слотами функций или потому, что объекты других пространств имен не являются объектами первого класса. Например, в статье Габриэля / Питмана, на которую есть ссылка в другом ответе:
Существует действительно большее количество пространств имен, чем только два, которые обсуждаются здесь. Как мы уже отмечали ранее, другие пространства имен включают, по крайней мере, пространства имен блоков и тегов; имена типов и имена объявлений часто рассматриваются как пространства имен. Таким образом, имена Lisp1 и Lisp2, которые мы использовали, вводят в заблуждение. Имена Lisp5 и Lisp6 могут быть более подходящими.
а также:
В этой статье есть два рассматриваемых пространства имен, которые мы будем называть "пространство имен значения" и "пространство имен функции". Другие пространства имен включают имена тегов (используемые TAGBODY и GO) и имена блоков (используемые BLOCK и RETURN-FROM), но объекты в частях размещения их привязок не являются первоклассными объектами Lisp.
(defun f (f)
(block f
(tagbody
f (catch 'f
(if (typep f 'f)
(throw 'f (go f)))
(funcall #'f (get (symbol-value 'f) 'f))))))
Питер Норвиг говорит, что в PAIP "Common Lisp имеет как минимум семь пространств имен" (стр. 836).
Семь он перечисляет:
- функции и макросы
- переменные
- специальные переменные
- типы данных
- метка для операторов go внутри tagbody
- имя блока для операторов возврата из блока
- символы внутри выражения в кавычках
Питер Сейбел в своем посте на comp.lang.lisp особо отмечает о пространствах имен "компилятор" и "библиотека". Я думаю, что все семь пространств имен Norvig являются пространствами компиляторов.
Посмотрите, например, этот старый дискуссионный пост от comp.lang.lisp:
http://coding.derkeiler.com/Archive/Lisp/comp.lang.lisp/2004-04/0737.html
Да - http://www.lispworks.com/documentation/lw51/CLHS/Body/t_symbol.htm указывает отдельную ячейку значения и функциональную ячейку, согласующуюся с lisp-2.
Существует также список свойств, но, поскольку нет контекста, в котором символ "естественно" ссылается на свой список свойств, обычно не описывают CL как lisp-3 (фактически, я не знаю ни одного языка, обычно так обозначено).