2011-02-03 48 views
3

我正在解决某个问题,这需要更改模块gb_trees的某个功能。Erlang/OTP:对现有模块的更改

我得到一个错误编译gb_trees编辑后的版本:

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

什么是我可以修改和编译一个已经存在的模块的方法是什么?

回答

7

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

您试图手动加载模块,这是Erlang/OTP的一部分。

从技术文档:

Erlang的运行时系统 保护你。

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

请参阅code:unstick/1

另外:

,以防止意外重装影响Erlang运行 系统本身 模块,该kernelstdlibcompiler目录被认为是 。这意味着系统 会发出警告并拒绝 请求,如果用户尝试重新加载驻留在其中任何一个模块中的 模块。通过使用 命令行标志-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> 

你看,我们可以编译和模块加载到虚拟机。

但是你可以在你的模块gb_trees只是重命名为类似gb_trees_mine和使用功能,它出口:

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