J'ai déjà utilisé let
, mais je n'ai jamais utilisé let*
ce que signifie let*
(laissez un astérisque) dans elisp?
fyi celui-ci était difficile à google à cause de l'astérisque.
J'ai déjà utilisé let
, mais je n'ai jamais utilisé let*
ce que signifie let*
(laissez un astérisque) dans elisp?
fyi celui-ci était difficile à google à cause de l'astérisque.
Réponses:
Cela signifie que lorsqu'il y a plus d'une liaison, les variables sont liées séquentiellement, de sorte que chacune peut dépendre des valeurs liées à celles qui sont liées avant, c'est-à-dire celles qui la précèdent dans les let*
liaisons.
Pour let
(pas d'astérisque), aucune des liaisons ne peut être supposée se produire avant les autres (les variables pourraient, en principe, être liées en parallèle).
Donc, (let ((a 42) (b a))...b)
peut générer une erreur car il essaie de se lier b
à la valeur de a
, et a
(au moins le particulier a
qui y est lié let
) ne peut pas être supposé avoir été lié à une valeur.
[Si une autre variable (par exemple globale) a
est liée à une valeur, par exemple, 5
alors cette let
expression lierait son (local) a
à 42
et se lierait b
à la valeur de la globale a
, c'est-à-dire 5
.]
Mais (let* ((a 42) (b a))...b)
retourne 42
car a
est lié à 42
puis b
se lie à la valeur de a
.
Voir le manuel Elisp, Variables locales du nœud .
Mise à jour, à partir du rappel de @ DoMiNeLa10 dans un commentaire:
En plus du manuel, vous pouvez également utiliser les commandes d'aide . De toutes les différentes manières de «demander à Emacs» , elles sont parmi les premières à apprendre et les plus utiles.
Et pour C-h f let*
nous dit, succinctement:Each VALUEFORM can refer to the symbols already bound by this VARLIST.
Bien qu'il n'y ait rien de mal à demander ici, vous vous rendriez service si vous posiez de telles questions à Emacs . Utilisez simplement C-h i
pour ouvrir le navigateur Info des manuels, choisissez le Elisp
manuel et utilisez i let*
pour rechercher let*
dans l'index (avec complétion). Cela vous amène directement au nœud qui couvre cela.
(Et le manuel couvre généralement mieux que ce qui sera fait ici, car beaucoup de temps et d'efforts, par des milliers de contributeurs, ont été nécessaires pour bien faire les choses: correct et complet.)
Vous pouvez également rechercher sur ce site des questions et réponses qui utilisent la balise let-binding
: Il suffit de mettre [let-binding]
dans le champ de recherche. (Je vais le faire maintenant, pour voir si cette question est peut-être en double ...)
F1 f
.
let*
est comme un let
sens récursif :
(let* ((var1 VAL1)
(var2 VAL2))
...)
est comme
(let ((var1 VAL1))
(let ((var2 VAL2))
...))
Ainsi, l'utilisation de majuscules VAL1
et VAL2
indique que celles-ci peuvent également être des expressions.
La let
liaison récursive a des conséquences si elle VAL2
dépend réellement de var1
. L'effet est déjà décrit dans la réponse de Drew .
b
est égal à 5 car il est lié à globala
. Il devrait être lu à lalet
place dulet*