2017-10-16 245 views
3

我認爲Common Lisp中利弊細胞的大多數實現通常/總是堆上分配(見Why is consing in Lisp slow?明確堆棧分配的數據

Common Lisp中確實提供用於從函數返回多個值的設施(返回時使用values和在呼叫地點的multiple-value-bind)。我在這裏猜測了一下,但我認爲這種結構的動機有兩方面:1)在不關心丟棄值的典型情況下,使truncate等功能更易於使用; 2)使之成爲可能在不使用堆分配數據結構的情況下(取決於實現(?))返回多個值,完全避免堆(以及後來的GC開銷)。

Common Lisp(或者像SBCL這樣的特定實現)可以讓你使用堆棧分配的數據(可能與弱引用類似的東西)或者創建composite/large-ish值類型(類似於struct C)?

+4

你可以用'DYNAMIC-EXTENT'聲明做堆棧分配。例如,請參閱SBCL手冊[6.2動態範圍分配](http://www.sbcl.org/manual/#Dynamic_002dextent-allocation)。 – jkiiski

+0

請參閱[Common Lisp中的values函數](https://stackoverflow.com/a/22796346/850781)。 – sds

回答

6

Common Lisp有一個DYNAMIC-EXTENT聲明。實現可以使用這些信息來堆棧分配一些數據結構 - 它們也可以忽略這個聲明。

請參見相應的文檔一些實現如何支持:

其他實現支持也行,但他們可能缺乏關於它的明確的文檔。

明確支持返回多個值的主要動機是擺脫返回值的consing/destructuring列表,甚至將一些結果放入全局變量中。因此,現在可以通過寄存器或堆棧返回多個值。