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?
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?
Antworten:
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.
list
wird oft als Funktionsparameter verwendet und niemand Dinge, OMG, die so verwirrend ist, da (list ...)
es sich um eine Standardfunktion handelt. Viele Funktionen, die list
eine Variable haben, verwenden die list
Funktion 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.
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.
funcall
und function
Operatoren. Diese verschwinden in einem Lisp-1.