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