Los campos pueden ser descritos como sigue:
foo:'-loop/4-lc$^2/1-3-'
^ ^^^ ^^^
1 2 3 4 5 6 7
- Nombre del módulo
- La función de encerramiento
- Arity de la función envolvente
- El tipo de diversión (
lc
= Lista de generador en una lista de comprensión, blc
= generador binario en una lista de comprensión, lbc
= generador de listas en una comprensión binaria, fun
= diversión)
- Índice de función dentro de la función (0 Basado)
- Arity de la función generada
- Índice de lambda función levantada dentro de la función que define
Preguntas abiertas definir: ¿cuál es el significado de los parámetros y valores de retorno de estas funciones?
Acabo de tropezar con this answer by Robert Virding a la misma pregunta en la lista de correo erlang-questions.
El código que crea estos nombres se reparte entre muchos módulos: sys_pre_expand
para las diversiones; v3_core
para funciones creadas para comprensión; y v3_kernel
que agrega más cuando lambda levanta las funciones. El objetivo de todo esto es crear nombres de funciones "únicos" que también den alguna indicación de por qué se crearon las funciones y por qué.
En sys_pre_expand.erl
hay proa código creación de nombres de función para las diversiones:
%% 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}}.
Estos nombres se transmiten y se expandieron en un pase posterior (v3_kernel).
De los compiladores 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}}.
Así que esto explica el "lc $^2" (partes 4 y 5) en el ejemplo. Al mirar los lugares donde se usa, se pueden deducir los valores posibles para la parte 4: lc
, blc
y lbc
.
En v3_kernel.erl
es la siguiente fase cuando estas funciones son lambda levantó:
%% 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}}.
Esto explica -loop/4-
(partes 2 y 3) y -3-
(Parte 7). La parte 6 se agrega en la llamada a este new_fun_name/2
.
(Este post es una wiki de la comunidad, por favor, añadir el resto de entradas si usted sabe lo que significan)
Debemos tener en cuenta el código que genera este ... –
Si diversiones en general están incluidos en la descripción anterior, 'diversión' es un tipo válido (intente colgar dentro de una diversión normal). –