Nella shell Erlang, come posso leggere automaticamente tutti i miei intestazioni definizione del record
-
28-09-2019 - |
Domanda
Questa iniziato come la domanda:
Quasi ogni volta che quando uso il guscio Erlang, vorrei eseguire alcuni comandi all'avvio della shell, per esempio qualcosa come
rr("*.hrl").
o simili. Attualmente ho digitare ogni volta che inizio un guscio Erlang e mi sto stancando di esso e dimenticare tutto il tempo.
Ma questo era in realtà la domanda sbagliata! Per quello che ho in realtà volevo fare è leggere le mie intestazioni Definition Record in ogni lavoro di shell. Non usare per altre del guscio built-in comandi da eseguire all'avvio. Così ho cambiato l'intestazione domanda per mostrare la questione come avrebbe dovuto chiedere.
Soluzione
Durante il tentativo della soluzione con .erlang ho inciampato su una soluzione per la specifica rr / 1 utilizzo:
Dalla pagina man di shell:
C'è qualche supporto per la lettura e la stampa di record nel guscio. Durante la compilazione di record espressioni sono tradotti in tuple espres- sioni. In fase di esecuzione non è noto se una tupla rappresenta infatti una disco. Né sono le definizioni di record utilizzati da compilatore disponibile all'indirizzo runtime. Quindi, al fine di leggere la sintassi di registrazione e stampare tuple come registra quando possibile, le definizioni di record devono essere mantenute da parte del serbatoio stesso. I comandi di shell per la lettura, definendo, dimenticanza, sfogliare e stampare i record sono descritti di seguito. Si noti che ogni lavoro ha una propria serie di definizioni di record. Per facilitare le cose registrare definizioni nei moduli shell_default e USER_DEFAULT (se caricato) sono leggere ogni volta che si avvia un nuovo lavoro. Per esempio, aggiungendo la riga
-include_lib("kernel/include/file.hrl").
per USER_DEFAULT rende la definizione di un file_info prontamente disponibili il guscio.
Per chiarimenti aggiungo qualche esempio:
foo.hrl
file:
-record(foo, {bar, baz=5}).
File: user_default.erl
:
-module(user_default).
-compile(export_all).
-include("foo.hrl"). % include all relevant record definition headers here
%% more stuff probably ...
Consente di provare nella 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}
→ guscio conosce il record dal foo.hrl
Altri suggerimenti
Il .erlang
file viene valutato quando si avvia la shell, ma è non valutata nel contesto del guscio. Ciò significa che esso può contenere solo espressioni generali che vengono valutati e comandi non shell. Purtroppo rr()
è un comando di shell (si inizializza i dati della shell locali a riconoscere record) e quindi non può essere utilizzato nel file .erlang
.
Mentre l'utente definito user_default
modulo, che deve essere precaricato, può includere i file che contengono le definizioni di record utilizzando -include
o -include_lib
, queste definizioni di record saranno quindi disponibili per funzioni definite all'interno user_default
solo. user_default
è compilato modulo normale e funzioni esportate in esso sono chiamati come altre funzioni così le definizioni di record non saranno visibili all'interno del guscio. user_default
consente all'utente di definire funzioni più complesse che possono essere chiamati dall'interno del guscio come comandi shell.
EDIT:
Sono stato parzialmente sbagliato qui. Mentre ero corretta di come .erlang
viene valutata e in che modo le funzioni in user_default
sono chiamate che ho perso come user_default.erl
viene analizzato all'avvio della shell per le definizioni di record che sono poi disponibili all'interno del guscio. Grazie @Peer Stritzinger per la puntualizzazione.
Inserisci nel file chiamato .erlang
nella propria home directory (si veda il paragrafo 1.7.1 in http://www.erlang.org/documentation/doc-5.2/doc/getting_started/getting_started.html ).