Вов! Для этой задачи есть тру-вей: разложение на дизъюнкции конъюнкций (или как альтернатива конъюнкции дизъюнкий), - они же "многочлены жигалкина". Задача в принципе несложная для решения вручную на коленке.<div class="gmail_extra">

<br clear="all"><div>---<br>Dmitriy V. Simonov,<br>Perl & Python programmer</div><br>
<br><br><div class="gmail_quote">2012/12/10 Vladimir Timofeev <span dir="ltr"><<a href="mailto:vovkasm@gmail.com" target="_blank">vovkasm@gmail.com</a>></span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

А вот есть задача.<br>
Надо в админке позволить людям задавать предикаты в общей форме, к примеру:<br>
(objects({"type":["type1","type2"]}) < 10 AND<br>
objects({"type":["type3"]}) < 5) OR special_condition("cond1")<br>
<br>
Синтаксис в примере выбран произвольно, набор допустимых ф-ций ограничен.<br>
В процессе работы эти предикаты будут проверяться в достаточно<br>
критичном к производительности коде.<br>
Кто нибудь решал похожие задачи? Как?<br>
<br>
У меня сейчас несколько вариантов решения:<br>
1. Использовать perl + Safe<br>
- Кривой синтаксис (если JSON пользователи админки уже знают с грехом<br>
пополам, то учить еще perl явно выше их сил)<br>
- Безопасность... насколько я понимаю с Safe не все так просто...<br>
- Скорость... Safe её снижает<br>
<br>
2. Использовать perl-решения...<br>
Math::Symbolic?<br>
Language::Expr?<br>
Я ничего не знаю о них и не хочется напороться на утечки памяти и/или<br>
неизлечимые проблемы производительности.<br>
<br>
3. XS + внешняя библиотека, смотрел на<br>
<a href="http://www.partow.net/programming/exprtk/index.html" target="_blank">http://www.partow.net/programming/exprtk/index.html</a> - современный C++<br>
шаблон на шаблоне... пока страшно, но буду туда еще смотреть, возможно<br>
<br>
<a href="http://www.lua.org" target="_blank">http://www.lua.org</a> - вот к этому варианту склоняюсь пока больше всего.<br>
Потому, что:<br>
- легко встраивается<br>
- знакомый синтаксис<br>
- очень быстрый вызов C функций<br>
- ему легко встроить вызов ф-ций типа objects или special_condition<br>
(из примера, т.к. они у меня и так на C реализованы), но если<br>
потребуется что-то из perl-овой части, то тоже пока проблем не вижу.<br>
<br>
--<br>
Vladimir Timofeev <<a href="mailto:vovkasm@gmail.com">vovkasm@gmail.com</a>><br>
<span class="HOEnZb"><font color="#888888">--<br>
Moscow.pm mailing list<br>
<a href="mailto:moscow-pm@pm.org">moscow-pm@pm.org</a> | <a href="http://moscow.pm.org" target="_blank">http://moscow.pm.org</a><br>
</font></span></blockquote></div><br></div>