У чому різниця між Lisp-1 та Lisp-2?


94

Я намагався зрозуміти різницю між Lisp-1 і Lisp-2 і те, як це пов'язано з Clojure, але я все ще не розумію належним чином. Хтось може мене просвітлити?

Відповіді:


68

Відповідно до wikipedia :

Чи є окремий простір імен для функцій перевагою, є джерелом суперечок у спільноті Lisp. Зазвичай його називають дебатами Lisp-1 проти Lisp-2. Lisp-1 посилається на модель Схеми, а Lisp-2 - на модель Common Lisp.

В основному йдеться про те, чи можуть змінні та функції мати однакові назви без зіткнення. Clojure - це Lisp-1, що означає, що він не дозволяє використовувати одне і те ж ім'я для функції та змінної одночасно.


11
Тоді Lisp-2 не є більш заплутаним, маючи функції та змінні з однаковими іменами?
appshare.co

39
Частина причини полягає в тому, що програмісти, що використовують діалекти Lisp-2, не намагаються мати функції та змінні, що мають однакові імена. listчасто використовується як параметр функції, і ніхто не робить цього, OMG, що так бентежить, оскільки (list ...)є стандартною функцією. Багато функцій, які мають listзмінну, не використовують цю listфункцію або не використовують її поблизу цієї змінної. Навіть коли це трапляється , що це не так уже й погано: (list foo list). Це не є більш заплутаним, ніж речення на кшталт "битися з доброю боротьбою", де одне і те ж слово виступає як іменник та дієслово.
Каз

5
@Zubair Java має ще більше просторів імен. Ви можете визначити клас, метод і змінну з однаковим іменем.
закінчується

19
Мнемонікою я вважаю, що Lisp 1 має 1 простір імен, а Lisp 2 - 2 простори імен (один для функцій, а другий для змінних).
Nick McCurdy

4
@NickMcCurdy Як мнемоніка, я думаю, що велосипед має два колеса, а триколісний велосипед - три.
Каз

71

Можливо, ви хотіли б прочитати цю статтю Річарда Габріеля. Це короткий виклад питань, які обговорювала спільнота Lisp у Lisp1 проти Lisp2. Це трохи щільно і повільно рухається в перших кількох розділах, але набагато легше читається до того моменту, коли ви пройдете розділ 5.

В основному, Lisp1 має єдине середовище, яке відображає символи у значення, і ці значення можуть бути або "звичайними", або функціями. Lisp2 має (принаймні) два простори імен (символи мають слот для значення функції та один для звичайного значення). Отже, у Lisp2 ви можете мати функцію з іменем foo та значення з іменем foo, тоді як у Lisp1 назва foo може посилатися лише на одне значення (функція чи інше).

Існує кілька компромісів та відмінностей смаку між ними, але для деталей прочитайте статтю. У книзі Крістіана Квіннека "Шляпа маленькими шматками" також обговорюються відмінності, вплетені в текст.


7
Одним з найбільш загадкових розділів статті Габріеля є розділ 11 про багатопроцесорність. У цьому розділі він натякає, що Lisp1 є більш сприятливим для функціонального стилю програмування, отже, більш сприятливим для багатопроцесорної обробки. Очевидно, це цікавить wrt Clojure. Але я не зовсім впевнений, чому Lisp1 є більш сприятливим для FP. Хтось має розуміння цього?
Пітер Маклейн, 02

40
можливо, тому, що основним моментом FP ​​є розгляд функцій як першокласних значень, отже, набагато зручніше та концептуально чистіше обробляти їх так само, як і всі інші значення
mikera

10
@PeterMcLain Коли користувачі діалектів Lisp-1 кажуть, що Lisp-1 є більш провідним для функціонального програмування, вони мають на увазі те, що вам не потрібно заповнювати повний код funcallта functionоператори. Вони зникають у Lisp-1.
Каз

3
Приклад того, що трапляється, коли схемер намагається написати Lisp: emacs.stackexchange.com/q/28979/2787
закінчується

2
ви використовували фразу "принаймні" щодо Lisp-2. Просте розмежування між двома випадками полягає в тому, чи знаходиться символ у позиції голови s-виразу, чи ні (якщо так, то пошук у просторі імен функції, в іншому - у просторі імен змінної). Чи можете ви навести кілька прикладів інших, крім цих 2 випадків?
Даніель Дінніс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.