Árvore de cópia comum do Lisp:Quais objetos serão referenciados em comum pelo original e pela cópia?
-
13-12-2019 - |
Pergunta
eu estou lendo Lisp comum prático, e tenho uma pergunta sobre o Lisp COPY-TREE
função.
O livro dá o exemplo de chamar
(copy-tree '( '(1 2) '(3 4) '(5 6)))
Depois de explicá-lo, o livro faz esta afirmação:
Onde uma célula contras no original referenciou um valor atômico, a célula contras correspondente na cópia referenciará o mesmo valor.Assim, os únicos objetos referenciados em comum pela árvore original e pela cópia produzida pela cópia são os números 5, 6 e o símbolo nil.
Mas isso não faz sentido para mim.Eu pensei todos os átomos seria compartilhada entre o original e o novo.Portanto, eu esperava que 1, 2, 3, 4, 5, 6 e NIL fossem todos compartilhados entre o original e a cópia, e que os únicos “novos objetos” fossem todas as células CONS.
Qual está correto e por quê?
Obrigado.
Solução
Verifico a versão web, uma versão em pdf e a capa dura.Os dois primeiros estão errados como você afirma.A capa dura afirma isso (a ênfase em negrito é minha):
Onde uma célula cons no original referenciou um valor atômico, a célula cons correspondente na cópia fará referência ao mesmo valor.Assim, os únicos objetos referenciados em comum pela árvore original e pela cópia produzida por COPY-TREE são os números 1-6, e o símbolo NIL.
Portanto, o livro de capa dura está correto.
Outras dicas
É um pouco mais complicado.
As células contras serão copiadas.Normalmente, os objetos referenciados pelas células cons não serão copiados.
Mas há uma exceção.Dados como fixnums e caracteres podem ser armazenados inline em células cons (e slots de estrutura, slots de classe, matrizes).Esses tipos de dados não são necessariamente EQ.É por isso que existe o EQL.
A descrição está correta, o exemplo não. copy-tree
retornaria 1, 2 e 3 como estão, copiando apenas o cons
células.