Por que (List 'Quote' x) avalia para 'x e não (' x) ou (citação 'x)?
-
26-09-2019 - |
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.
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