2009-09-03 16 views
6

Erlangの有向グラフモジュールは、状態の変化によって私を驚かせました。Erlang Digraphsの状態

Erlangの他のデータ構造モジュールを扱う場合、例えばsetsモジュール、渡されたデータ構造のインスタンスは変更されません。この関数は、変更された新しいバージョンを返します。

>S = sets:new(). 
>sets:size(S). 
0 
>T = sets:add_element(S, "element"). 
>sets:size(S). 
0 
>sets:size(T). 
1 

これは、有向グラフモジュールを扱うときの動作ではありません。

>G = digraph:new(). 
>digraph:no_vertices(G). 
0 
>digraph:add_vertex(G, "vertex"). 
>digraph:no_vertices(G). 
1 

第1に、この点で、なぜ有向グラフラ​​イブラリーが異なるのですか?

第二に、さらに重要なのは、有向グラフモジュールが既存のバインディングに対して新しい状態をどのように追加しているかです。

状態が、既存および変更されていないバインディングGを使用して、有向グラフモジュールが識別する別のプロセスに格納されていると仮定します。または、バインディングに関連する状態を変更する他の方法がありますか?

答えて

9
  1. おそらく効率
  2. のは有向グラフを保存するためにETSを使用しています。新しい値からの戻り値は実際にはetsテーブルへの参照です。

ツールバーを実行します。start()。あなたのerlangシェルからテーブルビジュアライザーアプリケーションを開くと、digraphユーティリティーのための一連のテーブルが表示されます。

edges 
vertices 
neighbours 

有向グラフからの戻り値の値:新しいコールは、これらのテーブルのETSテーブルIDです...

+0

おかげで、私は彼らが二重字を扱ったように見えたすべてのプロセスを見つけることができませんでした。 状態が現在のプロセスの外に保存されていることを示すerlangモジュールには何らかの規則がありますか? –

+0

いいえ私はそこにいるとは思わない。しかし、私がdigraph:new()からの戻り値を見たとき、それは他のものへの参照と著しく見えて、 "他のもの"を格納する通常の場所はetsです... –

+0

私は、説明部分の文書の中で、今はそうではありません。 –