cosa significa "let *" (let asterisk) in elisp


12

Ho usato letprima, ma mai usato let* cosa significa let*(lascia l'asterisco) in elisp?

a proposito questo è stato difficile da google a causa dell'asterisco.

Risposte:


17

Significa che quando c'è più di un legame, le variabili sono legate in modo sequenziale, in modo che ognuna possa dipendere dai valori associati a quelli che sono vincolati prima di esso, cioè quelli che lo precedono nei let*vincoli.

Per let(nessun asterisco), non si può presumere che nessuna delle associazioni si verifichi prima di nessuna delle altre (le variabili potrebbero, in linea di principio, essere legate in parallelo).

Quindi (let ((a 42) (b a))...b)può generare un errore perché cerca di legarsi bal valore di a, e a(almeno il particolare ache è legato in questo let) non si può presumere che sia stato associato a un valore.

[Se qualche altra variabile (es globale) a è associato a un valore, per esempio, 5allora che letespressione legherebbe sua (locale) aa 42e si legano bal valore del globale a, cioè 5.]

Ma (let* ((a 42) (b a))...b)ritorna 42perché aviene legato 42 e quindi b legato al valore di a.

Vedere il manuale Elisp, nodo Variabili locali .


Aggiornamento, dal promemoria di @ DoMiNeLa10 in un commento:

Oltre al manuale, è anche possibile utilizzare i comandi della guida . Di tutti i vari modi di "chiedere a Emacs" , sono tra i primi a imparare e i più utili.

E per C-h f let*ci dice, in breve:Each VALUEFORM can refer to the symbols already bound by this VARLIST.


Anche se non c'è niente di male a chiedere qui, fareste voi stessi un favore se chiesto Emacs queste domande. Basta usare C-h iper aprire il browser Info dei manuali, scegliere il Elispmanuale e usare i let*per cercare let*nell'indice (con completamento). Questo ti porta direttamente al nodo che lo copre.

(E il manuale in genere copre le cose meglio di quanto verrà fatto qui, dato che un sacco di tempo e fatica, da migliaia di collaboratori, sono riusciti a farlo nel modo giusto: corretto e completo.)


Puoi anche cercare in questo sito domande e risposte che utilizzano il tag let-binding: basta inserire [let-binding]il campo di ricerca. (Lo farò ora, per vedere se questa domanda è forse un duplicato ...)


c'è un refuso nell'esempio sopra, quando è buguale a 5 perché è associato a globale a. Dovrebbe leggere letinvece dilet*
jue

@jue: giusto; grazie.
Estratto il

È anche possibile chiedere informazioni sulle funzioni con F1 f.
DoMiNeLa10

@ DoMiNeLa10: Infatti; buon punto. Poiché i commenti possono essere eliminati ogni volta che ho aggiornato la risposta per menzionarlo. Grazie.
Estratto l'

5

let*è come un letsignificato ricorsivo :

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

è come

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

In tal modo l'uso di lettere maiuscole per VAL1e VAL2indica che quelle possono anche essere espressioni.

Il letlegame ricorsivo ha conseguenze se VAL2dipende effettivamente da var1. L'effetto è già descritto nella risposta di Drew .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.