Nella shell Erlang, come posso leggere automaticamente tutti i miei intestazioni definizione del record

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

  •  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.

È stato utile?

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 ).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top