Qual é a diferença entre '(a b c) e (lista' a 'b' c)?
-
07-07-2019 - |
Pergunta
Estou lendo "Em língua presa" e encontrou este código (eu simplifiquei um pouco).
CL-USER> (defun foo ()
'(a b c))
FOO
CL-USER> (foo)
(A B C)
CL-USER> (nconc * '(D E))
(A B C D E)
CL-USER> (foo)
(A B C D E)
CL-USER> (defun foo ()
(list 'a 'b 'c))
STYLE-WARNING: redefining FOO in DEFUN
FOO
CL-USER> (foo)
(A B C)
CL-USER> (nconc * '(D E))
(A B C D E)
CL-USER> (foo)
(A B C)
-
O que exatamente faz
*
média? É a chamada de função anterior? É adequado para uso em código do mundo real? -
Por que a mudança
(nconc * '(D E))
o valor de retorno da primeira funçãofoo
? -
Eu sempre pensei
(list 'a 'b 'c)
e'(a b c)
são os mesmos? Qual é a diferença?
Solução
A chamada para LIST cria uma nova lista de cada vez que é avaliada. O literal lista pode ser colocado em um segmento de memória só de leitura após a compilação. A atualização destrutivo sobre as listas com NCONC é então problemático, possivelmente com consequências indefinidas (erro de segmentação, mudando o literal para futuras referências, ou nada).
Outras dicas
Variáveis ??*
, **
e ***
são especificadas pela linguagem padrão e eles são bastante úteis ao testar as coisas. Eles são uma característica do REPL, e por isso não são, e não deveria, ser útil em um "código mundo real".