给定一个功能:
(defun foo (bar)
(let ((baz bar))
(setf baz (+ baz 1)))
我被理解(也许是错误的?)baz成为对bar的某种引用,而不是bar的真实副本。
我想要做的是创建一个真正的临时变量,这样我就可以确保我可以随心所欲地传入变量,而不会产生任何副作用。
答案 0 :(得分:5)
我想我宁愿说“baz
成为对bar
引用”的同一事物的引用。但你是对的let
没有做任何复制。
如果你想制作bar
的副本,你当然可以,但你如何做到这一点取决于bar
是什么:列表,向量等。
对于好奇的人,Kent Pitman写了一篇关于“为什么没有通用的COPY功能?”的主题的great article。
答案 1 :(得分:1)
通常情况下,只要你不使用任何变异函数(插槽访问器,descructive列表操作,那种东西),你就可以解决几个对单个“事物”的引用而没有任何问题。
在您复制的情况下,您正在使用数字并且这些数字“始终”是安全的(如果您对新副本进行算术运算,则会生成新副本)。
不幸的是,没有通用的“复制”功能,部分原因是在所有情况下“复制”意味着什么并不明显,部分原因是复制循环数据结构并不一定是微不足道的(通用复制功能会必须能够做到。)