2012-10-12 41 views
5

En lager.elr (el módulo principal de https://github.com/basho/lager) No existe ninguna función con el nombre "depuración" pero tengo una aplicación que llama a la función de depuración del módulo de cerveza como: lager: depuración (Str, Args)¿La función de Erlang no existe en el módulo?

I Soy principiante en Erlang, pero sé que cuando llamamos a una función desde un módulo lile "mymodule: myfunction" debe haber una función con el nombre "myfunction" en el archivo mymodule.erl pero en este caso cuando busco en lager.erl para la función " depurar "No puedo encontrarlo.

Respuesta

0

No lo ve en el archivo lager.erl porque está en el archivo lager.hrl que se incluye en la parte superior de lager.erl. Erlang le permite incluir un archivo con la directiva -include ("filename.hrl"). Como una convención, los archivos de inclusión terminan en una extensión hrl, pero realmente podría ser cualquier cosa.

https://github.com/basho/lager/blob/master/include/lager.hrl

+0

Pero en el archivo de encabezado no hay ninguna función con el nombre "depuración". En ese encabezado hay: -definir (NIVELES, [depuración, información, aviso, advertencia, error, crítico, alerta, emergencia, ninguno]). No puedo encontrar una función con el nombre de "depuración". Porque en otra aplicación llama a "debug" como: lager: debug (parameter1, parameter2). –

6

La razón por la que no se ve una mención de lager:debug/2 se debe a que utiliza una cerveza parse transformar. Por lo tanto, al compilar el código, se alimenta a través de la transformación de análisis lager y la llamada a lager:debug/2 se sustituye por otra llamada a otra función de módulo.

Si compila su código con la opción de transformación parse correcta para lager, entonces el código funcionaría.

1

"DOY RESPUESTAS DE MALDITO" dio una buena explicación de este comportamiento extraño. He puesto aquí un código que se debe mostrar lo que era el código generado en el archivo de la viga:

En el shell:

utilidad: descompilar ([yourfile.beam]).

%% Author: PCHAPIER 
%% Created: 25 mai 2010 
-module(utility). 

%% 
%% Include files 
%% 

%% 
%% Exported Functions 
%% 
-export([decompile/1, decompdir/1]). 

-export([shuffle/1]). 


%% 
%% API Functions 
%% 

decompdir(Dir) -> 
    Cmd = "cd " ++ Dir, 
    os:cmd(Cmd), 
    L = os:cmd("dir /B *.beam"), 
    L1 = re:split(L,"[\t\r\n+]",[{return,list}]), 
    io:format("decompdir: ~p~n",[L1]), 
    decompile(L1). 


decompile(Beam = [H|_]) when is_integer(H) -> 
    io:format("decompile: ~p~n",[Beam]), 
    {ok,{_,[{abstract_code,{_,AC}}]}} = beam_lib:chunks(Beam ++ ".beam",[abstract_code]), 
    {ok,File} = file:open(Beam ++ ".erl",[write]), 
    io:fwrite(File,"~s~n", [erl_prettypr:format(erl_syntax:form_list(AC))]), 
    file:close(File); 

decompile([H|T]) -> 
    io:format("decompile: ~p~n",[[H|T]]), 
    decompile(removebeam(H)), 
    decompile(T); 

decompile([]) -> 
    ok. 

shuffle(P) -> 
    Max = length(P)*10000, 
    {_,R}= lists:unzip(lists:keysort(1,[{random:uniform(Max),X} || X <- P])), 
    R. 



%% 
%% Local Functions 
%% 
removebeam(L) -> 
    removebeam1(lists:reverse(L)). 

removebeam1([$m,$a,$e,$b,$.|T]) -> 
    lists:reverse(T); 
removebeam1(L) -> 
    lists:reverse(L). 
Cuestiones relacionadas