2011-02-06 4 views

Odpowiedz

30

Erlang 19.0+

obsługi makro ?FUNCTION_NAME uzyskać nazwę aktualnej funkcji, jak atom lub ?FUNCTION_ARITY uzyskać Arity jako liczbę całkowitą.

przykład:

main()->  
    myFunction(). 

myFunction()-> 
    io:write("I am ~p !",[?FUNCTION_NAME]). 

ten został zrealizowany w EEP-0045.

Starsze Erlang Wersje

W starszych wersjach Erlang, nie ma prosty sposób, aby uzyskać aktualną nazwę funkcji w czasie kompilacji. Można jednak odzyskać go w czasie wykonywania:

{current_function, {M, F, A}} = process_info(self(), current_function) 

Gdzie A jest arity (liczba argumentów), a nie rzeczywiste argumenty. Pierwszy argument do process_info/2 to identyfikator procesu, który może być bieżącym procesem (self()) lub innym procesem. Na przykład:

1> process_info(self(), current_function). 
{current_function,{erl_eval,do_apply,5}} 

Uwaga jednak, że o ile byłoby to równoważne funkcjonalnie ?FUNCTION_NAME makro, to o wiele wolniej, ponieważ jest oceniana w czasie pracy.

+1

Teraz dostępne są makra '? FUNCTION_NAME' i'? FUNCTION_ARITY': http://erlang.org/doc/reference_manual/macros.html#id85926 – Stratus3D

+0

@ Stratus3D Dzięki! Zaktualizowałem odpowiedź –

5

w środowisku wykonawczym można rzucić wyjątek i sprawdzić szczyt stosu.

foo() -> 
    catch throw(away), 
    [{Module, Fun, Arity} | _] = erlang:get_stacktrace(), 
    io:format("I am ~p:~p/~p!~n",[Module, Fun, Arity]).