2010-09-17 17 views
7

El include directive se usa generalmente para un archivo .hrl en la parte superior de un archivo .erl.Erlang: ¿usar include desde la consola?

Pero me gustaría utilizar include desde la consola Erlang directamente.

Estoy tratando de usar algunas funciones en un módulo. He compilado el archivo erl desde la consola. Pero las funciones que quiero usar no funcionan sin acceso al archivo hrl.

¿Alguna sugerencia?

+0

¿Qué quiere decir realmente? La directiva '-include' es una función de compilación. Si ha compilado satisfactoriamente el archivo, entonces las funciones que necesiten "cosas" del archivo de inclusión lo tendrán, el compilador lo comprobará. Entonces, después de la compilación, las funciones funcionarán sin acceso al archivo de inclusión. ¿Qué es eso que no funciona? ¿Qué acceso es el que le falta? – rvirding

+0

Estoy buscando para instalar jsonerl que tiene un archivo hrl (http://github.com/lambder/jsonerl). En lugar de escribir un archivo y luego compilarlo, me gustaría utilizar las funciones en el hrl fiel directamente desde el shell. –

Respuesta

2

¿Has probado la opción compile:file? Puede pasar una lista de módulos que deben incluirse por lo tanto:

compile:file("myfile.erl", [{i, "/path/1/"}, {i, "/path/2/"}]) 
+0

¿qué representa el primer elemento de la tupla en la lista .. i? Supongo que el segundo elemento podría representar la ruta del archivo .hrl ... –

+0

El átomo 'i', lo que indica que se debe incluir el segundo elemento. –

+0

gracias manoj ... esto probablemente funcione. pero para mi caso de uso, parece que no. Estoy tratando de ejecutar este módulo desde la consola de erlang http://github.com/lambder/jsonerl –

8

"Sin embargo, las funciones que quiero usar no funcionan sin acceso al archivo HRL"

Esto no puede ser cierto, pero a partir de esto voy a intentar adivinar que desea acceder a los registros en el archivo hrl que no tiene (normalmente) en el shell.

Si hace rr(MODULE) cargará todos los registros definidos en MODULE (incluidos los definidos en un archivo incluido incluido en MODULE).

Luego puede hacer todo lo que necesita desde el armazón.

(Otra cosa que usted puede desear para las pruebas es añadir la línea -compile(export_all) a su archivo erl. Feo, pero bueno a veces para la prueba.)

2

Es destacable que jsonerl.hrl no contiene ninguna función . Contiene macros. Hasta donde yo sé, las macros son una construcción de solo tiempo de compilación en Erlang.

La forma más fácil de hacer que estén disponibles sería crear un archivo .erl usted mismo que realmente declara las funciones que se implementan en términos de la macro. Tal vez algo como esto:

-module(jsonerl_helpers). 
-include("jsonerl.hrl"). 

record_to_struct_f(RecordName, Record) -> 
    ?record_to_struct(RecordName, Record). 

... que, después de compilar, se podría llamar como:

jsonerl_helpers:record_to_struct_f(RecordName, Record) 

no sé por qué el autor eligió implementar los macros; parece extraño, pero estoy seguro de que tenía sus razones.

Cuestiones relacionadas