2010-11-01 18 views
10

Esto comenzó como la pregunta:En el shell de Erlang, ¿Cómo puedo leer automáticamente todos mis encabezados de registros de definición

Casi todas las veces cuando se utiliza la cáscara de Erlang, me gustaría ejecutar algún comando en arranque del shell , p.ej algo así como

rr("*.hrl"). 

O similar. Actualmente tengo que escribirlo cada vez que comienzo un shell de Erlang y me estoy cansando de eso y lo olvido todo el tiempo.

Pero ¡Esta fue en realidad la pregunta equivocada! Por lo que realmente quería hacer es leer mis encabezados de definición de registros en cada trabajo de shell. No se usa para que otros comandos internos del shell se ejecuten al inicio. Así que cambié el encabezado de la pregunta para mostrar la pregunta de cómo debería haberlo hecho.

Respuesta

13

Al tratar la solución con .erlang yo nos topamos con una solución específica para la rr/1 Uso:

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

Hay una cierta ayuda para su lectura e impresión registros en el caparazón. Durante la compilación, las expresiones de registro se traducen a tuple expres- sions. En tiempo de ejecución, no se sabe si una tupla en realidad representa un registro . Tampoco están disponibles las definiciones de registro utilizadas por el compilador en runtime. Entonces, para poder leer la sintaxis del registro e imprimir tuplas como registros cuando sea posible, las definiciones de registros deben ser mantenidas por el propio shell . Los comandos de shell para leer, definir, olvidar, enumerar e imprimir registros se describen a continuación. Tenga en cuenta que cada trabajo tiene su propio conjunto de definiciones de registros. Para facilitar las cosas, registre las definiciones en 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"). 

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

Para mayor claridad que añadir un poco de ejemplo:

Archivo foo.hrl:

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

del archivo: user_default.erl:

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

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

%% more stuff probably ... 

Vamos a tratar 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

0

Colóquelo en el archivo llamado .erlang en su directorio de inicio (consulte el párrafo 1.7.1 en http://www.erlang.org/documentation/doc-5.2/doc/getting_started/getting_started.html).

+0

Para el ejemplo de rr() tengo dificultad para hacer que esto funcione. Por ejemplo, si solo coloco la línea como se indicó anteriormente en .erlang, no encuentra rr/1 y no sé en qué módulo se define rr/1. Por otro lado, no estoy seguro de que esté disponible. en todos los trabajos de shell. –

+1

@Peer Stritzinger: 'rr()' no está definido como una función; puedes encontrarlo en 'stdlib/shell.erl' como una cláusula de la función' local_func/7'. – Zed

+0

@Zed: sí, ese era mi problema y estaba buscando una forma de llamarlo automáticamente de todos modos. Financie la solución en mi auto-respuesta y como no puedo pensar en ninguna de las pseudo funciones incorporadas al shell necesarias para el inicio, la solución resuelve el problema para mí. –

2

.erlang El archivo se evalúa cuando se inicia la cáscara, pero es NO evaluado en el contexto de la cáscara.Esto significa que solo puede contener expresiones generales que se evalúan y no comandos de shell. Desafortunadamente rr() es un comando de shell (inicializa datos de shell local para reconocer registros) por lo que no se puede utilizar en el archivo .erlang.

Mientras que el módulo definido por el usuario user_default, que debe ser precargado, puede incluir archivos que contienen las definiciones de registro utilizando -include o -include_lib, estas definiciones de registro a continuación, sólo estarán disponibles para las funciones definidas dentro user_default. user_default es un módulo compilado normal y las funciones exportadas se llaman como cualquier otra función, por lo que las definiciones de registro no serán visibles dentro del shell. user_default le permite al usuario definir funciones más complejas que se pueden llamar desde dentro del shell como comandos de shell.

EDITAR:

Estaba parcialmente mal aquí. Si bien tenía razón acerca de cómo se evalúa .erlang y cómo se llaman las funciones en user_default, me olvidé de cómo se escanea user_default.erl al inicio del shell para definiciones de registros que luego están disponibles dentro del shell. Gracias @Peer Stritzinger por señalar esto.

+0

¿Estás seguro? El texto de la página de manual parece decir lo contrario. Para verificar configuré un pequeño estuche de prueba (ver http://ideone.com/4Gau5) A medida que se ve, parece funcionar. ¿Me estoy perdiendo de algo? –

+0

No, no te has perdido nada. Estaba comprobando el código y solo vi el uso de las funciones en 'shell_default' y' user_default' y me salté el escaneo hecho de ellas al inicio del shell. Mea culpa. – rvirding

Cuestiones relacionadas