2011-02-03 3 views
3

Je travaille sur la solution à un problème, qui nécessite des changements dans l'une des fonctions du module gb_trees.Erlang/OTP: Changements aux modules déjà existants

Je reçois une erreur de compilation de la version éditée de gb_trees:

1> c(gb_trees). 
cannot write to .bea# 
... 
2> 

Quelle est la façon dont je peux faire des changements et de compiler un module déjà existant?

Répondre

7

Votre fichier est probablement utilisé par un autre processus. Fermez toutes les applications que vous utilisez ou redémarrez votre système d'exploitation, puis essayez de recompiler.

Vous essayez de charger manuellement un module, qui fait partie d'Erlang/OTP.

De la documentation:

Le système d'Erlang est vous protéger.

La solution la plus simple consiste à renommer votre module , par ex. à mysets.erl. Il est également possible de «décoller» le répertoire contenant le module de bibliothèque.

Voir code:unstick/1.

aussi:

Pour éviter le rechargement accidentellement modules affectant le système d'exécution Erlang lui-même, les kernel, stdlib et compiler répertoires sont considérés comme collant. Cela signifie que le système émet un avertissement et rejette la demande si un utilisateur tente de recharger un module résidant dans l'un d'entre eux. La fonctionnalité peut être désactivée à l'aide de l'indicateur de ligne de commande -nostick.

Voir erl(1).

Par exemple:

$ erl -nostick 
Eshell V5.7.3 (abort with ^G) 
1> c(gb_trees). 
{ok,gb_trees} 
2> gb_trees:module_info(). 
[{exports,[{foo,2},{module_info,0},{module_info,1}]}, 
{imports,[]}, 
{attributes,[{vsn,[338095567601101424197378397768992511838]}]}, 
{compile,[{options,[]}, 
      {version,"4.6.3"}, 
      {time,{2011,2,3,11,39,53}}, 
      {source,"/tmp/gb_trees.erl"}]}] 
3> 

Vous voyez que nous pouvons compiler et charger le module en VM.

Cependant, vous pouvez simplement renommer votre module gb_trees à quelque chose comme gb_trees_mine et utiliser les fonctions qu'il exporte:

1> gb_trees_mine:foo(13,42). 
bar 
2> 
Questions connexes