En el shell de Erlang, ¿cómo puedo leer automáticamente todos mis encabezados de registros de definición

StackOverflow https://stackoverflow.com/questions/4071788

  •  28-09-2019
  •  | 
  •  

Pregunta

Esto comenzó como la pregunta:

Casi todas las veces cuando se utiliza la cáscara de Erlang, me gustaría ejecutar algunos comandos en el arranque de la cáscara, por ejemplo, algo así como

rr("*.hrl").

o similares. En este momento tengo que escribirla cada vez que se inicia un shell de Erlang y yo estoy cansando de ella y olvidarse de él todo el tiempo.

Pero esto era en realidad la pregunta equivocada! Por lo que en realidad quería hacer es leer mis cabeceras definición de registro en cada puesto de trabajo cáscara. No utilizar para ninguna otra de la cáscara integrado en los comandos a ejecutar en el arranque. Así que cambió el encabezado de la pregunta para mostrar la pregunta de cómo se debería haber pedido.

¿Fue útil?

Solución

Al tratar la solución con .erlang I tropezó con una solución para el específico rr uso / 1:

Desde la página de manual de la cáscara:

  

Hay algo de apoyo a la lectura y la impresión registros en la cáscara.         Durante la compilación expresiones de registro se convierten a tupla expre-         siones. En tiempo de ejecución, no se sabe si una tupla representa en realidad una         grabar. Tampoco son las definiciones de registro utilizadas por el compilador disponible en         tiempo de ejecución. Así que con el fin de leer la sintaxis de registro e imprimir como tuplas         registra cuando sea posible, las definiciones de registro tienen que ser mantenidos por el         shell en sí. Los comandos shell para la lectura, la definición, el olvido,         registros del anuncio y la impresión se describen a continuación. Tenga en cuenta que cada puesto de trabajo         tiene su propio conjunto de definiciones de registro. Para facilitar el registro de los asuntos         definiciones de los módulos shell_default y user_default (si está cargado)         se leen cada vez que se inicia un nuevo trabajo. Por ejemplo, la adición de la línea

  -include_lib("kernel/include/file.hrl").
     

para user_default hace que la definición de en file_info fácilmente disponibles   la cáscara.

Para la clarificación añado algún ejemplo:

foo.hrl del archivo:

-record(foo, {bar, baz=5}).

Archivo: user_default.erl:

-module(user_default).
-compile(export_all).

-include("foo.hrl").  % include all relevant record definition headers here

 %% more stuff probably ...

Le permite probar en el shell:

$ erl
Erlang R13B04 (erts-5.7.5) [source] [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.7.5  (abort with ^G)
1> #foo{}.
#foo{bar = undefined,baz = 5}

? la cáscara sabe sobre el registro de foo.hrl

Otros consejos

El .erlang archivo se evalúa cuando se inicia la cáscara, pero es no evaluado en el contexto de la cáscara. Esto significa que sólo puede contener expresiones generales que son evaluados y los comandos no shell. Desafortunadamente rr() es un comando shell (que inicializa los datos de concha locales a reconocer registros) por lo que no se puede utilizar en el archivo .erlang.

Mientras que el usuario define user_default módulo, que debe ser precargado, puede incluir archivos que contienen las definiciones de registro utilizando -include o -include_lib, estas definiciones registro será entonces sólo estará disponible para funciones definidas dentro user_default. user_default se módulo compilado normal y funciones exportadas en ella se llama como cualesquiera otras funciones de modo que las definiciones de registro no serán visibles dentro de la cáscara. user_default permite al usuario definir funciones más complejas que pueden ser llamadas desde dentro de la cáscara como comandos shell.

EDIT:

Me estaba parcialmente mal aquí. Mientras estaba en lo cierto acerca de cómo se evalúa .erlang y cómo se llaman las funciones en user_default echaba de menos la forma en user_default.erl se escanea en el arranque de shell para las definiciones de registro que están entonces disponibles dentro de la cáscara. Gracias @Peer Stritzinger por señalar esto.

colocarlo en archivo llamado .erlang en su directorio (véase el párrafo 1.7.1 en http://www.erlang.org/documentation/doc-5.2/doc/getting_started/getting_started.html ).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top