Ich verstehe den Unterschied zwischen LET und LET* (parallele und sequentielle Bindung), und theoretisch macht das auch durchaus Sinn. Aber gibt es einen Fall, in dem Sie LET jemals wirklich gebraucht haben? In all meinem Lisp-Code, den ich mir in letzter Zeit angesehen habe, könnte man jedes LET durch LET* ersetzen, ohne dass sich etwas ändert.
Edit: OK, ich verstehe warum Irgendjemand hat LET* erfunden, vermutlich als Makro, vor langer Zeit. Meine Frage ist, ob es angesichts der Existenz von LET* einen Grund gibt, LET beizubehalten? Haben Sie schon einmal Lisp-Code geschrieben, in dem ein LET* nicht so gut funktioniert wie ein einfaches LET?
Ich glaube nicht an das Argument der Effizienz. Erstens scheint es nicht so schwer zu sein, Fälle zu erkennen, in denen LET* in etwas so Effizientes wie LET kompiliert werden kann. Zweitens gibt es eine Menge Dinge in der CL-Spezifikation, die einfach nicht so aussehen, als wären sie auf Effizienz ausgelegt. (Wann haben Sie das letzte Mal eine LOOP mit Typdeklarationen gesehen? Die sind so schwer zu verstehen, dass ich sie noch nie benutzt gesehen habe.) Vor Dick Gabriels Benchmarks in den späten 1980er Jahren war CL war geradezu langsam.
Es sieht so aus, als sei dies ein weiterer Fall von Abwärtskompatibilität: wohlweislich wollte niemand riskieren, etwas so Grundlegendes wie LET zu zerstören. Das war meine Vermutung, aber es ist beruhigend zu hören, dass niemand einen dumm-einfachen Fall hat, den ich übersehen habe, in dem LET eine Reihe von Dingen lächerlich einfacher gemacht hat als LET*.
0 Stimmen
Parallel ist eine schlechte Wortwahl; nur vorherige Bindungen sind sichtbar. parallele Bindungen wären eher wie Haskells "... where ..." Bindungen.
1 Stimmen
Ich wollte nicht verwirren; ich glaube, das sind die Worte, die in der Spezifikation verwendet werden :-)
12 Stimmen
Die Parallele ist richtig. Das bedeutet, dass die Bindungen gleichzeitig zum Leben erwachen und sich nicht gegenseitig sehen und beschatten. Zu keinem Zeitpunkt gibt es eine für den Benutzer sichtbare Umgebung, die einige der in der LET definierten Variablen enthält, andere aber nicht.
0 Stimmen
Haskells, wo die Bindungen eher wie letrec sind. Sie können alle Bindungen auf der gleichen Scope-Ebene sehen.
2 Stimmen
Die Frage "Gibt es einen Fall, in dem
let
ist erforderlich?" ist in etwa so, als würde man fragen: "Gibt es einen Fall, in dem Funktionen mit mehr als einem Argument erforderlich sind?".let
&let*
gibt es nicht aus Gründen der Effizienz, sondern weil sie es den Menschen ermöglichen, anderen Menschen beim Programmieren ihre Absicht mitzuteilen.0 Stimmen
let*
ylet
beziehen sich genau wiesetq
ypsetq
beziehen.