Я использую шаблон, основанный на сигнальных и не сигнальных NaNs в современных компьютерах.NaN означает не число.Деление на ноль (fp) создает NaN.sNaNs генерируют исключения, не сигнализирующие NaN просто предоставляются в результате, любое будущее вычисление результата также генерирует NaN.Evaluate - это сигнализация, TryEvaluate - не сигнализация.
Здесь Ctx = Context [I, R] - это блок контекста, который содержит входные данные функции [I], результат [R] и исключение.Все варианты.Метод обновления в контексте является копией-обновлением.Не мутирующее обновление.Супер-черта просто оценивает одну или несколько функций, передавая обновленный контекст следующей функции.Основная функция оценки возвращает контекст, если удерживается исключение (пропуская оценку).Контекст [I, R] имеет функцию, которая переводит (I => R) в (Context [I, R] => Контекст [I, R]).Таким образом, нормальная функция может быть легко преобразована в контекстную функцию.
Как видите, кода не так много.Черты находятся в моем пакете утилит и могут быть использованы практически без кода потребителем.Использование библиотеки добавляет много накладных расходов для выполняемой работы.
Я использую это для всех моих парсеров.Парсеры, основанные на X-Path, просто вызывают последовательность подпарсеров.Следовательно, метод оценки (Seq).Примечание: мне не нравятся методы.Я стараюсь использовать функции там, где могу.
Упс, я думаю, что выкладывал мусор в последний раз.Вот ссылка на GitHub.https://github.com/tyohDeveloper/acme/tree/master/src/acme/util