Ich habe schon einmal benutzt let
, aber noch nie benutzt, let*
was bedeutet let*
(Sternchen lassen) in elisp?
Zu Ihrer Information, dieser war wegen des Sternchens schwer zu googeln.
Ich habe schon einmal benutzt let
, aber noch nie benutzt, let*
was bedeutet let*
(Sternchen lassen) in elisp?
Zu Ihrer Information, dieser war wegen des Sternchens schwer zu googeln.
Antworten:
Dies bedeutet, dass bei mehr als einer Bindung die Variablen nacheinander gebunden werden, so dass jede von den Werten abhängen kann, die an diejenigen gebunden sind, die davor gebunden sind, dh an diejenigen, die in den let*
Bindungen davor stehen .
Für let
(kein Sternchen) kann angenommen werden, dass keine der Bindungen vor einer der anderen auftritt (die Variablen könnten im Prinzip parallel gebunden werden).
So (let ((a 42) (b a))...b)
kann einen Fehler ausgelöst , weil sie zu binden versuchen , b
auf den Wert a
, und a
(zumindest die besonderen , a
die in diesen gebunden ist let
) kann nicht angenommen werden , auf einen Wert gebunden haben.
[Wenn einige andere (zB global) Variable a
auf einen Wert gebunden ist, zum Beispiel 5
, dann ist der let
Ausdruck würde seine (lokal) bindet a
an 42
und bindet b
an den Wert des globalen a
, dh 5
.]
Aber (let* ((a 42) (b a))...b)
kehrt zurück, 42
weil a
an 42
und b
an den Wert von gebunden wird a
.
Siehe das Elisp-Handbuch, Knoten Lokale Variablen .
Update aus der Erinnerung von @ DoMiNeLa10 in einem Kommentar:
Neben dem Handbuch können Sie auch die Hilfebefehle verwenden . Von all den verschiedenen Möglichkeiten, "Emacs zu fragen" , gehören sie zu den ersten, die lernen, und zu den nützlichsten.
Und für C-h f let*
sagt uns kurz und bündig:Each VALUEFORM can refer to the symbols already bound by this VARLIST.
Obwohl es nichts Falsches ist, hier zu fragen, würden Sie sich selbst einen Gefallen tun, wenn Sie Emacs solche Fragen stellen würden. Verwenden Sie einfach C-h i
, um den Info-Browser für Handbücher zu öffnen, wählen Sie das Elisp
Handbuch aus und verwenden Sie es i let*
, um let*
im Index nachzuschlagen (mit Abschluss). Das bringt Sie direkt zu dem Knoten, der dies abdeckt.
(Und das Handbuch behandelt in der Regel die Dinge besser als hier beschrieben, da Tausende von Mitwirkenden viel Zeit und Mühe darauf verwendet haben, alles richtig zu machen: richtig und vollständig.)
Sie können diese Site auch nach Fragen und Antworten durchsuchen, die das Tag verwenden let-binding
: Geben Sie einfach [let-binding]
das Suchfeld ein. (Ich werde das jetzt tun, um zu sehen, ob diese Frage vielleicht ein Duplikat ist ...)
F1 f
.
let*
ist wie eine rekursive let
Bedeutung:
(let* ((var1 VAL1)
(var2 VAL2))
...)
ist wie
(let ((var1 VAL1))
(let ((var2 VAL2))
...))
Dabei bedeutet die Verwendung von Großbuchstaben für VAL1
und VAL2
zeigt an, dass dies auch Ausdrücke sein können.
Die rekursive let
Bindung hat Konsequenzen, wenn sie VAL2
tatsächlich davon abhängt var1
. Der Effekt ist bereits in Drews Antwort beschrieben .
b
gleich 5 ist, weil er an global gebunden ista
. Es solltelet
stattlet*