2009-09-03 12 views
6

Il modulo digrammi di Erlang mi ha sorpreso per lo stato di muting.Stato nei Digrafi di Erlang

Quando si tratta di altri moduli della struttura dati in Erlang, ad esempio il modulo set, l'istanza della struttura dati inoltrata, non è modificata. La funzione restituisce una nuova versione modificata, ad es.

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

Questo non è il comportamento quando si tratta con il modulo digramma.

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

In primo luogo, perché la libreria digraph è diversa sotto questo aspetto?

In secondo luogo, e ancora più importante, in che modo il modulo digraph aggiunge un nuovo stato a un binding esistente?

Suppongo che lo stato venga memorizzato in un altro processo che il modulo digraph sta identificando utilizzando il binding G. esistente e inalterato. È questo il caso? O ci sono altri modi per modificare lo stato associato a un legame?

risposta

9
  1. Probabilmente per l'efficienza
  2. Sta usando ETS per memorizzare il digrafo. I valori restituiti dal nuovo sono in realtà riferimenti alle tabelle ets.

Barra degli strumenti Esecuzione: start(). dalla tua shell di erlang e apri l'applicazione visualizzatore della tabella: vedrai una serie di tabelle ets per l'utilità digraph.

edges 
vertices 
neighbours 

I valori nel valore di ritorno dal digramma: nuova chiamata sono gli ID di tabella ETS di questi tavoli ...

+0

Grazie, non riuscivo a trovare tutti i processi che sembravano avevano a che fare con digrammi. Esistono convenzioni nei moduli di erlang che indicano che lo stato viene memorizzato al di fuori del processo corrente? –

+0

No, non penso ci sia. Ma quando ho visto il valore restituito da digraph: new() sembrava molto simile a un riferimento a qualcos'altro e il solito posto in cui memorizzare "qualcos'altro" è ets ... –

+0

Mi ricordo che nella precedente documentazione di Digraph ets menzionato solo in doc nella parte Description, ma ora non lo è. –