3

Common Lisp のほとんどの実装では、コンス セルは通常/常にヒープに割り当てられていると思います ( Why is consing in Lisp slow? を参照) 。

Common Lisp は、関数から複数の値を返すための機能を提供します (values戻るときとmultiple-value-bind呼び出しサイトで使用します)。ここで少し推測していますが、この構築の動機は2つあると思います.1)truncate破棄された値を気にしない典型的なケースで関数を使いやすくする.2)ヒープに割り当てられたデータ構造をまったく使用せずに複数の値を返し、(実装によっては (?)) ヒープを完全に回避します (後で GC オーバーヘッドを回避します)。

Common Lisp (またはおそらく SBCL のような特定の実装) を使用すると、スタックに割り当てられたデータを (おそらく弱い参照のようなものと組み合わせて) 使用したり、複合/大規模な値の型 (C の構造体のようなもの) を作成したりできますか?

4

1 に答える 1

6

Common Lisp にはDYNAMIC-EXTENT宣言があります。実装は、この情報を使用して、いくつかのデータ構造をスタックに割り当てることができます。また、この宣言を無視することもできます。

一部の実装でのサポート方法については、それぞれのドキュメントを参照してください。

他の実装もこれをサポートしていますが、それに関する明示的なドキュメントが不足している場合があります。

複数の値を返すことを明示的にサポートする主な動機は、戻り値のリストをコンシング/分解することや、結果をグローバル変数に入れることさえなくすことでした。したがって、レジスタまたはスタックを介して複数の値を返すことができるようになりました。

于 2017-10-16T08:04:22.380 に答える