2016-02-17 27 views
6

Jaki jest kanoniczny sposób tworzenia "stałej tablicy" z dostępem losowym w języku Elixir? (na przykład stosowana w obliczeniach CRC lub AES skrzynki S)Jaki jest zalecany sposób na wyrównanie "tablicy stałej" w eliksiru?

Z Erlang tle I Załóżmy, że „tablica” powinien sam być krotka, ponieważ dostęp poprzez elem/2/element/2 wydaje O (1) (funkcja BIF_RETTYPE element_2(BIF_ALIST_2) w erts/emulator/beam/bif.c).

Ale co z zakresem przechowywania, ponieważ Erlang/Elixir nie ma globaliów? Mój nos mówi, że to miejsce to @module_attribute, ale nie jestem do końca pewien, gdzie i kiedy rozszerzono atrybuty @.

Znany jest problem z Erlang: po -define(LARGE_LIST,[...]) w module, a następnie użyj ?LARGE_LIST w funkcjach. Wartość jest ponownie konstruowana przy każdym wywołaniu funkcji. Rozwiązaniem było skonstruowanie go na początku uruchamiania aplikacji i przejście do funkcji wymagających go jako jednego z parametrów.

Czy produkt @module_attribute firmy Elixir rozwiązuje ten problem, czy jest traktowany jako fantazyjne rozszerzenie makr? Czytałem oficjalne dokumenty na module attributes, ale nadal jestem zdezorientowany.

Odpowiedz

7

Z dokumentacji wydaje się, że atrybuty modułu Elixir działają jak atrybuty modułu Erlang, tj. Są metadanymi modułu, które można pobrać przez Module:module_info(Attributes). To ostatecznie przechodzi w funkcję attributes_for_module w beam_load.c, która, o ile widzę, kopiuje dane za każdym razem, gdy jest dostępna. Zatem atrybut modułu nie byłby odpowiedni dla dużej części danych, do których często uzyskiwano dostęp.

Zamiast tego, napisałbym funkcję, która nie przyjmuje argumentów i po prostu zwraca krotkę. Krotka zostanie wkompilowana do puli stałej modułu, więc nie będzie ona odtwarzana za każdym razem, gdy funkcja zostanie wywołana; funkcja zasadniczo zwraca odniesienie do stałych danych. Jest to opisane w sekcji "Stała bilard" w the Erlang Efficiency Guide.