¿Qué significa "let *" (let asterisk) en elisp

11

Lo he usado letantes, pero nunca he usado let* ¿qué significa let*(dejar asterisco) en elisp?

Fyi este fue difícil de google debido al asterisco.

guerrero ninja americano
fuente

Respuestas:

16

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 bal valor de a, y a(al menos el particular aque 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, 5y, a continuación que letla expresión podría unirse a su (local) apara 42y se unen bal valor de la mundial a, es decir, 5.]

Pero (let* ((a 42) (b a))...b)regresa 42porque ase 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 ipara abrir el navegador de información de manuales, elija el Elispmanual 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 ...)

Dibujó
fuente
hay un error tipográfico en el ejemplo anterior, cuando bes igual a 5 porque está vinculado a global a. Debería leer en letlugar delet*
jue
@jue: a la derecha; gracias.
Drew
También es posible preguntar sobre funciones con F1 f .
DoMiNeLa10
@ DoMiNeLa10: De hecho; buen punto. Como los comentarios se pueden eliminar en cualquier momento, he actualizado la respuesta para mencionar esto. Gracias.
Dibujó el
4

let*es como un letsignificado recursivo :

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

es como

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

De este modo, el uso de letras mayúsculas para VAL1e VAL2indica que también pueden ser expresiones.

La letunión recursiva tiene consecuencias si VAL2depende realmente de var1. El efecto ya se describe en la respuesta de Drew .

Tobias
fuente