Dans le shell Erlang, comment puis-je lire automatiquement toutes mes têtes de définition de disques

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

  •  28-09-2019
  •  | 
  •  

Question

a commencé comme la question:

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

rr("*.hrl").

ou similaire. À l'heure actuelle, je dois taper à chaque fois que je commence un shell Erlang et je suis en train de lasser et d'oublier tout le temps.

Mais c'était en fait la mauvaise question! Pour ce que je voulais vraiment faire est de lire mes têtes de définition record dans chaque emploi du shell. Ne pas utiliser pour d'autres de la coque intégrée des commandes à exécuter au démarrage. Alors je l'ai changé l'en-tête de question pour montrer la question de savoir comment il aurait dû demander.

Était-ce utile?

La solution

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

De l'homme-page de shell:

  

Il y a un certain soutien pour la lecture et l'impression des documents dans la coquille.         Lors de la compilation des expressions d'enregistrement sont convertis en tuple expres-         sions. Dans l'exécution on ne sait pas si un tuple représente en fait une         record. Ne sont les définitions d'enregistrement utilisées par le compilateur disponible         exécution. Ainsi, afin de lire la syntaxe d'enregistrement et d'imprimer uplets         enregistre la mesure du possible, les définitions enregistrement doivent être maintenues par la         la coquille elle-même. Les commandes de shell pour la lecture, la définition, l'oubli,         liste, et les dossiers d'impression sont décrits ci-dessous. Notez que chaque emploi         a son propre ensemble de définitions d'enregistrement. Pour faciliter les choses enregistrement         définitions dans les modules shell_default et user_default (si chargé)         sont lus chaque fois un nouvel emploi est démarré. Par exemple, en ajoutant la ligne

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

à user_default rend la définition de file_info facilement disponibles dans   la coquille.

Pour plus de précisions ajouter quelques exemples:

foo.hrl du fichier:

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

→ par le shell le dossier de foo.hrl

Autres conseils

Le .erlang de fichier 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 qui sont évaluées et non des commandes shell. Malheureusement rr() est une commande shell (il initialise les données shell locales à reconnaître les enregistrements) ne peut donc pas être utilisé dans le fichier .erlang.

Bien que l'utilisateur module défini user_default, qui doit être pré-chargé, peut inclure des fichiers qui contiennent des définitions en utilisant -include ou enregistrer -include_lib, ces définitions d'enregistrement seront alors disponibles que pour les fonctions définies dans user_default. user_default est normal et module compilé fonctions exportées en elle sont appelés comme toutes les autres fonctions de sorte que les définitions d'enregistrement ne sera pas visible à l'intérieur de la coquille. user_default permet à l'utilisateur de définir des fonctions plus complexes qui peuvent être appelées à partir de l'intérieur de l'enveloppe sous forme de commandes de shell.

EDIT:

J'étais en partie mal ici. Alors que j'avais raison sur la façon dont .erlang est évalué et comment les fonctions sont appelées user_default j'ai raté comment user_default.erl est analysé au démarrage shell pour les définitions enregistrement qui sont alors disponibles dans la coquille. Merci @Peer Stritzinger pour avoir signalé.

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top