Как получить название функции? - PullRequest
18 голосов
/ 06 февраля 2011

Можно ли узнать название функции самой по себе?

main()->    
  myFunction().

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

Ответы [ 2 ]

31 голосов
/ 07 февраля 2011

Эрланг 19,0 +

Используйте макрос ?FUNCTION_NAME, чтобы получить имя текущей функции в качестве атома, и ?FUNCTION_ARITY, чтобы получить целое число в виде целого числа.

Пример:

main()->    
  myFunction().

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

Это было реализовано в EEP-0045 .

Старые версии Erlang

В более старых версиях Erlang нет простого способа получить текущее имя функции во время компиляции. Однако вы можете получить его во время выполнения:

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

Где A - арность (количество аргументов), а не фактические аргументы. Первый аргумент process_info/2 - это идентификатор процесса, который может быть либо текущим процессом (self()), либо другим процессом. Например:

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

Обратите внимание, что хотя это будет функционально эквивалентно макросу ?FUNCTION_NAME, он намного медленнее, потому что оценивается во время выполнения.

5 голосов
/ 06 февраля 2011

во время выполнения вы можете выдать исключение и проверить верхнюю часть трассировки стека.

foo() ->
    catch throw(away),
    [{Module, Fun, Arity} | _] = erlang:get_stacktrace(),
    io:format("I am ~p:~p/~p!~n",[Module, Fun, Arity]).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...