diff --git a/MathPad/MPSumFunction.m b/MathPad/MPSumFunction.m index 8c2c9e1..31d5e01 100644 --- a/MathPad/MPSumFunction.m +++ b/MathPad/MPSumFunction.m @@ -12,8 +12,15 @@ #import "MPExpressionEvaluator.h" #import "MPEvaluationContext.h" +#define ReturnIfNil(test) if(test == nil) return nil + @implementation MPSumFunction ++ (NSString *)localizedFunctionName +{ + return NSLocalizedString(@"Sum", @"Name of Sum Function"); +} + #pragma mark Creation Methods - (instancetype)init { @@ -100,35 +107,42 @@ } #pragma mark Evaluating Functions -- (NSDecimalNumber *)evaluateWithError:(MPParseError *__autoreleasing *)error +- (MPTerm *)parseWithError:(MPParseError *__autoreleasing *)error { 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; - } + MPTerm *start = [startEvaluator parseExpectingVariable:YES + error:error]; + ReturnIfNil(start); + + MPExpressionEvaluator *targetEvaluator = self.targetExpression.evaluator; + MPTerm *target = [targetEvaluator parseExpectingVariable:NO + error:error]; + ReturnIfNil(target); + + NSString *variable = startEvaluator.definedVariable.copy; [[MPEvaluationContext sharedContext] push]; - + [[MPEvaluationContext sharedContext] defineVariable:variable withValue:[NSNull null]]; MPExpressionEvaluator *sumEvaluator = self.sumExpression.evaluator; - NSDecimalNumber *value = [NSDecimalNumber zero]; - for (NSDecimalNumber *iterator = start; [iterator compare:target] <= 0; iterator = [iterator decimalNumberByAdding:[[NSDecimalNumber alloc] initWithInteger:1]]) { - [[MPEvaluationContext sharedContext] bindValue:iterator toName:startEvaluator.definedVariable]; - NSDecimalNumber *summand = [sumEvaluator evaluateWithError:error]; - if (summand) { - value = [value decimalNumberByAdding:summand]; - } else { - return nil; - } - } - + MPTerm *sum = [sumEvaluator parseExpectingVariable:NO + error:error]; + ReturnIfNil(sum); [[MPEvaluationContext sharedContext] pop]; - return value; + return [[MPTerm alloc] initWithBlock:^NSDecimalNumber *{ + [[MPEvaluationContext sharedContext] push]; + NSDecimalNumber *value = [NSDecimalNumber zero]; + NSDecimalNumber *startValue = [start evaluate]; + NSDecimalNumber *targetValue = [target evaluate]; + for (NSDecimalNumber *iterator = startValue; + [iterator compare:targetValue] <= 0 ; + iterator = [iterator decimalNumberByAdding:[[NSDecimalNumber alloc] initWithInteger:1]]) { + [[MPEvaluationContext sharedContext] defineVariable:variable withValue:iterator]; + value = [value decimalNumberByAdding:[sum evaluate]]; + } + [[MPEvaluationContext sharedContext] pop]; + return value; + }]; } #pragma mark Working With Functions