Lo he usado let
antes, pero nunca he usado let*
¿qué significa let*
(dejar asterisco) en elisp?
Fyi este fue difícil de google debido al asterisco.
Lo he usado let
antes, pero nunca he usado let*
¿qué significa let*
(dejar asterisco) en elisp?
Fyi este fue difícil de google debido al asterisco.
Respuestas:
Significa que cuando hay más de un enlace, las variables se unen secuencialmente, de modo que cada una puede depender de los valores vinculados a los que están vinculados antes, es decir, los que vienen antes en los let*
enlaces.
Para let
(sin asterisco), no se puede suponer que ninguno de los enlaces ocurra antes que cualquiera de los otros (las variables podrían, en principio, estar unidas en paralelo).
Por (let ((a 42) (b a))...b)
lo tanto, puede generar un error porque intenta vincularse b
al valor de a
, y a
(al menos el particular a
que está vinculado en esto let
) no se puede suponer que se ha vinculado a un valor.
[Si alguna otra variable (por ejemplo global) a
está unido a un valor, por ejemplo, 5
y, a continuación que let
la expresión podría unirse a su (local) a
para 42
y se unen b
al valor de la mundial a
, es decir, 5
.]
Pero (let* ((a 42) (b a))...b)
regresa 42
porque a
se vincula 42
y luego b
se vincula al valor de a
.
Consulte el manual de Elisp, Variables locales de nodo .
Actualización, del recordatorio de @ DoMiNeLa10 en un comentario:
Además del manual, también puede usar los comandos de ayuda . De todas las diversas formas de "preguntar a Emacs" , se encuentran entre las primeras en aprender y las más útiles.
Y para C-h f let*
nos dice, sucintamente:Each VALUEFORM can refer to the symbols already bound by this VARLIST.
Aunque no hay nada malo en pedir aquí, que haría usted mismo un favor si pedirá Emacs tales preguntas. Solo use C-h i
para abrir el navegador de información de manuales, elija el Elisp
manual y use i let*
para buscar let*
en el índice (con finalización). Eso te lleva directamente al nodo que cubre esto.
(Y el manual generalmente cubre las cosas mejor de lo que se hará aquí, ya que miles de contribuyentes han dedicado mucho tiempo y esfuerzo a hacerlo bien: correcto y completo).
También puede buscar en este sitio preguntas y respuestas que usen la etiqueta let-binding
: simplemente colóquelas [let-binding]
en el campo de búsqueda. (Lo haré ahora, para ver si esta pregunta es quizás un duplicado ...)
F1 f
.
let*
es como un let
significado recursivo :
(let* ((var1 VAL1)
(var2 VAL2))
...)
es como
(let ((var1 VAL1))
(let ((var2 VAL2))
...))
De este modo, el uso de letras mayúsculas para VAL1
e VAL2
indica que también pueden ser expresiones.
La let
unión recursiva tiene consecuencias si VAL2
depende realmente de var1
. El efecto ya se describe en la respuesta de Drew .
b
es igual a 5 porque está vinculado a globala
. Debería leer enlet
lugar delet*