2012/12/10 Ruslan Zakirov <[email protected]>: > Привет, > > Парсим булеву логику с помощью Parse::BooleanLogic, попутно разбирая > условия, далее используем вычислитель из модуля. Если медленно, то > следующий пункт - превращаем tree в eval "sub { return (... < 10 && > ... < 5) || ...}". Если медленно, то первращаем в lua или какой-нибудь > JIT. Спасибо, Руслан. Интересный модуль. Решает задачу парсинга простых предикатов... но математику тогда отдельно делать придется...
> > 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 > > > > -- > Best regards, Ruslan. > -- > Moscow.pm mailing list > [email protected] | http://moscow.pm.org -- Vladimir Timofeev <[email protected]> -- Moscow.pm mailing list [email protected] | http://moscow.pm.org
