2010-01-29 4 views
3

나는 erlang 모듈의 코드를 포함하는 생성 된 문자열을 가지고 있습니다.문자열에로드 된 erlang 코드를 컴파일하는 방법은 무엇입니까?

생성 된 모듈을 문자열에서 바로 컴파일 할 수 있습니까?

문자열을 compile:forms/1에 필요한 형식으로 변환하는 방법이 있습니까?

아니면 임시 파일에 저장 한 다음 compile:file/1으로 컴파일해야합니까?

또한 컴파일 모듈에 지원을 추가 할 수 있지만 erlang을 작성한 좋은 사람들이 추가하지 않은 이유가 있어야합니다.

답변

13

문자열을 토큰으로 스캔 한 다음 토큰을 양식으로 구문 분석해야합니다. 불행히도 한 번에 하나의 양식 만 구문 분석 할 수 있으므로 양식 경계에서 문자열이나 토큰을 잘라야합니다.

% 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

좋아, 고마워, 내가 그것을 다 흘려야한다는 것을 몰랐다. D –

+1

오타가 수정되었습니다. 나는 당신이 전체 소스 코드를 하나의 문자열에 넣고 그것을 스캔 한 다음 각 {{dot, _}}에서 토큰리스트를자를 수 있다고 생각한다. – Zed

+0

또한이 방법이 포함되지 않는다는 점에 유의하십시오 (참조 : http://stackoverflow.com/questions/2013119/compile-forms-with-included-header-files) – Zed

0

문자열의 내용을 모듈 이름이있는 파일에 저장하고 (코드에없는 경우) compile module을 사용하여 컴파일하십시오.
VM에서 코드를 사용할 수있게됩니다. 이 기술을 사용하여 구성 파일을 모듈로 변환합니다. 이렇게하면 실행하는 동안 바이너리 복사본이 많지 않습니다.

관련 문제