Подтвердить что ты не робот

Как получить имя функции?

Возможно ли узнать имя самой функции?

main()->    
  myFunction().

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

Ответ 1

Erlang 19.0 +

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

Пример:

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, он намного медленнее, поскольку он оценивается во время выполнения.

Ответ 2

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

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