Użyłem już letwcześ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ż letwcześ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ć bz wartością ai a(przynajmniej tego, aktó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 letekspresja będzie wiązał jego (lokalnie) ado 42i wiążą się bz wartością globalny a, tzn 5.]
Ale (let* ((a 42) (b a))...b)wraca, 42ponieważ azostaje 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 iaby otworzyć przeglądarkę informacji podręczników, wybrać Elispinstrukcję 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 letznaczenie rekurencyjne :
(let* ((var1 VAL1)
(var2 VAL2))
...)
jest jak
(let ((var1 VAL1))
(let ((var2 VAL2))
...))
Tym samym użycie wielkich liter VAL1i VAL2oznacza, że mogą to być również wyrażenia.
letWiązanie rekurencyjne ma konsekwencje, jeśli VAL2zależy od niego var1. Efekt jest już opisany w odpowiedzi Drew .
bjest równa 5, ponieważ jest powiązana z globalnyma.letZamiast tego powinno się czytaćlet*