Erlang / OTP:对现有模块的更改

时间:2011-02-03 11:16:32

标签: erlang otp

我正在解决问题的解决方案,这需要更改模块gb_trees的其中一个功能。

编辑gb_trees的编辑版本时收到错误:

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

我可以通过什么方式进行更改并编译现有模块?

1 个答案:

答案 0 :(得分:7)

可能您的文件正由另一个进程使用。关闭所有正在使用的应用程序或重新启动操作系统,然后尝试重新编译。

您正在尝试手动加载模块,该模块是Erlang / OTP的一部分。

来自文档:

  

Erlang运行时系统是   保护你。

     

最简单的解决方案是重命名您的   模块,例如到mysets.erl。也是   可以'取消'目录   包含库模块。

请参阅code:unstick/1

此外:

  

防止意外重装   影响Erlang运行时的模块   系统本身,kernelstdlib和   考虑compiler个目录   的粘性即可。这意味着该系统   发出警告并拒绝   请求用户是否尝试重新加载   模块驻留在其中任何一个。该   功能可以通过使用禁用   命令行标志-nostick

请参阅erl(1)

例如:

$ 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>

您看到我们可以编译并将模块加载到VM中。

但是,您可以将模块gb_trees重命名为gb_trees_mine,并使用导出的函数:

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