通用Lisp值的防御性副本

通用Lisp值的防御性副本,lisp,common-lisp,Lisp,Common Lisp,我想知道是否有一种内置的方法可以在CommonLisp中复制一个值列表类型。据我所知,此列表不是常规列表,而是某种保留类型 我想一个解决方案是转换成一个合适的列表,复制一份,然后再转换回值列表。然而,我不确定最有效的方法 非常感谢您的帮助。Common Lisp中的多值机制的全部目的和效果是允许从表单返回多个值,而无需考虑,即。E无需将另一个临时对象包裹在其周围 在后台,您可以想象这些值直接驻留在堆栈上,甚至驻留在寄存器中 例如,如果您有这样一个功能: (defun foo () (valu

我想知道是否有一种内置的方法可以在CommonLisp中复制一个值列表类型。据我所知,此列表不是常规列表,而是某种保留类型

我想一个解决方案是转换成一个合适的列表,复制一份,然后再转换回值列表。然而,我不确定最有效的方法


非常感谢您的帮助。

Common Lisp中的多值机制的全部目的和效果是允许从表单返回多个值,而无需考虑,即。E无需将另一个临时对象包裹在其周围

在后台,您可以想象这些值直接驻留在堆栈上,甚至驻留在寄存器中

例如,如果您有这样一个功能:

(defun foo ()
  (values 1 2))
你这样称呼它:

(multiple-value-bind (a b) (foo)
  (+ a b))
然后,1被直接分配给a,2被直接分配给b,而不首先将任何内容放入任何中间结构

因此,没有像values对象这样的东西,也没有保存值的单一位置,因此也不可能有类型或与之相关的任何东西


我不知道如何需要一个“防御性”副本,但您可以使用将接收到的内容作为值包装到列表中,使用将列表中的内容作为多个值返回,或者使用或为从某个表单返回的值设置多个位置。

Common Lisp中多值机制的全部目的和效果是允许从一个表单返回多个值,而不考虑。E无需将另一个临时对象包裹在其周围

在后台,您可以想象这些值直接驻留在堆栈上,甚至驻留在寄存器中

例如,如果您有这样一个功能:

(defun foo ()
  (values 1 2))
你这样称呼它:

(multiple-value-bind (a b) (foo)
  (+ a b))
然后,1被直接分配给a,2被直接分配给b,而不首先将任何内容放入任何中间结构

因此,没有像values对象这样的东西,也没有保存值的单一位置,因此也不可能有类型或与之相关的任何东西


我不知道如何需要“防御性”副本,但您可以使用将作为值接收的内容包装到列表中,使用将内容作为多个值返回到列表中,或者使用或将多个位置设置为从某个表单返回的值。

多个值不是一级对象,它们只是从函数中传递值的一种方式。如果你想捕获它们,唯一的方法就是转换成一个列表。如果arity是可变的,有没有办法呢?也就是说,我似乎需要一个值的逆列表,它将获取一个值输出,并从中生成一个正确的列表。值列表就像函数调用中的参数列表一样,只在返回的路上。它很可能是堆栈上的值,如果没有处理多个值的表单之一,就无法使用它。这是为了避免考虑何时可以在调用之间传递多个值。这是一个减少考虑的微观优化。你想做的事情没有可能的目的:你无法访问多个值背后的任何秘密数据结构,特别是没有任何操作可以对其进行变异:“防御性复制”毫无意义。多个值不是一流的对象,它们只是从函数中传递值的一种方式。如果你想捕获它们,唯一的方法就是转换成一个列表。如果arity是可变的,有没有办法呢?也就是说,我似乎需要一个值的逆列表,它将获取一个值输出,并从中生成一个正确的列表。值列表就像函数调用中的参数列表一样,只在返回的路上。它很可能是堆栈上的值,如果没有处理多个值的表单之一,就无法使用它。这是为了避免考虑何时可以在调用之间传递多个值。这是一个减少考虑的微观优化。你想做的事情没有可能的目的:无论多个值背后隐藏着什么秘密数据结构,你都无法访问,特别是没有任何操作可以改变它:“防御性地复制它”毫无意义。