Erlang / OTP: Mudanças nos módulos já existentes
Pergunta
Estou trabalhando na solução de um problema que requer mudanças em uma das funções do módulo gb_trees
.
Estou recebendo um erro ao compilar a versão editada de gb_trees
:
1> c(gb_trees).
cannot write to .bea#
...
2>
Como posso fazer alterações e compilar um módulo já existente?
Solução
Provavelmente seu arquivo está sendo usado por outro processo. Feche todos os aplicativos que você está usando ou reinicie o sistema operacional e tente recompilar.
Você está tentando carregar manualmente um módulo, que faz parte do Erlang / OTP.
Da documentação:
O sistema de tempo de execução Erlang é protegendo você.
A solução mais fácil é renomear seu módulo, por exemplo para mysets.erl. Isso é também possível 'desgrudar' o diretório contendo o módulo de biblioteca.
Consulte code:unstick/1
.
Também:
Para evitar recarregar acidentalmente módulos que afetam o tempo de execução Erlang sistema propriamente dito, o
kernel
,stdlib
e diretórioscompiler
são considerados pegajoso . Isso significa que o sistema emite um aviso e rejeita o solicitação se um usuário tentar recarregar um módulo residente em qualquer um deles. o recurso pode ser desabilitado usando o sinalizador de linha de comando-nostick
.
Consulte erl(1)
.
Por exemplo:
$ 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>
Você vê que podemos compilar e carregar o módulo na VM.
No entanto, você pode simplesmente renomear seu módulo gb_trees
para algo como gb_trees_mine
e usar as funções que ele exporta:
1> gb_trees_mine:foo(13,42).
bar
2>