Общий Лисп а Лисп-н?

Мне известно, что в 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.


PA) PAIP, с. 837:

(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).

Семь он перечисляет:

  1. функции и макросы
  2. переменные
  3. специальные переменные
  4. типы данных
  5. метка для операторов go внутри tagbody
  6. имя блока для операторов возврата из блока
  7. символы внутри выражения в кавычках

Питер Сейбел в своем посте на 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 (фактически, я не знаю ни одного языка, обычно так обозначено).

Другие вопросы по тегам