2010-11-01 1 views
10

Ce qui a commencé comme la question:Dans le shell Erlang, comment puis-je lire automatiquement tous mes enregistrement de définition des en-têtes

Presque à chaque fois que j'utilise le shell Erlang, je voudrais lancer une commande au démarrage du shell , par exemple quelque chose comme

rr("*.hrl"). 

Ou similaire. Actuellement, je dois le taper à chaque fois que je démarre un shell Erlang et j'en ai marre et je l'oublie tout le temps.

Mais c'était en fait la mauvaise question! Pour ce que je voulais réellement faire est de lire mes en-têtes de définition d'enregistrement dans chaque travail shell. Ne pas utiliser pour l'exécution d'autres commandes intégrées du shell au démarrage. J'ai donc changé l'en-tête de la question pour montrer comment elle aurait dû être posée.

Répondre

13

Tout en essayant la solution avec .erlang je suis tombé sur une solution pour la rr spécifique/1 utilisation:

De l'homme-page de shell:

Il y a un certain soutien pour la lecture et l'impression enregistrements dans le shell. Lors de la compilation, les expressions d'enregistrement sont traduites en expressions de type tuple- . En exécution, on ne sait pas si un tuple représente réellement un enregistrement . Les définitions d'enregistrements utilisées par le compilateur ne sont pas non plus disponibles au runtime. Donc, afin de lire la syntaxe d'enregistrement et imprimer des tuples comme enregistrements lorsque cela est possible, les définitions d'enregistrement doivent être maintenues par le shell lui-même. Les commandes shell pour la lecture, la définition, l'oubli, la liste et les enregistrements d'impression sont décrits ci-dessous. Notez que chaque travail possède son propre jeu de définitions d'enregistrements. Pour faciliter les choses enregistrer définitions dans les modules shell_default et user_default (si chargé) sont lus chaque fois qu'un nouveau travail est démarré. Par exemple, en ajoutant la ligne

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

à user_default fait la définition de file_info facilement disponible dans la coquille.

Pour plus de précisions, j'ajouter quelques exemples:

fichier foo.hrl:

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

fichier: user_default.erl:

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

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

%% more stuff probably ... 

permet d'essayer dans la coquille:

$ 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} 

→ par le shell le dossier de foo.hrl

0

Placez-le dans le fichier appelé .erlang dans votre répertoire personnel (voir paragraphe 1.7.1 dans http://www.erlang.org/documentation/doc-5.2/doc/getting_started/getting_started.html).

+0

Pour l'exemple de rr(), j'ai du mal à faire ce travail. Pour un si je mets seulement la ligne comme indiqué ci-dessus en .erlang il ne trouve pas rr/1 et je ne sais pas dans quel module rr/1 est défini. D'un autre côté je ne suis pas sûr que ce sera disponible dans tous les emplois shell. –

+1

@Peer Stritzinger: 'rr()' n'est pas défini comme une fonction; vous pouvez le trouver dans 'stdlib/shell.erl' comme une clause de la fonction' local_func/7'. – Zed

+0

@Zed: oui c'était mon problème et je cherchais un moyen de l'appeler automatiquement de toute façon. Financer la solution de contournement dans ma réponse personnelle et comme je ne peux pas penser à aucune des pseudo-fonctions intégrées de shell nécessaires au démarrage, le problème est résolu pour moi par la solution de contournement. –

2

Le fichier .erlang est évalué lorsque le shell est lancé, mais il est pas évalué dans le contexte de la coquille.Cela signifie qu'il ne peut contenir que des expressions générales évaluées et non des commandes shell. Malheureusement, rr() est une commande shell (elle initialise les données de shell locales pour reconnaître les enregistrements), de sorte qu'elle ne peut pas être utilisée dans le fichier .erlang.

Bien que le module défini par l'utilisateur user_default, qui doit être pré-chargé, peut inclure des fichiers qui contiennent des définitions de l'enregistrement en utilisant -include ou -include_lib, ces définitions d'enregistrement seront alors disponibles que pour les fonctions définies dans user_default. user_default est un module compilé normal et les fonctions exportées sont appelées comme toutes les autres fonctions, de sorte que les définitions d'enregistrement ne seront pas visibles dans le shell. user_default permet à l'utilisateur de définir des fonctions plus complexes pouvant être appelées à partir du shell en tant que commandes shell.

EDIT:

J'étais partiellement mal ici. Bien que j'avais raison sur la façon dont .erlang est évalué et comment les fonctions de user_default sont appelées, j'ai manqué comment user_default.erl est analysé au démarrage du shell pour les définitions d'enregistrements qui sont alors disponibles dans le shell. Merci @Perer Stritzinger pour l'avoir signalé.

+0

Etes-vous sûr? Le texte de la page de manuel semble dire le contraire. Pour vérifier j'ai mis en place un petit cas de test (voir http://ideone.com/4Gau5) Comme il semble que cela semble fonctionner. Est-ce que je manque quelque chose? –

+0

Non, vous n'avez rien manqué. Je vérifiais le code et ne voyais que l'utilisation des fonctions dans 'shell_default' et' user_default' et manquais l'analyse faite d'eux au démarrage du shell. Mea culpa. – rvirding

Questions connexes