o que "let *" (let asterisk) significa no elisp

11

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.

guerreiro-ninja-americano
fonte

Respostas:

16

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 ...)

Desenhou
fonte
há um erro de digitação no exemplo acima, quando bé igual a 5 porque está vinculado a global a. Deve ler em letvez delet*
jue
@ jue: Certo; valeu.
Tirou
Também é possível perguntar sobre funções com F1 f.
DoMiNeLa10 07/07/19
@ DoMiNeLa10: De fato; bom ponto. Como os comentários podem ser excluídos a qualquer momento, atualizei a resposta para mencionar isso. Valeu.
Tirou
4

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 .

Tobias
fonte