2012-10-12 11 views
5

W lager.elr (główny moduł https://github.com/basho/lager) nie ma funkcji o nazwie "debug", ale mam aplikację, która wywołanie funkcji debugowania z modułem lager jak: lager: debug (Str, args)Funkcja Erlang nie istnieje w module?

I Jestem początkujący w Erlangu, ale wiem, że kiedy wywołujemy funkcję z modułu lile "mymodule: myfunction" powinna istnieć funkcja o nazwie "myfunction" w pliku mymodule.erl, ale w tym przypadku, gdy szukam w lager.erl dla funkcji " debugowanie "Nie mogę tego znaleźć.

Odpowiedz

0

Nie widać tego w pliku lager.erl, ponieważ znajduje się on w pliku lager.hrl, który znajduje się na górze strony lager.erl. Erlang umożliwia dołączenie pliku z dyrektywą -include ("filename.hrl"). Jako konwencja pliki include kończą się rozszerzeniem hrl, ale może to być cokolwiek.

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

+0

Ale w pliku nagłówkowym nie ma funkcji o nazwie "debugowanie". W tym nagłówku znajduje się: -define (LEVELS, [debugowanie, informacja, ogłoszenie, ostrzeżenie, błąd, krytyczny, alarm, alarm, brak]). Nie mogę znaleźć funkcji z nazwą "debugowania". Ponieważ w innej aplikacji wywołuje "debugowanie" jak: lager: debug (parametr1, parametr2). –

6

Powodem nie widzę wzmianki o lager:debug/2 dlatego lager używa analizowania przekształcić. Więc podczas kompilacji kodu, jest on podawany przez lagers parsować transformację, a wywołanie lager:debug/2 jest zastępowane innym wywołaniem innej funkcji modułu.

Jeśli skompilujesz swój kod z poprawną opcją przekształcania pars dla lager, kod zadziała.

1

"PODAJEMY ODPOWIEDZI NA KASEK" dało dobre wytłumaczenie tego dziwnego zachowania. I post tutaj kod, który powinien pokazać, jaki był wygenerowany kod w pliku wiązki:

W powłoce:

użyteczność: dekompilować ([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).