我有一個生成的字符串,其中包含erlang模塊的代碼。如何編譯加載到字符串中的erlang代碼?
有沒有辦法直接從字符串編譯生成的模塊?
或者有沒有辦法將字符串轉換爲compile:forms/1
所需的格式?
或者我必須先將它保存到臨時文件,然後用compile:file/1
進行編譯?
或者,我可以添加對編譯模塊的支持,但是爲什麼編寫erlang的好人沒有添加它,這一定是有原因的。
我有一個生成的字符串,其中包含erlang模塊的代碼。如何編譯加載到字符串中的erlang代碼?
有沒有辦法直接從字符串編譯生成的模塊?
或者有沒有辦法將字符串轉換爲compile:forms/1
所需的格式?
或者我必須先將它保存到臨時文件,然後用compile:file/1
進行編譯?
或者,我可以添加對編譯模塊的支持,但是爲什麼編寫erlang的好人沒有添加它,這一定是有原因的。
您需要將字符串掃描爲標記,然後將標記解析爲表單。 不幸的是,它一次只能解析一個表單,因此您需要在表單邊界處剪切字符串或您的標記。下面是一個簡單的例子:
% 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, _}
令牌分開。
將字符串的內容存儲在帶有模塊名稱的文件中(如果代碼中沒有),並使用compile module進行編譯。
代碼在VM中可用。我正在使用這種技術將配置文件轉換爲模塊。這樣在執行過程中沒有太多的二進制副本。
看起來不錯,謝謝,不知道我不得不把它濺起來:D – 2010-01-29 08:37:46
修正了錯字。我想你可以把你的整個源代碼放到一個單一的字符串中,掃描它,然後在每個'{dot,_}'處剪下標記列表。 – Zed 2010-01-29 10:25:10
此外,請注意,包括不使用這種方法(請參閱:http://stackoverflow.com/questions/2013119/compile-forms-with-included-header-files) – Zed 2010-01-29 10:25:44