Erlang / OTP: изменения в уже существующих модулях - PullRequest
3 голосов
/ 03 февраля 2011

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

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

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

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

1 Ответ

7 голосов
/ 03 февраля 2011

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

Вы пытаетесь вручную загрузить модуль, который является частью 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>
...