[Moscow.pm] Предикаты для не-программистов

Vladimir Timofeev vovkasm на gmail.com
Пн Дек 10 10:42:07 PST 2012


А вот есть задача.
Надо в админке позволить людям задавать предикаты в общей форме, к примеру:
(objects({"type":["type1","type2"]}) < 10 AND
objects({"type":["type3"]}) < 5) OR special_condition("cond1")

Синтаксис в примере выбран произвольно, набор допустимых ф-ций ограничен.
В процессе работы эти предикаты будут проверяться в достаточно
критичном к производительности коде.
Кто нибудь решал похожие задачи? Как?

У меня сейчас несколько вариантов решения:
1. Использовать perl + Safe
- Кривой синтаксис (если JSON пользователи админки уже знают с грехом
пополам, то учить еще perl явно выше их сил)
- Безопасность... насколько я понимаю с Safe не все так просто...
- Скорость... Safe её снижает

2. Использовать perl-решения...
Math::Symbolic?
Language::Expr?
Я ничего не знаю о них и не хочется напороться на утечки памяти и/или
неизлечимые проблемы производительности.

3. XS + внешняя библиотека, смотрел на
http://www.partow.net/programming/exprtk/index.html - современный C++
шаблон на шаблоне... пока страшно, но буду туда еще смотреть, возможно

http://www.lua.org - вот к этому варианту склоняюсь пока больше всего.
Потому, что:
- легко встраивается
- знакомый синтаксис
- очень быстрый вызов C функций
- ему легко встроить вызов ф-ций типа objects или special_condition
(из примера, т.к. они у меня и так на C реализованы), но если
потребуется что-то из perl-овой части, то тоже пока проблем не вижу.

--
Vladimir Timofeev <vovkasm на gmail.com>


Подробная информация о списке рассылки Moscow-pm