2011-01-02 3 views

ответ

46

По wikipedia:

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

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

+9

Не является ли Lisp-2 более запутанным, имея функции и переменные с теми же именами? – Zubair

+26

Отчасти из-за того, что программисты, использующие диалекты Lisp-2, не уходят с пути, чтобы иметь функции и переменные с одинаковыми именами. 'list' часто используется как параметр функции, и никто ничего не делает, OMG настолько запутанно, что' (list ...) 'является стандартной функцией. Многие функции, которые имеют «список» в качестве переменной, не используют функцию «list» или не используют ее рядом с этой переменной. Даже если это произойдет, это не так уж плохо: '(list foo list)'. Это не более сбивает с толку, чем предложение, подобное «сражаться с хорошей борьбой», где одно и то же слово появляется как существительное и глагол. – Kaz

+2

@ Zubair Java имеет еще больше пространств имен. Вы можете определить класс, метод и переменную с тем же именем. – ceving

58

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

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

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

+7

Один из наиболее загадочных разделов газеты Габриэля - раздел 11 «Многопроцессорность». В этом разделе он подразумевает, что Lisp1 более благоприятствует функциональному стилю программирования, что в большей степени способствует многопроцессорности. Очевидно, это представляет интерес для Clojure. Но я не уверен, почему * Lisp1 более благоприятствует FP. Кто-нибудь знает об этом? –

+30

, вероятно, потому, что основная точка FP - рассматривать функции как значения первого класса, поэтому гораздо удобнее и концептуально очищать их так же, как и все другие значения. – mikera

+9

@PeterMcLain Когда пользователи диалектов Lisp-1 говорят, что Lisp- 1 является более проводящим к функциональному программированию, что они означают, что вам не нужно заполнять код, полный операторов 'funcall' и' function'. Они исчезают в Lisp-1. – Kaz

Смежные вопросы