2009-09-03 15 views
6

Moduł digraphs Erlanga zaskoczył mnie mutowaniem stanu.Stan w Erlang Digraphs

Podczas pracy z innymi modułami struktury danych w Erlang, na przykład modułem zestawów, instancja przekazanej struktury danych jest niezmodyfikowana. Funkcja zwraca nową, zmienioną wersję, np.

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

Nie jest to zachowanie podczas pracy z modułem digrafu.

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

Po pierwsze, dlaczego biblioteka digrafów różni się pod tym względem?

Po drugie, a co ważniejsze, w jaki sposób moduł digraph dodaje nowy stan do istniejącego powiązania?

Zakładam, że stan jest przechowywany w innym procesie, który identyfikuje moduł digrafu przy użyciu istniejącego i niezmienionego wiązania G. Czy tak jest w tym przypadku? Czy istnieją inne sposoby modyfikacji stanu związanego z wiązaniem?

Odpowiedz

9
  1. Prawdopodobnie efektywności
  2. jest za pomocą ETS przechowywać digraf. Wartość zwracana z nowego jest w rzeczywistości odwołaniem do tabel ets.

Uruchom pasek narzędzi: start(). z powłoki erlang i otwórz aplikację do wizualizacji stołu - zobaczysz zestaw tabel ets dla narzędzia digraph.

edges 
vertices 
neighbours 

Wartości w wartości zwracanej z dwuznakiem: nowe połączenia są identyfikatory stół ETS z tych tabel ...

+0

Dzięki, nie mogłem znaleźć żadnych procesów, które wyglądały tak, jakby były do ​​czynienia z digrafach. Czy istnieją jakieś konwencje w modułach erlang, które informują, że stan jest przechowywany poza bieżącym procesem? –

+0

Nie, nie sądzę, że istnieje. Ale kiedy zobaczyłem wartość zwracaną przez digraph: new() wyglądało to zadziwiająco jak odniesienie do czegoś innego, a zwykłe miejsce do przechowywania "czegoś innego" to ets ... –

+0

Pamiętam, że w poprzednich dokumentach ery digrafów wspomniano tylko w dokumencie w części Opis, ale teraz tak nie jest. –