Was bedeutet "let *" (let asterisk) in elisp?

11

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.

American-Ninja-Krieger
quelle

Antworten:

16

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 , bauf den Wert a, und a(zumindest die besonderen , adie 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 letAusdruck würde seine (lokal) bindet aan 42und bindet ban den Wert des globalen a, dh 5.]

Aber (let* ((a 42) (b a))...b)kehrt zurück, 42weil aan 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 ElispHandbuch 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 ...)

Drew
quelle
Im obigen Beispiel gibt es einen Tippfehler, wenn er bgleich 5 ist, weil er an global gebunden ist a. Es sollte letstattlet*
jue
@jue: Richtig; Vielen Dank.
Drew
Es ist auch möglich, nach Funktionen mit zu fragen F1 f.
DoMiNeLa10
@ DoMiNeLa10: In der Tat; guter Punkt. Da Kommentare jederzeit gelöscht werden können, habe ich die Antwort aktualisiert, um dies zu erwähnen. Vielen Dank.
Drew
4

let*ist wie eine rekursive letBedeutung:

(let* ((var1 VAL1)
       (var2 VAL2))
  ...)

ist wie

(let ((var1 VAL1))
  (let ((var2 VAL2))
    ...))

Dabei bedeutet die Verwendung von Großbuchstaben für VAL1und VAL2zeigt an, dass dies auch Ausdrücke sein können.

Die rekursive letBindung hat Konsequenzen, wenn sie VAL2tatsächlich davon abhängt var1. Der Effekt ist bereits in Drews Antwort beschrieben .

Tobias
quelle