Erlang/OTP: Изменения в уже существующих модулях

Я работаю над решением проблемы, которая требует изменения одной из функций модуля gb_trees.

Я получаю сообщение об ошибке при компиляции отредактированной версии gb_trees:

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

Как я могу внести изменения и скомпилировать уже существующий модуль?


person pranjal    schedule 03.02.2011    source источник


Ответы (1)


Вероятно, ваш файл используется другим процессом. Закройте все приложения, которые вы используете, или перезагрузите ОС, затем попробуйте перекомпилировать.

Вы пытаетесь вручную загрузить модуль, который является частью Erlang/OTP.

Из документации:

Система выполнения Erlang защищает вас.

Самое простое решение - переименовать ваш модуль, например. в mysets.erl. Также возможно «отклеить» каталог, содержащий библиотечный модуль.

См. code:unstick/1.

Также:

Чтобы предотвратить случайную перезагрузку модулей, влияющих на саму систему выполнения Erlang, каталоги kernel, stdlib и 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>

Вы видите, что мы можем скомпилировать и загрузить модуль в виртуальную машину.

Однако вы можете просто переименовать свой модуль gb_trees во что-то вроде gb_trees_mine и использовать функции, которые он экспортирует:

1> gb_trees_mine:foo(13,42).
bar
2>
person YasirA    schedule 03.02.2011