Użyłem już let
wcześniej, ale nigdy nie użyłem, let*
co oznacza let*
(niech gwiazdka) w elisp?
fyi ten był trudny do wyszukania w Google ze względu na gwiazdkę.
Użyłem już let
wcześniej, ale nigdy nie użyłem, let*
co oznacza let*
(niech gwiazdka) w elisp?
fyi ten był trudny do wyszukania w Google ze względu na gwiazdkę.
Odpowiedzi:
Oznacza to, że gdy występuje więcej niż jedno wiązanie, zmienne są powiązane sekwencyjnie, dzięki czemu każda z nich może zależeć od wartości związanych z tymi, które są związane przed nim, tj. Tymi, które występują przed nim w let*
powiązaniach.
W przypadku let
(bez gwiazdki) nie można zakładać, że żadne z powiązań wystąpi przed którymkolwiek z pozostałych (zmienne można w zasadzie wiązać równolegle).
(let ((a 42) (b a))...b)
Może więc zgłosić błąd, ponieważ próbuje powiązać b
z wartością a
i a
(przynajmniej tego, a
który jest w nim związany let
), nie można założyć, że został powiązany z wartością.
[Jeżeli jakaś inna zmienna (np globalne) a
wiąże się do wartości, na przykład 5
, to, że let
ekspresja będzie wiązał jego (lokalnie) a
do 42
i wiążą się b
z wartością globalny a
, tzn 5
.]
Ale (let* ((a 42) (b a))...b)
wraca, 42
ponieważ a
zostaje związany, 42
a następnie b
zostaje powiązany z wartością a
.
Zobacz instrukcję Elisp, węzeł Zmienne lokalne .
Zaktualizuj, z przypomnienia @ DoMiNeLa10 w komentarzu:
Oprócz instrukcji możesz także użyć poleceń pomocy . Ze wszystkich różnych sposobów, by „zapytać Emacsa” , są jednymi z pierwszych do nauki i najbardziej przydatnymi.
I C-h f let*
zwięźle mówi nam:Each VALUEFORM can refer to the symbols already bound by this VARLIST.
Chociaż nie ma nic złego w pytaniu tutaj, zrobiłbyś sobie przysługę, gdybyś zadał Emacsowi takie pytania. Wystarczy użyć, C-h i
aby otworzyć przeglądarkę informacji podręczników, wybrać Elisp
instrukcję i użyć i let*
do wyszukiwania let*
w indeksie (z ukończeniem). To prowadzi bezpośrednio do węzła, który to obejmuje.
(A instrukcja zazwyczaj opisuje rzeczy lepsze niż te, które zostaną tutaj wykonane, ponieważ wiele czasu i wysiłku, przez tysiące autorów, przyczyniło się do poprawności: poprawności i kompletności).
Możesz także przeszukać tę stronę w poszukiwaniu pytań i odpowiedzi, które wykorzystują tag let-binding
: wystarczy wpisać [let-binding]
pole wyszukiwania. (Zrobię to teraz, aby sprawdzić, czy to pytanie może być duplikatem ...)
F1 f
.
let*
ma let
znaczenie rekurencyjne :
(let* ((var1 VAL1)
(var2 VAL2))
...)
jest jak
(let ((var1 VAL1))
(let ((var2 VAL2))
...))
Tym samym użycie wielkich liter VAL1
i VAL2
oznacza, że mogą to być również wyrażenia.
let
Wiązanie rekurencyjne ma konsekwencje, jeśli VAL2
zależy od niego var1
. Efekt jest już opisany w odpowiedzi Drew .
b
jest równa 5, ponieważ jest powiązana z globalnyma
.let
Zamiast tego powinno się czytaćlet*