elixir

¿Cuál es el número que aparece después de definir una función anónima en elixir?



(1)

Cuando define una función anónima en elixir, obtiene un resultado como este.

#Function<6.90072148/1 in :erl_eval.expr/5>

Lo que he notado es que el número se basa en la aridad de la función. Así que una función de 1 arg es siempre

#Function<6.90072148/1 in :erl_eval.expr/5>

Una función de dos arg es siempre

#Function<12.90072148/2 in :erl_eval.expr/5>

Una función de tres arg es siempre

#Function<18.90072148/3 in :erl_eval.expr/5>

¿Cuál es el número que se devuelve y cómo se obtiene?


El número consiste en el índice y un nombre único de la función, que son generados por el compilador. Eche un vistazo a la implementación del protocolo de inspección para las funciones . Contiene este pasaje:

"#Function<#{uniq(fun_info)}/#{fun_info[:arity]} in " <> "#{Inspect.Atom.inspect(mod)}#{extract_name(fun_info[:name])}>"

donde fun_info refiere al resultado de una llamada previa a :erlang.fun_info . Esto se traduce libremente en el siguiente pseudocódigo, donde todos los valores interpolados se refieren a elementos de fun_info :

"#Function<#{new_index}.#{uniq}/#{arity} in #{module}.#{name}>"

Como has observado correctamente, la parte después de / indica la aridad. module y el name muestran dónde se definió la función. new_index es un puntero a la tabla de funciones del módulo, y uniq es un valor hash del módulo generado por el compilador. Cuando invoque :erlang.fun_info para una función, podrá reconocer los valores de la cadena de inspección:

iex> fun = fn x -> x end #Function<6.90072148/1 in :erl_eval.expr/5> iex> fun_info = :erlang.fun_info(fun) [pid: #PID<0.58.0>, module: :erl_eval, new_index: 6, new_uniq: <<171, 204, ...>>, index: 6, uniq: 90072148, name: :"-expr/5-fun-4-", arity: 1, env: [...]]

El valor de uniq y el índice tomados juntos proporcionan una manera de identificar de manera única una función anónima. Tenga en cuenta que dentro de iex estos valores supuestamente únicos serán muy similares para todas las funciones que cree, pero cuando el código se compile "correctamente", serán únicos. Considere la siguiente sesión de iex:

iex> fn -> end #Function<20.90072148/0 in :erl_eval.expr/5> iex> fn -> end #Function<20.90072148/0 in :erl_eval.expr/5> iex> fn -> end #Function<20.90072148/0 in :erl_eval.expr/5>

Ahora compare eso con la ejecución del siguiente archivo con elixir fun.exs :

IO.inspect fn -> end IO.inspect fn -> end IO.inspect fn -> end # this prints #Function<0.120576197 in file:fun.exs> #Function<1.120576197 in file:fun.exs> #Function<2.120576197 in file:fun.exs>