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ção foo?

  • Eu sempre pensei (list 'a 'b 'c) e '(a b c) são os mesmos? Qual é a diferença?

Foi útil?

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

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