Eu já usei let
antes, mas nunca usei o let*
que significa let*
(deixe o asterisco) no elisp?
fyi este foi difícil de pesquisar por causa do asterisco.
Eu já usei let
antes, mas nunca usei o let*
que significa let*
(deixe o asterisco) no elisp?
fyi este foi difícil de pesquisar por causa do asterisco.
Respostas:
Isso significa que, quando há mais de uma ligação, as variáveis são vinculadas sequencialmente, para que cada uma possa depender dos valores vinculados àqueles que são vinculados antes dele, ou seja, aqueles que vêm antes dele nas let*
ligações.
Para let
(sem asterisco), nenhuma das ligações pode ocorrer antes de qualquer outra (as variáveis podem, em princípio, ser ligadas em paralelo).
Portanto, (let ((a 42) (b a))...b)
pode gerar um erro porque tenta se vincular b
ao valor de a
e a
(pelo menos o particular a
que está vinculado a isso let
) não pode ser assumido como vinculado a um valor.
[Se alguma outra variável (por exemplo, global) a
estiver vinculada a um valor, por exemplo, 5
essa let
expressão vinculará sua (local) a
a 42
e se vinculará b
ao valor da global a
, ou seja 5
,.]
Mas (let* ((a 42) (b a))...b)
retorna 42
porque a
fica vinculado 42
e, em seguida, b
vinculado ao valor de a
.
Consulte o manual Elisp, nó Variáveis locais .
Atualização, do lembrete de @ DoMiNeLa10 em um comentário:
Além do manual, você também pode usar os comandos de ajuda . De todas as várias maneiras de "pedir ao Emacs" , elas estão entre as primeiras a aprender e as mais úteis.
E para C-h f let*
nos diz, sucintamente:Each VALUEFORM can refer to the symbols already bound by this VARLIST.
Embora não haja nada de errado em perguntar aqui, você faria um favor a si mesmo se fizesse essas perguntas ao Emacs . Basta usar C-h i
para abrir o navegador de informações dos manuais, escolher o Elisp
manual e usar i let*
para procurar let*
no índice (com conclusão). Isso leva você diretamente ao nó que cobre isso.
(E o manual normalmente cobre coisas melhores do que as que serão feitas aqui, já que muito tempo e esforço, por milhares de colaboradores, foi feito para acertar: correto e completo.)
Você também pode pesquisar neste site por perguntas e respostas que usem a tag let-binding
: Basta colocar [let-binding]
no campo de pesquisa. (Farei isso agora, para ver se essa pergunta talvez seja uma duplicata ...)
F1 f
.
let*
é como um let
significado recursivo :
(let* ((var1 VAL1)
(var2 VAL2))
...)
é como
(let ((var1 VAL1))
(let ((var2 VAL2))
...))
Assim, o uso de letras maiúsculas para VAL1
e VAL2
indica que elas também podem ser expressões.
A let
ligação recursiva tem consequências se VAL2
realmente depende var1
. O efeito já está descrito na resposta de Drew .
b
é igual a 5 porque está vinculado a globala
. Deve ler emlet
vez delet*