代码之家  ›  专栏  ›  技术社区  ›  monkey_p

如何编译加载到字符串中的Erlang代码?

  •  5
  • monkey_p  · 技术社区  · 15 年前

    我有一个生成的字符串,其中包含Erlang模块的代码。

    有没有方法直接从字符串编译生成的模块?

    或者是否有方法将字符串转换为 compile:forms/1 ?

    或者我必须先把它保存到一个临时文件中,然后用 compile:file/1 ?

    或者,我可以向编译模块添加支持,但编写Erlang的优秀人员没有添加它肯定是有原因的。

    2 回复  |  直到 7 年前
        1
  •  15
  •   Zed    15 年前

    您需要将字符串扫描成标记,然后将标记解析成表单。 不幸的是,一次只能解析一个表单,因此您需要在表单边界处剪切字符串或标记。下面是一个简短的例子:

    % 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, _} 代币分开。

        2
  •  0
  •   Vadim Kotov First Zero    7 年前

    将字符串的内容存储在具有模块名的文件中(如果代码中没有),然后使用 compile module .
    代码在虚拟机中可用。我正在使用此技术将配置文件转换为模块。这样,在执行期间就不会有太多的二进制拷贝。