Erlang: вычислить литеральную структуру данных (постоянную) во время компиляции? - PullRequest
4 голосов
/ 07 февраля 2012

Это может быть наивный вопрос, и я подозреваю, что ответ "да", но мне не повезло искать здесь и в других местах такие термины, как "константы оптимизации компилятора erlang" и т. Д.

В любом случае,может (будет) компилятор erlang создавать структуру данных, которая является постоянной или литеральной во время компиляции, и использовать ее вместо создания кода, который создает структуру данных снова и снова?Я приведу простой пример с игрушкой.

test() -> sets:from_list([usd, eur, yen, nzd, peso]).

Может ли (будет) компилятор просто вставлять набор туда на выходе функции вместо того, чтобы вычислять его каждый раз?

Причина, по которой яСпросите, я хочу иметь таблицу поиска в программе, которую я разрабатываю.Таблица - это просто константы, которые можно вычислить (хотя бы теоретически) во время компиляции.Я хотел бы просто вычислить таблицу один раз, и не нужно вычислять ее каждый раз.Я знаю, что мог бы сделать это другими способами, например вычислить вещь и сохранить ее, например, в словаре процесса (или, возможно, в таблице ets или mnesia).Но я всегда начинаю с простого, и для меня самое простое решение - сделать это, как в примере с игрушкой выше, если компилятор оптимизирует его.

Если это не сработает, есть ли какой-то другой способ добиться того, что яхочу?(Полагаю, я мог бы изучить преобразования, если бы они работали для этого, но это становится сложнее, чем хотелось бы?)

ЭТО ПРОСТО В.Я использовал compile: file / 2 с опцией 'S' для получения следующего.Я не эксперт по сборке erlang, но похоже, что оптимизация не выполнена:

{function, test, 0, 5}.
{label,4}.
    {func_info,{atom,exchange},{atom,test},0}.
  {label,5}.
    {move,{literal,[usd,eur,yen,nzd,peso]},{x,0}}.
    {call_ext_only,1,{extfunc,sets,from_list,1}}.

Ответы [ 3 ]

4 голосов
/ 08 февраля 2012

Нет, компилятор erlang не выполняет частичную оценку вызовов внешних модулей, которыми является set.Вы можете использовать ct_expand модуль знаменитых parse_trans для достижения этого эффекта.

1 голос
/ 07 февраля 2012

Как вы могли видеть, наборы не оптимизированы в erlang (как любая другая библиотека, написанная в erlang). Способ решения вашей проблемы - один раз вычислить набор и передать его в качестве параметра функциям или использовать ETS / Mnesia.

1 голос
/ 07 февраля 2012

при условии, что этот набор не является собственным типом данных для erlang, и (на самом деле) это просто библиотека, написанная на erlang, я не думаю, что компилятору целесообразно создавать наборы во время компиляции.

...