Eu já usei letantes, 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 letantes, 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 bao valor de ae a(pelo menos o particular aque 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, 5essa letexpressão vinculará sua (local) aa 42e se vinculará bao valor da global a, ou seja 5,.]
Mas (let* ((a 42) (b a))...b)retorna 42porque afica 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 ipara abrir o navegador de informações dos manuais, escolher o Elispmanual 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 letsignificado recursivo :
(let* ((var1 VAL1)
(var2 VAL2))
...)
é como
(let ((var1 VAL1))
(let ((var2 VAL2))
...))
Assim, o uso de letras maiúsculas para VAL1e VAL2indica que elas também podem ser expressões.
A letligação recursiva tem consequências se VAL2realmente depende var1. O efeito já está descrito na resposta de Drew .
bé igual a 5 porque está vinculado a globala. Deve ler emletvez delet*