Pergunta

Estou tentando aprender Lisp e estava passando por um exemplo de código em que algo semelhante ao código a seguir é usado:

(Lista 'Quote 5)

Isso avalia para '5 no repl. Eu esperava avaliar para ('5) ou (citação 5)

Estou tentando isso no Clisp Repl.

Qualquer ajuda seria apreciada.

Foi útil?

Solução

O loop de leitura de avaliação de leitura primeiro lê e depois avalia

'Citação é lida como "o símbolo cujo nome é citação"

5 é lido como "o número 5"

Então (Lista 'Quote 5) é avaliada como "faça uma lista cujo primeiro elemento é o símbolo cujo nome é citação e cujo segundo elemento é 5".

O resultado dessa avaliação pode ser escrito como "(Quote 5)". "'5" é outra maneira de dizer isso, e a impressora em algumas (provavelmente a maioria) implicações de Lisp optará por imprimir a forma mais curta, em vez da mais longa.

Quando você está aprendendo essas coisas digitando no Repl, você precisa lembrar que as duas etapas de leitura e avaliação são distintas, mas que o loop está fazendo as duas

Tentar

* (read-from-string "(list 'quote 5)")
(LIST 'QUOTE 5)

fazer uma etapa de cada vez, ou

* (first (read-from-string "(quote 5)"))
QUOTE
* (second (read-from-string "(quote 5)"))
5
* (read-from-string "(quote 5)")
'5

para se convencer de que "(citação 5)" e "'5" são a mesma coisa

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top