Как скомпилировать код erlang, загруженный в строку?

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

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

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

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

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

5
задан monkey_p 29 January 2010 в 08:22
поделиться

2 ответа

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

% 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, _} лексемы в отдельности.

15
ответ дан 18 December 2019 в 11:56
поделиться

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

0
ответ дан 18 December 2019 в 11:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: