2016-02-17 12 views
6

Qual è il modo canonico di creare un "const array" con accesso casuale in linguaggio Elixir? (Per esempio quello utilizzato nei calcoli CRC, o AES s-box)Qual è il modo consigliato per rendere equivalente a "const array" in Elixir?

Da Erlang sfondo assumo, che "matrice" si dovrebbe essere un tupla, l'accesso tramite elem/2/element/2 sembra essere O (1) (funzione BIF_RETTYPE element_2(BIF_ALIST_2) in erts/emulator/beam/bif.c).

Ma per quanto riguarda lo spazio di archiviazione, poiché Erlang/Elixir non ha globali? Il mio naso dice che @module_attribute sarebbe il posto, ma non sono abbastanza sicuro di dove e quando gli attributi vengono espansi.

C'è un problema noto di Erlang: quando si usa il modulo -define(LARGE_LIST,[...]) e poi si usa ?LARGE_LIST nelle funzioni. Il valore viene ricostruito ad ogni chiamata di funzione. La soluzione era di costruirlo una volta all'avvio dell'applicazione e passare a funzioni che lo richiedono come uno dei parametri.

@module_attribute di Elisir risolve questo problema o viene trattato come espansione macro fantasia? Ho letto documenti ufficiali su module attributes, ma sono ancora confuso.

risposta

7

Dalla documentazione, sembra che gli attributi del modulo Elixir funzionino come gli attributi del modulo Erlang, vale a dire che sono metadati del modulo che possono essere recuperati da Module:module_info(Attributes). Questo alla fine entra nella funzione attributes_for_module in beam_load.c, che per quanto posso vedere copia i dati ogni volta che si accede. Pertanto, un attributo di modulo non sarebbe adatto per un grande pezzo di dati frequentemente consultati.

Invece, vorrei scrivere una funzione che non accetta argomenti e restituisce semplicemente la tupla. La tupla verrà compilata nel pool costante del modulo, quindi non verrà ricostruita ogni volta che viene chiamata la funzione; la funzione restituisce essenzialmente un riferimento ai dati costanti. Questo è descritto nella sezione "Pool costante" in the Erlang Efficiency Guide.

Problemi correlati