2011-02-06 10 views

答えて

30

アーラン19.0+

整数としてアリティを取得する原子として現在の関数の名前、および?FUNCTION_ARITYを取得するマクロ?FUNCTION_NAMEを使用。

例:

main()->  
    myFunction(). 

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

これはEEP-0045で実施されました。古いErlangのバージョンでは

古いErlangのバージョン

、コンパイル時に現在の関数名を取得する簡単な方法はありません。ただし、実行時にそれを取得することができます。

Aはアリティ(引数の数)ではなく、実引数である
{current_function, {M, F, A}} = process_info(self(), current_function) 

process_info/2の最初の引数は、現在のプロセス(self())または他のプロセスのいずれかになるプロセスIDです。たとえば:

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

注しかし、これは?FUNCTION_NAMEマクロと機能的に同等になりながら、それははるかに遅いということは、実行時に評価されるため。

+1

'?FUNCTION_NAME'と'?FUNCTION_ARITY'マクロが存在します:http://erlang.org/doc/reference_manual/macros.html#id85926 – Stratus3D

+0

@ Stratus3Dありがとうございました!私は答えを更新しました –

5

実行時に、例外をスローしてスタックトレースの先頭を確認することができます。

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