В чем разница между Лиспом-1 и Лиспом-2?

95

Я пытался понять разницу между Lisp-1 и Lisp-2 и то, как это связано с Clojure, но я до сих пор не понимаю должным образом. Кто-нибудь может меня просветить?

appshare.co
источник

Ответы:

69

Согласно википедии :

Вопрос о том, является ли отдельное пространство имен для функций преимуществом, является источником разногласий в сообществе Lisp. Обычно это называют дебатами Лисп-1 против Лисп-2. Lisp-1 относится к модели Scheme, а Lisp-2 относится к модели Common Lisp.

В основном это касается того, могут ли переменные и функции иметь одно и то же имя без конфликтов. Clojure - это Lisp-1, что означает, что он не позволяет использовать одно и то же имя для функции и переменной одновременно.

Полду
источник
11
Разве Лисп-2 не сбивает с толку, когда функции и переменные имеют одинаковые имена?
appshare.co 02
39
Частично причина этого в том, что программисты, использующие диалекты Lisp-2, не изо всех сил стараются иметь функции и переменные с одинаковыми именами. listчасто используется как параметр функции и ничего особенного, OMG, это так сбивает с толку, поскольку (list ...)это стандартная функция. Многие функции, у которых listесть переменная, не используют эту listфункцию или не используют ее рядом с этой переменной. Даже когда это происходит, это не так уж плохо (list foo list). Это не более сбивает с толку, чем предложение типа «сражайся добрым сражением», в котором одно и то же слово встречается как существительное и глагол.
Kaz
5
@Zubair Java имеет еще больше пространств имен. Вы можете определить класс, метод и переменную с тем же именем.
ceving
20
В качестве мнемоники я думаю, что Lisp 1 имеет 1 пространство имен, а Lisp 2 имеет 2 пространства имен (одно для функций и одно для переменных).
Ник
4
@NickMcCurdy В качестве мнемоники я думаю, что велосипед имеет два колеса, а трехколесный велосипед - три.
Kaz
72

Вы можете прочитать эту статью Ричарда Габриэля. Это сводка вопросов, которые сообщество Lisp обсуждало в Lisp1 vs Lisp2. Первые несколько разделов немного сложны и медленны, но читать их будет намного легче, когда вы пройдете раздел 5.

По сути, Lisp1 имеет единую среду, которая отображает символы в значения, и эти значения могут быть либо «обычными», либо функциями. Lisp2 имеет (как минимум) два пространства имен (у символов есть слот для значения функции и один для обычного значения). Итак, в Lisp2 вы можете иметь функцию с именем foo и значение с именем foo, тогда как в Lisp1 имя foo может относиться только к одному значению (функции или какому-либо другому).

Между ними есть несколько компромиссов и различий вкусов, но подробности читайте в статье. В книге Кристиана Кейннека «Лисп в маленьких кусочках» также обсуждаются различия, вплетенные в текст.

Питер МакЛэйн
источник
7
Один из наиболее загадочных разделов статьи Габриэля - это раздел 11 о многопроцессорной обработке. В этом разделе он подразумевает, что Lisp1 больше подходит для функционального стиля программирования, а значит, больше подходит для многопроцессорной обработки. Очевидно, это представляет интерес для Clojure. Но я не совсем уверен, почему Lisp1 больше подходит для FP. Кто-нибудь знает об этом?
Питер МакЛейн
41
вероятно, потому что основная цель FP - рассматривать функции как значения первого класса, поэтому гораздо удобнее и концептуально более чистым обращаться с ними так же, как и со всеми другими значениями,
mikera 02
10
@PeterMcLain Когда пользователи Лисп-1 диалекты говорят THT Лисп-1 является более проводящим для функционального программирования, что они означают, что вы не должны набивать код , полный funcallи functionоператоров. Они исчезают в Лисп-1.
Kaz
3
Пример того, что происходит, когда Schemer пытается написать Lisp: emacs.stackexchange.com/q/28979/2787
ceving
2
Вы использовали фразу «по крайней мере» о Лисп-2. Простое различие между этими двумя случаями заключается в следующем: находится ли символ в заголовке s-выражения или нет (если да, то поиск в пространстве имен функции, иначе в пространстве имен переменных). Можете ли вы привести другие примеры, кроме этих двух?
Дэниел Диннес,