2010-09-17 16 views
7

L'include directive est généralement utilisé pour un fichier .hrl en haut d'un fichier .erl.Erlang: utiliser include depuis la console?

Mais, je voudrais utiliser include depuis la console Erlang directement. J'essaie d'utiliser certaines fonctions dans un module. J'ai compilé le fichier erl depuis la console. Mais, les fonctions que je veux utiliser ne fonctionnent pas sans accès au fichier hrl.

Des suggestions?

+0

Comment voulez-vous vraiment dire? La directive '-include' est une fonctionnalité compiletime. Si vous avez compilé avec succès le fichier, alors toutes les fonctions qui ont besoin de "choses" à partir du fichier include les auront, le compilateur vérifie cela. Ainsi, après la compilation, les fonctions fonctionneront sans accès au fichier d'inclusion. Qu'est-ce qui ne marche pas? Quel accès vous manque? – rvirding

+0

Je cherche à installer jsonerl qui a un fichier hrl (http://github.com/lambder/jsonerl). Au lieu d'écrire un fichier puis de le compiler, j'aimerais utiliser les fonctions du fichier hrl directement à partir du shell. –

Répondre

2

Avez-vous essayé l'option compile:file? Vous pouvez passer une liste de modules à inclure ainsi:

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

qu'est-ce que le premier élément du tuple dans la liste représente .. je? Je suppose que le second élément pourrait représenter le chemin du fichier .hrl ... –

+0

L'atome 'i', indiquant que le second élément doit être inclus. –

+0

merci manoj ... cela fonctionne probablement. mais pour mon cas d'utilisation, il ne semble pas. Je suis essayer d'exécuter ce module à partir de la console erlang http://github.com/lambder/jsonerl –

8

« Mais, les fonctions que je veux utiliser ne fonctionne pas sans avoir accès au fichier HRL. »

Cela ne peut pas être vrai, mais à partir de là, je vais tenter de deviner que vous voulez accéder aux enregistrements dans le fichier hrl que vous n'avez pas (normalement) dans le shell.

Si vous faites rr(MODULE), vous allez charger tous les enregistrements définis dans MODULE (y compris ceux définis dans un fichier inclus inclus par MODULE).

Ensuite, vous pouvez faire tout ce dont vous avez besoin de la coque.

(Une autre chose que vous pouvez souhaiter pour le test est d'ajouter la ligne -compile(export_all) à votre fichier erl. Laid, mais bon parfois pour les tests.)

2

Il ne vaut rien que jsonerl.hrl ne contient pas de fonctions . Il contient des macros. Pour autant que je sache, les macros sont une construction compilable dans Erlang. Le moyen le plus simple de les rendre disponibles serait de créer vous-même un fichier .erl qui déclare en fait les fonctions implémentées en termes de macro. Peut-être quelque chose comme ceci:

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

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

... qui, après la compilation, vous pouvez appeler comme:

jsonerl_helpers:record_to_struct_f(RecordName, Record) 

Je ne sais pas pourquoi l'auteur a choisi de mettre en œuvre les macros comme; Cela semble étrange, mais je suis sûr qu'il avait ses raisons.

Questions connexes