Фильтрация таблиц без использования защитных предложений - PullRequest
0 голосов
/ 16 января 2019

В elixir я бы хотел иметь возможность фильтровать таблицу ets с помощью функции.

В настоящее время у меня есть простой пример таблицы ets в оболочке iex ...

iex> :ets.new(:nums, [:named_table])
:nums

iex> :ets.insert :nums, [{1}, {2}, {3}, {4}, {5}]
true

fun = :ets.fun2ms(fn {n} when n < 4 -> n end)
[{{:"$1"}, [{:<, :"$1", 4}], [:"$1"]}]
:ets.select(:nums, fun)
[1, 3, 2]

Все это работает так, как вы ожидаете. Мой вопрос касается функции, используемой для запроса таблицы ETS. В настоящее время он использует защитное предложение для фильтрации результатов менее 4.

Я хотел бы знать, есть ли способ поместить синтаксис предложения guard в тело функции. Например ...

iex> fun2 = :ets.fun2ms(fn {n} -> if n < 4, do: n end)

но если я сделаю это, то получу следующую ошибку ...

Error: the language element case (in body) cannot be translated into match_spec
{:error, :transform_error}

Возможно ли что-то подобное?

1 Ответ

0 голосов
/ 16 января 2019

Оказывается, это единственный путь

Из erlang документации

Веселье очень ограничено, оно может принимать только один параметр (объект для сопоставления): единственную переменную или кортеж. Он должен использовать тесты is_ guard. Языковые конструкции, которые не имеют представления в спецификации соответствия (if, case, receive и т. Д.), Не допускаются.

Больше информации о характеристиках соответствия в Erlang

...