Как скомпилировать код erlang, загруженный в строку? - PullRequest
5 голосов
/ 29 января 2010

У меня есть сгенерированная строка, содержащая код для модуля erlang.

Есть ли способ скомпилировать сгенерированный модуль прямо из строки?

Или есть способ преобразовать строку в формат, необходимый для compile:forms/1?

Или мне придется сначала сохранить его во временном файле, а затем скомпилировать с помощью compile:file/1?

Кроме того, я могу добавить поддержку модуля компиляции, но должна быть причина, по которой хорошие люди, пишущие на erlang, не добавили ее.

Ответы [ 2 ]

15 голосов
/ 29 января 2010

Вам нужно отсканировать вашу строку в токены, а затем разобрать токены в формы. К сожалению, можно анализировать только одну форму за раз, поэтому вам придется либо обрезать свою строку, либо свои токены на границах формы. Вот краткий пример:

% create tokens from strings containing forms
> {ok, MTs, _} = erl_scan:string("-module(z).").
> {ok, ETs, _} = erl_scan:string("-export([f/0]).").
> {ok, FTs, _} = erl_scan:string("f() -> hello_world.").
% tokens to erl_parse trees
> {ok,MF} = erl_parse:parse_form(MTs).
> {ok,EF} = erl_parse:parse_form(ETs).
> {ok,FF} = erl_parse:parse_form(FTs).

% compile forms to binary
> {ok, z, Bin} = compile:forms([MF,EF,FF]).
{ok,z,<<70,79,82,49,0,0,1,164,66,69,65,77,65,116,111,109,0,0,0,...>>}

% load module from binary
> code:load_binary(z, "nofile", Bin).
{module,z}

% test
> z:f().
hello_world

В качестве альтернативы вы можете отсканировать вашу строку, а затем сократить результирующий список токенов на расстоянии {dot, _} токенов.

0 голосов
/ 31 января 2010

Сохраните содержимое строки в файле с именем модуля (если его нет в коде) и скомпилируйте его, используя модуль компиляции .
Код становится доступным в ВМ. Я использую эту технику для преобразования файла конфигурации в модуль. Таким образом, во время выполнения не происходит много двоичных копий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...