3

我认为在 Common Lisp 的大多数实现中,cons 单元通常/总是堆分配(请参阅Why is consing in Lisp slow?

Common Lisp 确实提供了一种从函数返回多个值的工具(values在返回时和multiple-value-bind在调用点使用)。我在这里推测了一下,但我认为这种构造的动机有两个方面:1)truncate在您不关心丢弃值的典型情况下使函数更易于使用;2)使其成为可能返回多个值,根本不使用堆分配的数据结构,并且(取决于实现(?))完全避免堆(以及以后的 GC 开销)。

Common Lisp(或可能像 SBCL 这样的特定实现)是否让您能够使用堆栈分配的数据(可能与弱引用之类的东西结合使用)或创建复合/大型值类型(类似于 C 中的结构)?

4

1 回答 1

6

Common Lisp 有一个DYNAMIC-EXTENT声明。实现可以使用这个信息来堆栈分配一些数据结构——他们也可以忽略这个声明。

请参阅相应的文档,一些实现如何支持它:

其他实现也支持它,但它们可能缺乏关于它的明确文档。

显式支持返回多个值的主要动机是摆脱返回值的约束/解构列表,甚至将一些结果放入全局变量中。因此,现在可以在寄存器中或通过堆栈返回多个值。

于 2017-10-16T08:04:22.380 回答