Was ist der Unterschied zwischen Lisp-1 und Lisp-2?

94

Ich habe versucht, den Unterschied zwischen Lisp-1 und Lisp-2 zu verstehen und wie sich dies auf Clojure auswirkt, aber ich verstehe es immer noch nicht richtig. Kann mich jemand aufklären?

appshare.co
quelle

Antworten:

67

Laut Wikipedia :

Ob ein separater Namespace für Funktionen von Vorteil ist, ist in der Lisp-Community umstritten. Es wird normalerweise als Lisp-1 vs. Lisp-2-Debatte bezeichnet. Lisp-1 bezieht sich auf das Modell von Scheme und Lisp-2 bezieht sich auf das Modell von Common Lisp.

Im Grunde geht es darum, ob Variablen und Funktionen denselben Namen haben können, ohne dass es zu Konflikten kommt. Clojure ist ein Lisp-1, was bedeutet, dass nicht der gleiche Name für eine Funktion und eine Variable gleichzeitig verwendet werden kann.

pauldoo
quelle
11
Ist ein Lisp-2 nicht verwirrender, wenn Funktionen und Variablen mit demselben Namen verwendet werden?
appshare.co
39
Ein Grund dafür ist, dass Programmierer, die Lisp-2-Dialekte verwenden, sich nicht die Mühe machen, Funktionen und Variablen mit denselben Namen zu haben. listwird oft als Funktionsparameter verwendet und niemand Dinge, OMG, die so verwirrend ist, da (list ...)es sich um eine Standardfunktion handelt. Viele Funktionen, die listeine Variable haben, verwenden die listFunktion nicht oder nicht in der Nähe dieser Variablen. Selbst wenn das passiert, ist es nicht so schlimm : (list foo list). Dies ist nicht verwirrender als ein Satz wie "Kampf gegen den guten Kampf", in dem dasselbe Wort als Substantiv und Verb erscheint.
Kaz
5
@Zubair Java hat noch mehr Namensräume. Sie können eine Klasse, eine Methode und eine Variable mit demselben Namen definieren.
Ceving
18
Als Mnemonik stelle ich mir Lisp 1s mit 1 Namespace und Lisp 2s mit 2 Namespaces vor (einen für Funktionen und einen für Variablen).
Nick McCurdy
4
@NickMcCurdy Als Mnemonik stelle ich mir ein Fahrrad mit zwei Rädern und ein Dreirad mit drei vor.
Kaz
70

Vielleicht möchten Sie dieses Papier von Richard Gabriel lesen . Es ist eine Zusammenfassung der Themen, die die Lisp-Community in Lisp1 gegen Lisp2 diskutiert hat. Es ist in den ersten Abschnitten etwas dicht und langsam, aber viel einfacher zu lesen, wenn Sie Abschnitt 5 hinter sich lassen.

Grundsätzlich hat Lisp1 eine einzige Umgebung, die Symbole Werten zuordnet, und diese Werte können entweder "regulär" oder Funktionen sein. Lisp2 hat (mindestens) zwei Namespaces (Symbole haben einen Steckplatz für einen Funktionswert und einen für einen regulären Wert). In Lisp2 können Sie also eine Funktion mit dem Namen foo und einen Wert mit dem Namen foo haben, während in Lisp1 der Name foo nur auf einen einzelnen Wert (Funktion oder auf andere Weise) verweisen kann.

Es gibt verschiedene Kompromisse und Geschmacksunterschiede zwischen den beiden, aber lesen Sie das Papier für die Details. In Christian Queinnecs Buch "Lisp in Small Pieces" werden auch die Unterschiede diskutiert, die durch den Text verwoben sind.

Peter McLain
quelle
7
Einer der rätselhafteren Abschnitte des Gabriel-Papiers ist Abschnitt 11 über Multiprocessing. In diesem Abschnitt impliziert er, dass Lisp1 einem funktionalen Programmierstil förderlicher ist und daher der Mehrfachverarbeitung förderlicher ist. Offensichtlich ist dies für Clojure von Interesse. Aber ich bin mir nicht sicher, warum Lisp1 FP förderlicher ist. Hat jemand Einblick in das?
Peter McLain
39
wahrscheinlich, weil der Hauptpunkt von FP darin besteht, Funktionen als erstklassige Werte zu behandeln, daher ist es viel bequemer und konzeptionell sauberer, sie auf die gleiche Weise wie alle anderen Werte zu behandeln
mikera
10
@PeterMcLain Wenn Benutzer von Lisp-1 Dialekten sagen tht Lisp-1 mehr leitend zu funktionaler Programmierung ist, was sie bedeuten , ist , dass Sie müssen nicht voll von dem Code stopfen funcallund functionOperatoren. Diese verschwinden in einem Lisp-1.
Kaz
3
Ein Beispiel, was passiert, wenn ein Schemer versucht, Lisp zu schreiben: emacs.stackexchange.com/q/28979/2787
Uhr
2
Sie haben den Ausdruck "mindestens" für Lisp-2 verwendet. Die einfache Unterscheidung zwischen den beiden Fällen lautet: ob sich das Symbol an der Kopfposition eines s-Ausdrucks befindet oder nicht (wenn ja, dann im Funktionsnamespace nachschlagen, sonst im variablen Namespace). Können Sie einige Beispiele für andere als diese beiden Fälle nennen?
Daniel Dinnyes