Ho usato let
prima, ma mai usato let*
cosa significa let*
(lascia l'asterisco) in elisp?
a proposito questo è stato difficile da google a causa dell'asterisco.
Ho usato let
prima, ma mai usato let*
cosa significa let*
(lascia l'asterisco) in elisp?
a proposito questo è stato difficile da google a causa dell'asterisco.
Risposte:
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 b
al valore di a
, e a
(almeno il particolare a
che è 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, 5
allora che let
espressione legherebbe sua (locale) a
a 42
e si legano b
al valore del globale a
, cioè 5
.]
Ma (let* ((a 42) (b a))...b)
ritorna 42
perché a
viene 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 i
per aprire il browser Info dei manuali, scegliere il Elisp
manuale 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 ...)
F1 f
.
let*
è come un let
significato ricorsivo :
(let* ((var1 VAL1)
(var2 VAL2))
...)
è come
(let ((var1 VAL1))
(let ((var2 VAL2))
...))
In tal modo l'uso di lettere maiuscole per VAL1
e VAL2
indica che quelle possono anche essere espressioni.
Il let
legame ricorsivo ha conseguenze se VAL2
dipende effettivamente da var1
. L'effetto è già descritto nella risposta di Drew .
b
uguale a 5 perché è associato a globalea
. Dovrebbe leggerelet
invece dilet*