Common Lisp防御性价值副本[关闭]

问题描述 投票:1回答:1

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

我想一个解决方案是转换为正确的列表,复制它,然后将其转换回值列表。但是,我不确定最有效的方法。

任何帮助表示赞赏。

lisp common-lisp
1个回答
5
投票

Common Lisp中的多值机制的全部目的和效果是允许从表单中传回多个值而不进行消耗,即。即没有在它们周围包裹另一个临时对象

在引擎盖下,您可以将这些值直接置于堆栈甚至寄存器中。

例如,如果您有这样的功能:

(defun foo ()
  (values 1 2))

你这样称呼它:

(multiple-value-bind (a b) (foo)
  (+ a b))

然后将1分配给a,将2分配给b,而不先将任何东西放入任何类型的中间结构中。

因此,没有值对象,也没有单独的位置来保存值,因此也可能没有类型或与之相关的任何类型。

一些我不知道如何使用“防御性”副本,但是您可以使用multiple-value-list将作为值接收的内容包装到列表中,使用values-list将列表中的内容作为多个值返回,或者将多个位置设置为从某些值返回的值使用multiple-value-setq(setf values)形成。

© www.soinside.com 2019 - 2024. All rights reserved.