私は(C11で)ある種のものを作る必要があり、Objective-C言語の場合liblisp
とほとんど同じように、基本的な機能を処理する必要があります。libobjc
編集
質問を一般的ではないものに書き直しています。
私は次のような実装を得ました:
typedef struct cons {
void *car, *cdr;
} *cons_t;
cons_t cons_init(void *, void *);
void *cons_get_car(cons_t);
void *cons_get_cdr(cons_t);
void cons_set_car(cons_t, void *);
void cons_set_cdr(cons_t, void *);
void cons_free(cons_t);
bool cons_is_managed(cons_t);
したがって、コンス セルを作成できます (参照カウント オブジェクトでメモリ プールを使用します)。また、コンス セルがメモリ プール内にあるかどうかを確認するために使用することもできます (そのため、 (静的データのように)cons_is_managed
で作成されたのではなく、外部で定義されたセルを使用できます)。cons_init
ここで自動参照カウントを効率的に実装するにはどうすればよいですcons_set_car
か?cons_set_cdr
void *
ハーレムとカメの問題はここでは役に立ちません。各セルには 2 つの可能な方法があるため (そして、car または cdr がコンスの場合はどこにも行かない可能性があります)、それらはリスト、ツリー、またはグラフである可能性があります。
cons_set_car
それらを含むサイクルを見つけるために、おそらく on /で使用される外部 (管理されていない) conses を登録する必要がありますが、これを効率的cons_set_cdr
に行う方法はまだわかりません。
これは、グラフの一般的なサイクル (ノード上の最大 2 つの頂点) よりも制御されたコンテキストであるため、線形時間でこれを実行し、ガベージ コレクションを回避できる可能性はありますか (これが私のプラン B になります)。
主な問題は、これが関数型言語のコアであるため、これらの関数が( のように) 何度もobj_msgSend
呼び出され、ボトルネックになることです。
ありがとう。
別のアプローチでは、質問を簡単にするために、Objective-C + ARC や Vala のような参照カウントに基づく言語にコンス セルを実装するにはどうすればよいでしょうか?