diff --git a/MathPad/MPSumFunction.m b/MathPad/MPSumFunction.m index 6b649f5..93af0e6 100644 --- a/MathPad/MPSumFunction.m +++ b/MathPad/MPSumFunction.m @@ -9,6 +9,8 @@ #import "MPSumFunction.h" #import "MPExpression.h" +#import "MPExpressionEvaluator.h" + @implementation MPSumFunction #pragma mark Creation Methods @@ -97,10 +99,30 @@ } #pragma mark Evaluating Functions -- (double)evaluateFunction:(NSError *__autoreleasing *)error +- (NSDecimalNumber *)evaluate:(MPParseError *__autoreleasing *)error { -#warning Unimplemented Method - return 0.0; + MPExpressionEvaluator *startEvaluator = self.startExpression.evaluator; + NSDecimalNumber *start = [startEvaluator evaluateVariableDefinition:YES error:error]; + if (!start) { + return nil; + } + NSDecimalNumber *target = [self.targetExpression evaluateWithError:error]; + if (!target) { + return nil; + } + + MPExpressionEvaluator *sumEvaluator = self.sumExpression.evaluator; + NSDecimalNumber *value = [NSDecimalNumber zero]; + for (NSDecimalNumber *iterator = start; [iterator compare:target] <= 0; iterator = [iterator decimalNumberByAdding:[[NSDecimalNumber alloc] initWithInteger:1]]) { + [sumEvaluator bindValue:iterator toVariableName:startEvaluator.definedVariable]; + NSDecimalNumber *summand = [sumEvaluator evaluateWithError:error]; + if (summand) { + value = [value decimalNumberByAdding:summand]; + } else { + return nil; + } + } + return value; } #pragma mark Working With Functions