Как читать / декодировать временные имена функций понимания списка в Erlang при отладке - PullRequest
6 голосов
/ 16 мая 2011

При отладке модуля (например, foo) с использованием списков временные имена функций, например,

foo:'-loop/4-lc$^2/1-3-'

, можно найти в выходных данных трассировки или сообщениях об ошибках.Если в модуле много списочных представлений, часто трудно определить, какой из них запущен.

Как можно интерпретировать имя функции?

Каково значение параметров вызова этих функций?

Что означает возвращаемое значение?

1 Ответ

7 голосов
/ 16 мая 2011

Поля можно описать следующим образом:

foo:'-loop/4-lc$^2/1-3-'
^     ^    ^ ^   ^ ^ ^
1     2    3 4   5 6 7
  1. Имя модуля
  2. Функция ограждения
  3. Арность функции включения
  4. Тип веселья (lc = генератор списка в понимании списка, blc = бинарный генератор в понимании списка, lbc = генератор списка в двоичном понимании, fun = веселье)
  5. Индекс функции в определяющей функции (на основе 0)
  6. Арность сгенерированной функции
  7. Индекс лямбда-поднятой функции в пределах определяющей функции

Открытые вопросы: что означают параметры и возвращаемые значения этих функций?

Только что наткнулся на этот ответ Роберта Вирдинга на тот же вопрос в списке рассылки erlang-questions.


Код, который создает эти имена, распространяется среди многих модулей: sys_pre_expand для приколов; v3_core для функций, созданных для понимания; и v3_kernel, который добавляет больше, когда лямбда поднимает функции. Целью всего этого является создание «уникальных» имен функций, которые также дают некоторое представление о том, почему функции были созданы и почему.

В sys_pre_expand.erl есть код для создания имен функций для забав:

%% new_fun_name(State) -> {FunName,State}.

new_fun_name(#expand{func=F,arity=A,fcount=I}=St) ->
    Name = "-" ++ atom_to_list(F) ++ "/" ++ integer_to_list(A)
        ++ "-fun-" ++ integer_to_list(I) ++ "-",
    {list_to_atom(Name),St#expand{fcount=I+1}}.

Эти имена передаются и расширяются в последующем проходе (v3_kernel).

Из компиляторов v3_core.erl:

%% new_fun_name(Type, State) -> {FunName,State}.

new_fun_name(Type, #core{fcount=C}=St) ->
    {list_to_atom(Type ++ "$^" ++ integer_to_list(C)),St#core{fcount=C+1}}.

Таким образом, это составляет "lc $ ^ 2" (части 4 и 5) в примере. При рассмотрении мест, где он используется, можно определить возможные значения для части 4: lc, blc и lbc.

In v3_kernel.erl - следующая фаза, когда эти функции лямбда-функции отменены:

%% new_fun_name(Type, State) -> {FunName,State}.

new_fun_name(Type, #kern{func={F,Arity},fcount=C}=St) ->
    Name = "-" ++ atom_to_list(F) ++ "/" ++ integer_to_list(Arity) ++
    "-" ++ Type ++ "-" ++ integer_to_list(C) ++ "-",
    {list_to_atom(Name),St#kern{fcount=C+1}}.

Это составляет -loop/4- (части 2 и 3) и -3- (часть 7). Часть 6 добавлена ​​в призыв к этому new_fun_name/2.


(Этот пост является вики сообщества, добавьте другие записи, если вы знаете, что они имеют в виду)

...