Вов! Для этой задачи есть тру-вей: разложение на дизъюнкции конъюнкций (или как альтернатива конъюнкции дизъюнкий), - они же "многочлены жигалкина". Задача в принципе несложная для решения вручную на коленке.
--- Dmitriy V. Simonov, Perl & Python programmer 2012/12/10 Vladimir Timofeev <[email protected]> > А вот есть задача. > Надо в админке позволить людям задавать предикаты в общей форме, к примеру: > (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 <[email protected]> > -- > Moscow.pm mailing list > [email protected] | http://moscow.pm.org >
-- Moscow.pm mailing list [email protected] | http://moscow.pm.org
