setf无法正常工作

时间:2018-04-16 00:44:43

标签: common-lisp

我刚刚开始使用Common Lisp,我不知道为什么下面的代码返回3:

(progn
  (setq lista '(1 2))
  (setq listb lista)
  (setf (nth 1 listb) 3)
  (nth 1 lista))

请帮帮我吗?

1 个答案:

答案 0 :(得分:2)

Setq不会复制内容。在(setq listb lista)之后,两个名称都指向同一个列表。当您使用一个名称修改它时,它也会在另一个名称下更改。

如果您要创建副本,请使用copy-listcopy-treecopy-alistcopy-seq(请参阅CLHS)。另外,不要修改文字数据(quote')是文字数据。)

(let* ((list-a (list 1 2))
       (list-b (copy-list list-a)))
  (setf (nth 1 list-b) 3)
  (nth 1 list-a))