Size: a a a

2020 July 18

SP

Sergey Prokhorov in ErlangRus
А более полный пример можно? С условиями, больше/меньше etc
источник

V

Vasya in ErlangRus
Sergey Prokhorov
А более полный пример можно? С условиями, больше/меньше etc
condition(<<"user.is_online && user.balance > 0 && config.check">>, #{user=>#{is_online=>true, balance=>100}, config=>#{}}) -> false.
источник

V

Vasya in ErlangRus
condition(<<"user.is_online || user.admin == true">>, #{user=>#{is_online=>true, balance=>100}, config=>#{}}) -> true.
источник

AK

Aleksey Kluchnikov in ErlangRus
похоже на graphql
источник

AK

Aleksey Kluchnikov in ErlangRus
по подходу
источник

TT

Taras 🦀 Taraskin in ErlangRus
Vasya
Есть json файл с условиями вроде ”user.is_online”: {...} в Erlang это попадает ввиде binary. Это условие нужно распарсить, подставить параметры из map и вернуть bool
имхо тут варианты (если я правильно понял проблему-задачу) —

1 — в json только данные, разруливает данные erlang — узять json - декодер, условия к данным(проверку) прописать в эрланге

2 — в файл пишется формат erlang-а — тогда json - декодер не нужен, данные сразу преобразуем в эрланг терм

3 — если в файле вперемешку какие-то данные с какими-то условиями, которых в эрланге нету —
&& в эрланге нету, есть and и andalso —
надо написать парсер этого файла — преобразовать в эрланг термы для последующего построения своей логики

это не сложно(довольно просто), с учетом наличия в эрланге паттерн матчинга
источник

TT

Taras 🦀 Taraskin in ErlangRus
Vasya
Могут быть операторы равно/больше/меньше/и/или
==, =:=, >, <, >=, =<

первые два — равно без учета типа, равно с учетом типа
> 5 == 5.0.
true
> 5 =:= 5.0.
false
источник

c🦊

cleverfox 🦊 in ErlangRus
Vasya
Товарищи, привет! Как лучше парсить и проверять условия, вроде таких? user.is_online && user.balance >0. Эти данные передаются строкой. user берётся из map #{user=>#{...}}
Я такое делал руками. Поделиться кодом из того проекта не могу, но это действительно просто. Это буквально несколько часов с тестами. У меня требование пробелов между термами, поэтому я просто делаю binary:split(...,<<" ">>,[global]) а потом матчишь рекурсивно пока не закончится и генеришь список условий (в итоге может получиться дерево).
источник

TT

Taras 🦀 Taraskin in ErlangRus
Vasya
condition(<<"user.is_online && user.balance > 0 && config.check">>, #{user=>#{is_online=>true, balance=>100}, config=>#{}}) -> false.
мне кажется, что много клауз с матчингом на весь бинарник будет работать медленнее, чем один раз нормально бинарник распарсить, и матчить уже наличие конкретных параметров и данных

+ матчить весь бинарник — какое-то условие 100% рано или поздно потеряется))
источник

V

Vasya in ErlangRus
cleverfox 🦊
Я такое делал руками. Поделиться кодом из того проекта не могу, но это действительно просто. Это буквально несколько часов с тестами. У меня требование пробелов между термами, поэтому я просто делаю binary:split(...,<<" ">>,[global]) а потом матчишь рекурсивно пока не закончится и генеришь список условий (в итоге может получиться дерево).
А это идея! Спасибо!
источник

c🦊

cleverfox 🦊 in ErlangRus
Vasya
А это идея! Спасибо!
у меня в проекте для ускорения это ещё может компилироваться в erlang модуль, тогда это работает быстрее на больших rulesetах
источник

TT

Taras 🦀 Taraskin in ErlangRus
cleverfox 🦊
Я такое делал руками. Поделиться кодом из того проекта не могу, но это действительно просто. Это буквально несколько часов с тестами. У меня требование пробелов между термами, поэтому я просто делаю binary:split(...,<<" ">>,[global]) а потом матчишь рекурсивно пока не закончится и генеришь список условий (в итоге может получиться дерево).
еще можно просто матчить на "токены", без сплита - просто строчку кушать)

я так преобразование bb codes -> html написал
хотя получится много клауз

в этом варианте токены покоче надо в верхние клаузы, токени подлиннее — ниже
источник

c🦊

cleverfox 🦊 in ErlangRus
вот с компиляцией придется повозиться немного
источник

V

Vasya in ErlangRus
Думал, как разбить на токены, но если сделать обязательными пробелы, то всё намного проще
источник

V

Vasya in ErlangRus
Taras 🦀 Taraskin
еще можно просто матчить на "токены", без сплита - просто строчку кушать)

я так преобразование bb codes -> html написал
хотя получится много клауз

в этом варианте токены покоче надо в верхние клаузы, токени подлиннее — ниже
Как кушать?)
источник

c🦊

cleverfox 🦊 in ErlangRus
Taras 🦀 Taraskin
еще можно просто матчить на "токены", без сплита - просто строчку кушать)

я так преобразование bb codes -> html написал
хотя получится много клауз

в этом варианте токены покоче надо в верхние клаузы, токени подлиннее — ниже
можно, но там кода получается тьма и это не на 2-3 часа задача уже
источник

c🦊

cleverfox 🦊 in ErlangRus
Vasya
Думал, как разбить на токены, но если сделать обязательными пробелы, то всё намного проще
ну если ты можешь такое ограничение ввести - оно сильно упрощает
источник

TT

Taras 🦀 Taraskin in ErlangRus
Vasya
Как кушать?)
источник

TT

Taras 🦀 Taraskin in ErlangRus
cleverfox 🦊
можно, но там кода получается тьма и это не на 2-3 часа задача уже
я рекурсиями думаю, мне проще рекурсия чем сверткой, и быстрее написать

может чуть длиннее код будет — зато потеря пробела будет некритичной
и хорошее понимание, как это работает - без магии
источник

c🦊

cleverfox 🦊 in ErlangRus
Taras 🦀 Taraskin
я рекурсиями думаю, мне проще рекурсия чем сверткой, и быстрее написать

может чуть длиннее код будет — зато потеря пробела будет некритичной
и хорошее понимание, как это работает - без магии
конечно рекурсией
источник