How to compile erlang code loaded into a string?

前端 未结 2 833
南旧
南旧 2021-02-04 19:26

I have a generated string that contains the code for an erlang module.

Is there a way to compile the generated module straight from the string?

Or is there a w

相关标签:
2条回答
  • 2021-02-04 20:03

    You need to scan your string into tokens, and then parse the tokens into forms. Unfortunately it is only possible to parse one form at a time, so you will need to either cut your string, or your tokens at form boundaries. Here is a short example:

    % 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
    

    Alternatively you can scan your string, and then cut the resulting token list at {dot, _} tokens apart.

    0 讨论(0)
  • 2021-02-04 20:19

    Store the content of the string in a file with a module name (if not there in the code) and compile it using compile module.
    Code becomes available in the VM. I am using this technique to convert a configuration file into a module. This way there not much binary copy going on during the execution.

    0 讨论(0)
提交回复
热议问题