我想知道在Common Lisp中是否有内置的方法可以对值列表类型进行防御性复制。据我了解,该列表不是常规列表,而是某种保留类型。
我想一种解决方案是将其转换为适当的列表,对其进行复制,然后将其转换回值列表。但是,我不确定最有效的方法。
任何帮助表示赞赏。
Common Lisp 中的多值机制的全部目的和效果是允许从表单传回一个以上的值而无需进行约束,即无需在它们周围包装另一个临时对象。
在幕后,您可以想象这些值直接位于堆栈上,甚至位于寄存器中。
例如,如果您具有这样的功能:
(defun foo ()
(values 1 2))
Run Code Online (Sandbox Code Playgroud)
您这样称呼它:
(multiple-value-bind (a b) (foo)
(+ a b))
Run Code Online (Sandbox Code Playgroud)
然后直接将1分配给a2 b,将2 分配给直接,而无需先将任何东西放入任何类型的中间结构中。
因此,没有值对象之类的东西,也没有一个存放值的地方,因此也没有类型或与之相关的任何东西。
我看不到如何需要“防御性”副本,但是您可以使用来将接收到的内容包装到列表中,使用来multiple-value-list将列表中的内容作为多个值返回values-list,或者使用来设置从某种形式返回的值的多个位置multiple-value-setq或(setf values)。