2012-10-12 25 views
5

Nel lager.elr (il modulo principale di https://github.com/basho/lager) non esiste una funzione con il nome di "debug", ma ho un'applicazione che chiama la funzione di debug dal modulo lager come: lager: debug (Str, args)La funzione Erlang non esiste nel modulo?

I sono principiante in Erlang ma so quando chiamiamo una funzione da un modulo lile "mymodule: myfunction" ci dovrebbe essere una funzione con nome "myfunction" nel file mymodule.erl ma in questo caso quando cerco in lager.erl per la funzione " debug "Non riesco a trovarlo.

risposta

0

Non lo si vede nel file lager.erl perché si trova nel file lager.hrl incluso nella parte superiore di lager.erl. Erlang ti permette di includere un file con la direttiva -include ("filename.hrl"). Come convenzione i file include terminano in un'estensione hrl, ma potrebbe davvero essere qualsiasi cosa.

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

+0

Ma nel file di intestazione non esiste alcuna funzione con il nome "debug". In quell'intestazione c'è: -define (LIVELLI, [debug, informazioni, avviso, avviso, errore, critico, avviso, emergenza, nessuno]). Non riesco a trovare una funzione con il nome "debug". Perché in un'altra applicazione chiama "debug" come: lager: debug (parametro1, parametro2). –

6

La ragione per cui non si vede una menzione di lager:debug/2 è perché utilizza un lager parse trasformare. Quindi, durante la compilazione del codice, viene alimentato tramite la trasformazione di lagers parse e la chiamata a lager:debug/2 viene sostituita con un'altra chiamata a un'altra funzione del modulo.

Se si compila il codice con l'opzione di analisi di analisi corretta per lager, il codice funzionerà.

1

"DARE RISPOSTE CRAPATE" ha fornito una buona spiegazione di questo strano comportamento. I post qui un codice che dovrebbe mostrare quale fosse il codice generato nel file fascio:

Nella shell:

utility: decompilare ([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). 
Problemi correlati