Task #4246
closedКалькулятор константных выражений
100%
Description
Реализовать метод Operation Operation.reduce(final ICalculator calculator, int flags)
, упрощающий выражение за счет схлопывания константных подвыражений.
По умолчанию, метод возвращает копию операции.
Updated by Andrei Tatarnikov over 11 years ago
- Status changed from New to Open
- % Done changed from 10 to 90
Я написал калькулятор для основных стандартных операций EStandardOperation (MINUS, PLUS, ADD, SUB, MUL, DIV, REM, MOD) и API-классы для создания/расширения калькуляторов (см. класс syntax.Calculator). А у класса Operation появился метод для схлопывания подвыражений:
public ISyntaxElement reduce(ICalculator calculator, int flags)
Его можно использовать следующим образом
syntax.addFormula(
new Formula(
new Operation(
EStandardOperation.EQ,
a,
new Operation(
EStandardOperation.ADD,
new Value(intType.valueOf("2", 10)),
new Value(intType.valueOf("3", 10))).reduce(CalculatorForStandard.getInstance(), 0)
)
)
);
Данный код помогает упростить выражение (+ 2 3) в число 5.
В дальнейшем стандартный калькулятор может быть расширен для поддержки новых стандартных операций. Также на основе имеющихся базовых классов можно создавать калькуляторы для других типов операций.
Updated by Andrei Tatarnikov over 11 years ago
- Status changed from Open to Closed
- % Done changed from 90 to 100
P.S. Посмотрите реализацию. Что-то ещё нужно добавить?
Updated by Andrei Tatarnikov over 11 years ago
- Status changed from Closed to Resolved
Updated by Alexander Kamkin over 11 years ago
- Status changed from Resolved to Open
Давай вместо int flags
сделаем enum ReduceOptions
, cодержащий единственную константу CLONE
.
Кроме того, можно добавить метод с сокращенной сигнатурой reduce(calculator) = reduce(calculator, ReduceOptions.CLONE)
.
Updated by Andrei Tatarnikov over 11 years ago
- Status changed from Open to Resolved
Сделал. Назвал ReduceOptions.NEW_INSTANCE. См. r96.
Updated by Sergey Smolov over 11 years ago
- Status changed from Resolved to Closed
- Published in build set to 0.2.2