显式堆栈分配的数据

Explicitly stack-allocated data

我认为在 Common Lisp 的大多数实现中,cons 单元都是 generally/always 堆分配的(参见 Why is consing in Lisp slow?

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

Common Lisp(或 SBCL 之类的特定实现)是否使您能够使用堆栈分配的数据(可能与弱引用之类的东西结合使用)或创建 composite/large-ish 值类型(比如结构在 C)?

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

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

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

明确支持 returning 多个值 的主要动机是摆脱 return 值的构造/解构列表,甚至将一些结果是全局变量。因此,现在可以 return 寄存器中或通过堆栈的多个值。