让:在Common Lisp中创建一个临时变量

时间:2010-09-08 22:07:21

标签: lisp common-lisp

给定一个功能:

(defun foo (bar)
 (let ((baz bar))
    (setf baz (+ baz 1)))

我被理解(也许是错误的?)baz成为对bar的某种引用,而不是bar的真实副本。

我想要做的是创建一个真正的临时变量,这样我就可以确保我可以随心所欲地传入变量,而不会产生任何副作用。

2 个答案:

答案 0 :(得分:5)

我想我宁愿说“baz成为对bar引用”的同一事物的引用。但你是对的let没有做任何复制。

如果你想制作bar的副本,你当然可以,但你如何做到这一点取决于bar是什么:列表,向量等。

对于好奇的人,Kent Pitman写了一篇关于“为什么没有通用的COPY功能?”的主题的great article

答案 1 :(得分:1)

通常情况下,只要你不使用任何变异函数(插槽访问器,descructive列表操作,那种东西),你就可以解决几个对单个“事物”的引用而没有任何问题。

在您复制的情况下,您正在使用数字并且这些数字“始终”是安全的(如果您对新副本进行算术运算,则会生成新副本)。

不幸的是,没有通用的“复制”功能,部分原因是在所有情况下“复制”意味着什么并不明显,部分原因是复制循环数据结构并不一定是微不足道的(通用复制功能会必须能够做到。)