Dans le shell Erlang, comment puis-je lire automatiquement toutes mes têtes de définition de disques
-
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.
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 ).