Комментарии 18
С интересом посмотрел бы на Вашу реализацию парсинга строк.
Иронично, есть парсинг ИЗ Expression, но В я что-то не догадался сделать). Интересная мысль, думаю, можно реализовать.
Достаточно ли оно умное? Оно же не знает кастомные функции, и вообще, какие-то сложные вещи типа arcsin(x + 2) + arccos(x + 2) оно вряд ли сократит. Хотя я конечно обязательно проверю.
ну а упрощать он не умеет конечно ибо обычно это просто вызов функции, например: System.Math.Sqrt(a). можно по имени функции вообще парсить и вручную оптимизировать и не вызывать системные функции.
Так и есть (по имени парсинг), но зачем все это, если можно сделать более умное выражение, которое по скорости почти такое же (спойлер: во второй части будет кэш => в некоторых случаях быстрее системной функции)?
Для того, чтобы не переписывать код, а использовать уже реализованный со встроенными приколюхами, дополнив их своими. Для тех же Expression есть ExpressionVisitor, который можно наследовать и переопределить по надобности.
По поводу скорости, вместо кэширования, я бы предпочёл возможность компилировать готовые выражения в полноценные Func-делегаты на этапе инициализации. Дешево и сердито.
Собственно, спустя более чем полтора года я готов рассказать намного больше.
Сейчас в библиотеке используются Linq.Expression для компиляции в Func, я даже писал детальную статью по этой теме.
Но само математическое выражение не будет в виде дотнетовских экспрешнов, так как в этом нет никакого смысла — нам нужны конструкции, которых в сишарпе тупо нет (на основе синтаксиса которого эти linq.expression и работают). Да и работать с ними вряд ли было бы так же удобно, как с кастомными, которые теперь переписаны на рекорды.
Ну конечно, ведь она в принципе не иллюстрирует как их писать, ты немного промазал тредом.
А как же их надо писать, если не секрет?
И это только то, чем в 90х пользовались. Кто-ж их руками разбирает-то?
Их и не надо писать. Когда мне на C# понадобился парсер, я взял pidgin. Вот пример как им не надо пользоваться :)
Во время прочтения появилось ощущения дежавю — делал уже нечто подобное. После того как увидел ссылки на мою старую статью 2014 года стало все понятно. Был приятно удивлен, продолжайте разработку :) Свой код я уже перевел на ANTLR, ну и в целом неплохо было бы его переписать.
Пишем «калькулятор» на C#. Часть I. Вычисление значения, производная, упрощение, и другие гуси