que signifie «let *» (let astérisque) dans elisp

12

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.

guerrier-ninja américain
la source

Réponses:

17

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 aqui 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, 5alors cette letexpression lierait son (local) aà 42et se lierait bà la valeur de la globale a, c'est-à-dire 5.]

Mais (let* ((a 42) (b a))...b)retourne 42car aest 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 ipour ouvrir le navigateur Info des manuels, choisissez le Elispmanuel 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 ...)

A dessiné
la source
il y a une faute de frappe dans l'exemple ci-dessus, quand best égal à 5 ​​car il est lié à global a. Il devrait être lu à la letplace dulet*
jue
@jue: Droite; THX.
Drew
Il est également possible de poser des questions sur les fonctions avec F1 f.
DoMiNeLa10
@ DoMiNeLa10: En effet; bon point. Comme les commentaires peuvent être supprimés à tout moment, j'ai mis à jour la réponse pour le mentionner. THX.
Drew
4

let*est comme un letsens récursif :

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

est comme

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

Ainsi, l'utilisation de majuscules VAL1et VAL2indique que celles-ci peuvent également être des expressions.

La letliaison récursive a des conséquences si elle VAL2dépend réellement de var1. L'effet est déjà décrit dans la réponse de Drew .

Tobias
la source