给定一个函数:
(defun foo (bar)
(let ((baz bar))
(setf baz (+ baz 1)))我被赋予了理解(也许是错误的?)baz变成了对bar的某种引用,而不是bar的真实副本。
我想要做的是创建一个真正的临时变量,这样我就可以确保我可以随意处理传入的变量,而不会有任何副作用。
发布于 2010-09-09 06:16:58
我想我更倾向于说"baz变成了对bar引用的同一事物的引用“。但是你说得对,let不做任何复制。
如果你想复制一份bar,你当然可以,尽管你怎么做取决于bar是什么:一个列表,一个向量,等等。
对于好奇的人,Kent Pitman写了一个great article,主题是“为什么没有通用复制功能?”
发布于 2010-09-09 17:29:09
通常,只要不使用任何变异函数(槽访问器、析取列表操作,诸如此类的东西),您就可以随意引用一个“东西”,而不会出现任何问题。
在你复制的情况下,你使用的是数字,这些数字“总是”安全的(如果你对一个新的拷贝做算术,一个新的拷贝将被生成)。
不幸的是,没有通用的“制作副本”功能,部分原因是“制作副本”在所有情况下的含义并不明显,部分原因是复制循环数据结构不一定是微不足道的(通用复制函数必须能够做到这一点)。
https://stackoverflow.com/questions/3672256
复制相似问题