co oznacza „let *” (niech gwiazdka) w elisp

13

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ę.

amerykański wojownik ninja
źródło

Odpowiedzi:

20

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 ...)

Rysował
źródło
w powyższym przykładzie występuje literówka, gdy bjest równa 5, ponieważ jest powiązana z globalnym a. letZamiast tego powinno się czytaćlet*
jue
@jue: Right; dzięki.
Drew
Można również zapytać o funkcje za pomocą F1 f.
DoMiNeLa10,
@ DoMiNeLa10: Rzeczywiście; Słuszna uwaga. Ponieważ komentarze można usunąć w dowolnym momencie, zaktualizowałem odpowiedź, aby o tym wspomnieć. Dzięki.
Drew
5

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 .

Tobiasz
źródło