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