2009-09-03 5 views
6

Le module de digrammes Erlang m'a surpris par l'état de mutation.État dans les digrammes d'Erlang

Lors de la gestion d'autres modules de structure de données dans Erlang, par exemple le module sets, l'instance de la structure de données transmise n'est pas modifiée. La fonction renvoie une nouvelle version modifiée, par ex.

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

Ce n'est pas le comportement du module digraphe.

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

Premièrement, pourquoi la bibliothèque de digrammes est-elle différente à cet égard?

Deuxièmement, et plus important encore, comment le module digraphe ajoute-t-il un nouvel état à une liaison existante?

Je suppose que l'état est stocké dans un autre processus que le module digraphe identifie en utilisant la liaison G existante et non modifiée. Est-ce le cas? Ou existe-t-il d'autres moyens de modifier l'état associé à une liaison?

Répondre

9
  1. probablement pour une efficacité
  2. Il utilise ETS pour stocker le digramme. La valeur de retour du nouveau sont en fait des références aux tables ets.

Exécutez la barre d'outils: start(). à partir de votre shell erlang et ouvrez l'application visualiseur de table - vous verrez un ensemble de tables ets pour l'utilitaire digraph.

edges 
vertices 
neighbours 

Les valeurs de la valeur de retour de la digraph: nouvel appel sont les ids de table ets de ces tables ...

+0

Merci, je ne pouvais pas trouver tous les processus qui avaient l'air comme ils avaient affaire à digraphs. Y a-t-il des conventions dans les modules erlang qui vous indiquent que l'état est stocké en dehors du processus en cours? –

+0

Non, je ne pense pas qu'il y a. Mais quand j'ai vu la valeur de retour de digraph: new() cela ressemblait remarquablement à une référence à quelque chose d'autre et l'endroit habituel pour stocker "autre chose" est ets ... –

+0

Je me souviens que dans les anciens digrammes la documentation était juste mentionnée dans doc dans la partie Description, mais maintenant ce n'est pas le cas. –