2011-05-16 22 views
6

Al depurar un módulo (por ejemplo, foo) con listas de nombres de funciones temporales de comprensión, p.Cómo leer/descodificar nombres de funciones temporales de comprensión de listas en Erlang al depurar

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

se pueden encontrar en la salida de rastreo o mensajes de error. Si hay muchas listas de comprensión en un módulo, a menudo es difícil averiguar cuál se está ejecutando.

¿Cómo se puede interpretar el nombre de la función?

¿Cuál es el significado de los parámetros de llamada de estas funciones?

¿Cuál es el significado del valor de retorno?

Respuesta

7

Los campos pueden ser descritos como sigue:

foo:'-loop/4-lc$^2/1-3-' 
^ ^^^ ^^^
1  2 3 4 5 6 7 
  1. Nombre del módulo
  2. La función de encerramiento
  3. Arity de la función envolvente
  4. 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)
  5. Índice de función dentro de la función (0 Basado)
  6. Arity de la función generada
  7. Í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)

+0

Debemos tener en cuenta el código que genera este ... –

+0

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). –

Cuestiones relacionadas