常见的Lisp防御性价值观副本

时间:2019-04-19 21:56:00

标签: lisp common-lisp

我想知道在Common Lisp中是否有内置的方法可以对值列表类型进行防御性复制。据我了解,该列表不是常规列表,而是某种保留类型。

我想一种解决方案是将其转换为适当的列表,对其进行复制,然后将其转换回值列表。但是,我不确定最有效的方法。

感谢您的帮助。

1 个答案:

答案 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)将某种形式返回的值设置多个位置。