Doston
Здравствуйте народ! тут кто нибудь писал парсер для математических выражений?
Anonymous
я писал. и удалил потом. год назад. может больше
Anonymous
кривой был
VlIvYur
В универе была лаба такая
Denis
Anonymous
Anonymous
всё таки парсер читает
Denis
Не понимаю
Denis
"Парсер" это не "вычислитель"?
Anonymous
и он тож
Светомеч
Светомеч
Как раз плюсы
Светомеч
Обратная польская запись, да
Светомеч
Самый изи вариант
Denis
Собственно, если загуглить как я сказал, то как раз первая ссылка
Denis
http://e-maxx.ru/algo/expressions_parsing
Anonymous
/rules
Anonymous
/rules
Alexander
/vzhuh@FailsBot
🦥Alex Fails
/rules
Светомеч
Многабукафф
Dmitry
Dumitru
или деревья
Dmitry
До деревьев еще пропарсить как-то надо )
Andrei
Andrei
комбинатор монадических парсеров
Andrei
довольно легко
Andrei
Sergey
посоны. а вот можно как-то в C++ реализовать такую штуку
Sergey
к примеру, есть вычисления с рядом однородных вызовов методов от разных объектов
Sergey
типа
return x.length() + y.length() + z.length();
Sergey
и вот вынести как-то этот .length "за скобки"
🦥Alex Fails
Можно прокси-объект сделать, который вернет оператор + для классов
Sergey
ну лол, а если там было a+b*c %d
Sergey
ненене, две суммы там чисто случайно
Sergey
разообразные вещи там стоят. расчет физики
Sergey
хочется сократить запись, грубо говоря
Sergey
я все в область лямбды копаю, которая создается и тут же вызывается. но никак не соображу
Myawss
а x y и z не массивы ли? сливай в один и вызывай его длину
Sergey
Sergey
x, y, z - это, скажем, структуры. четырехмерная точка.
Sergey
ну так есть operator+ уже у point. как я его перегружу-то
Sergey
он возвращает point
Sergey
збс, и такие же -, =, *, /
Sergey
ну допустим
Sergey
но! так не получится сделать такое
Sergey
(a.length + b.length*max(c.length,0.f))
Sergey
мне надо как бы заграбить список всех аргументов, дописать к ним что-то свое, и посчитать как было
Sergey
проблема такая есть тащем-та
Sergey
попробуй руками расписать перемножение матриц, например
Sergey
бойлерплейт?
🦥Alex Fails
🦥Alex Fails
бойлерплейт?
Boilerplate code - Wikipedia
en.wikipedia.org
In computer programming, boilerplate code or boilerplate refers to sections of code that have to be included in many places with little or no alteration. It is often used when referring to languages that are considered verbose, i.e. the programmer must write a lot of code to do minimal jobs.
🦥Alex Fails
И да. Тут есть один интересный проект с матрицами
Sergey
ох епт. ну хорошо, забейте на матрицы и точки. это просто пример я пытался привести, который особо разжевывать не надо
🦥Alex Fails
https://bitbucket.org/serafimati/matrixlib
Sergey
просто взять выражение, посмотреть, какие у него аргументы. вызвать от каждого некий метод, и вычислить значение
Sergey
аналог map в функциональных
Sergey
только как получить список аргументов выражения
Myawss
var_args?
Myawss
va_args
Sergey
да какие va_args-то
Sergey
ну ведь не то совсем
Sergey
va_args же выдирают аргументы функции. нет никакой функции
Sergey
или мне на каждый такой чих отдельную функцию писать, причем она будет "типа с переменным числом аргументов", хотя на самом деле - со всполне определенным
🦥Alex Fails
Шаблон можно написать
Myawss
зы int f(std::initialize_list l){ int sum_len = 0; for(auto arg: l) { sum += arg.len(); } }
🦥Alex Fails
template <typename Functor<Args...>, Args...>
Sergey
Sergey
а если там не "все просуммировать", а нормальное выражение
Sergey
(a.length + b.length*max(c.length,0.f))
🦥Alex Fails
А ты уверен, что тут ленгтх можно вынести?
Sergey
норм вообще. стековая машина на коленке
🦥Alex Fails
это норма
🦥Alex Fails
Паттерн "Интерпретатор" отдалкнно напоминает
Sergey
да, но применять-то это хочется для "настоящих" выражений. там такая запись только все запутает вкрай