From d46f2acb745288a0cfb2c753effb0f4ae7707bda Mon Sep 17 00:00:00 2001 From: Artem Viter Date: Fri, 26 Jan 2024 11:50:49 +0400 Subject: [PATCH 1/4] -Adds salesforceReturnType field to DDExpression to have possibility to throw data type across chain of evaluation. This should helps to make right evaluation for expressions like: text((today() +1)); -Introduces DDMathEvaluatorResult type which holds NSNumber value as result of DDMathEvaluator by number field and also have salesforceType field to hold preferred salesforce's type of number field. It should helps to throw data type across chain of evaluations and helps to make right evaluation for expressions like: text((today() +1)); Be careful because of DDMathEvaluator.number can be any type (not always NSNumber) because of original class design. --- DDMathParser/DDExpression.h | 3 ++ DDMathParser/DDExpression.m | 2 +- DDMathParser/DDMathEvaluator.h | 9 +++-- DDMathParser/DDMathEvaluator.m | 51 +++++++++++++++++---------- DDMathParser/DDMathEvaluatorResult.h | 22 ++++++++++++ DDMathParser/DDMathEvaluatorResult.m | 41 +++++++++++++++++++++ DDMathParser/NSString+DDMathParsing.h | 8 ++--- DDMathParser/NSString+DDMathParsing.m | 6 ++-- DDMathParser/_DDFunctionExpression.m | 2 +- 9 files changed, 114 insertions(+), 30 deletions(-) create mode 100644 DDMathParser/DDMathEvaluatorResult.h create mode 100644 DDMathParser/DDMathEvaluatorResult.m diff --git a/DDMathParser/DDExpression.h b/DDMathParser/DDExpression.h index 2e44ee4..3431bab 100644 --- a/DDMathParser/DDExpression.h +++ b/DDMathParser/DDExpression.h @@ -34,6 +34,9 @@ typedef NS_ENUM(NSInteger, DDExpressionType) { - (DDExpression *)simplifiedExpression; - (DDExpression *)simplifiedExpressionWithEvaluator:(DDMathEvaluator *)evaluator error:(NSError **)error; +/// describe salesforce type of expression value(like CS_SALES_FORCE_TYPE_DATE, ... , ) if the field in not a nil +@property NSString *salesforceReturnType; + #pragma mark Number methods @property (readonly) NSNumber *number; diff --git a/DDMathParser/DDExpression.m b/DDMathParser/DDExpression.m index 127490f..e2d4155 100644 --- a/DDMathParser/DDExpression.m +++ b/DDMathParser/DDExpression.m @@ -49,7 +49,7 @@ - (DDExpressionType)expressionType { return DDExpressionTypeNumber; } - (NSNumber *)evaluateWithSubstitutions:(NSDictionary *)substitutions evaluator:(DDMathEvaluator *)evaluator error:(NSError **)error { - return [evaluator evaluateExpression:self withSubstitutions:substitutions error:error]; + return [evaluator unwrapFromMathResult:[evaluator evaluateExpression:self withSubstitutions:substitutions error:error]]; } - (DDExpression *)simplifiedExpression { NSError *error = nil; diff --git a/DDMathParser/DDMathEvaluator.h b/DDMathParser/DDMathEvaluator.h index 18cb48d..bd8a404 100644 --- a/DDMathParser/DDMathEvaluator.h +++ b/DDMathParser/DDMathEvaluator.h @@ -8,6 +8,7 @@ #import #import "DDTypes.h" +#import "DDMathEvaluatorResult.h" @class DDMathOperatorSet; @class DDExpression; @@ -30,14 +31,16 @@ typedef NSNumber* (^DDVariableResolver)(NSString *); - (BOOL)registerFunction:(DDMathFunction)function forName:(NSString *)functionName; - (NSArray *)registeredFunctions; -- (NSNumber *)evaluateString:(NSString *)expressionString withSubstitutions:(NSDictionary *)substitutions; -- (NSNumber *)evaluateString:(NSString *)expressionString withSubstitutions:(NSDictionary *)substitutions error:(NSError **)error; +- (DDMathEvaluatorResult *)evaluateString:(NSString *)expressionString withSubstitutions:(NSDictionary *)substitutions; +- (DDMathEvaluatorResult *)evaluateString:(NSString *)expressionString withSubstitutions:(NSDictionary *)substitutions error:(NSError **)error; -- (NSNumber *)evaluateExpression:(DDExpression *)expression withSubstitutions:(NSDictionary *)substitutions error:(NSError **)error; +- (DDMathEvaluatorResult *)evaluateExpression:(DDExpression *)expression withSubstitutions:(NSDictionary *)substitutions error:(NSError **)error; - (BOOL)addAlias:(NSString *)alias forFunctionName:(NSString *)functionName; - (void)removeAlias:(NSString *)alias; +-(id)unwrapFromMathResult:(id)value; + @end @interface DDMathEvaluator (Deprecated) diff --git a/DDMathParser/DDMathEvaluator.m b/DDMathParser/DDMathEvaluator.m index 626dd92..263b474 100644 --- a/DDMathParser/DDMathEvaluator.m +++ b/DDMathParser/DDMathEvaluator.m @@ -16,6 +16,7 @@ #import "_DDPrecisionFunctionEvaluator.h" #import "DDExpressionRewriter.h" #import +#import "DDMathEvaluatorResult.h" @implementation DDMathEvaluator { @@ -178,16 +179,16 @@ - (void)removeAlias:(NSString *)alias { #pragma mark - Evaluation -- (NSNumber *)evaluateString:(NSString *)expressionString withSubstitutions:(NSDictionary *)substitutions { +- (DDMathEvaluatorResult *)evaluateString:(NSString *)expressionString withSubstitutions:(NSDictionary *)substitutions { NSError *error = nil; - NSNumber *returnValue = [self evaluateString:expressionString withSubstitutions:substitutions error:&error]; + DDMathEvaluatorResult *returnValue = [self evaluateString:expressionString withSubstitutions:substitutions error:&error]; if (!returnValue) { NSLog(@"error: %@", error); } return returnValue; } -- (NSNumber *)evaluateString:(NSString *)expressionString withSubstitutions:(NSDictionary *)substitutions error:(NSError **)error { +- (DDMathEvaluatorResult *)evaluateString:(NSString *)expressionString withSubstitutions:(NSDictionary *)substitutions error:(NSError **)error { DDMathStringTokenizer *tokenizer = [[DDMathStringTokenizer alloc] initWithString:expressionString operatorSet:self.operatorSet error:error]; if (!tokenizer) { return nil; } @@ -200,9 +201,9 @@ - (NSNumber *)evaluateString:(NSString *)expressionString withSubstitutions:(NSD return [self evaluateExpression:expression withSubstitutions:substitutions error:error]; } -- (NSNumber *)evaluateExpression:(DDExpression *)expression withSubstitutions:(NSDictionary *)substitutions error:(NSError **)error { +- (DDMathEvaluatorResult *)evaluateExpression:(DDExpression *)expression withSubstitutions:(NSDictionary *)substitutions error:(NSError **)error { if ([expression expressionType] == DDExpressionTypeNumber) { - return [expression number]; + return [[DDMathEvaluatorResult alloc] initWithNumber:[expression number] salesforceType:expression.salesforceReturnType]; } else if ([expression expressionType] == DDExpressionTypeVariable) { return [self _evaluateVariableExpression:expression withSubstitutions:substitutions error:error]; } else if ([expression expressionType] == DDExpressionTypeFunction) { @@ -211,7 +212,7 @@ - (NSNumber *)evaluateExpression:(DDExpression *)expression withSubstitutions:(N return nil; } -- (NSNumber *)_evaluateVariableExpression:(DDExpression *)e withSubstitutions:(NSDictionary *)substitutions error:(NSError **)error { +- (DDMathEvaluatorResult *)_evaluateVariableExpression:(DDExpression *)e withSubstitutions:(NSDictionary *)substitutions error:(NSError **)error { id variableValue = [substitutions objectForKey:[e variable]]; if (variableValue == nil) { @@ -219,39 +220,44 @@ - (NSNumber *)_evaluateVariableExpression:(DDExpression *)e withSubstitutions:(N // use the variable resolver (if available) variableValue = [self variableWithName:[e variable]]; } - - NSNumber *numberValue = [self _evaluateValue:variableValue withSubstitutions:substitutions error:error]; - if (numberValue == nil && error != nil && *error == nil) { + DDMathEvaluatorResult *value = [self _evaluateValue:variableValue withSubstitutions:substitutions error:error]; + if (value == nil && error != nil && *error == nil) { *error = [NSError errorWithDomain:DDMathParserErrorDomain code:DDErrorCodeUnresolvedVariable userInfo:@{NSLocalizedDescriptionKey: [NSString stringWithFormat:@"unable to resolve variable: %@", e], DDUnknownVariableKey: [e variable]}]; } - return numberValue; - + // тут может вернуться строка в качестве результата расчета (неожиданно ...). + if(value != nil && [value isKindOfClass:[DDMathEvaluatorResult class]] && value.salesforceType == nil) { + value = [[DDMathEvaluatorResult alloc] initWithNumber:value.number salesforceType:e.salesforceReturnType]; + } + return value; } -- (NSNumber *)_evaluateFunctionExpression:(_DDFunctionExpression *)e withSubstitutions:(NSDictionary *)substitutions error:(NSError **)error { +- (DDMathEvaluatorResult *)_evaluateFunctionExpression:(_DDFunctionExpression *)e withSubstitutions:(NSDictionary *)substitutions error:(NSError **)error { id result = [_functionEvaluator evaluateFunction:e variables:substitutions error:error]; if (!result) { return nil; } - - NSNumber *numberValue = [self _evaluateValue:result withSubstitutions:substitutions error:error]; - if (numberValue == nil && error != nil && *error == nil) { + + DDMathEvaluatorResult *value = [self _evaluateValue:result withSubstitutions:substitutions error:error]; + if (value == nil && error != nil && *error == nil) { *error = ERR(DDErrorCodeInvalidFunctionReturnType, @"invalid return type from %@ function", [e function]); } - return numberValue; + if(value != nil && [value isKindOfClass:DDMathEvaluatorResult.class] && value.salesforceType == nil) { + value = [[DDMathEvaluatorResult alloc] initWithNumber:value.number salesforceType:e.salesforceReturnType]; + } + return value; } -- (NSNumber *)_evaluateValue:(id)value withSubstitutions:(NSDictionary *)substitutions error:(NSError **)error { +- (DDMathEvaluatorResult *)_evaluateValue:(id)value withSubstitutions:(NSDictionary *)substitutions error:(NSError **)error { // given an object of unknown type, this evaluates it as best as it can if ([value isKindOfClass:[DDExpression class]]) { return [self evaluateExpression:value withSubstitutions:substitutions error:error]; } else if ([value isKindOfClass:[NSString class]]) { return [self evaluateString:value withSubstitutions:substitutions error:error]; } else if ([value isKindOfClass:[NSNumber class]]) { - return value; + return [[DDMathEvaluatorResult alloc] initWithNumber:value]; } return nil; } @@ -294,4 +300,13 @@ - (void)addRewriteRule:(NSString *)rule forExpressionsMatchingTemplate:(NSString [[DDExpressionRewriter defaultRewriter] addRewriteRule:rule forExpressionsMatchingTemplate:templateString condition:condition]; } +-(id)unwrapFromMathResult:(id)value { + id valueUnwrapped = value; + if ([value isKindOfClass:[DDMathEvaluatorResult class]]) { + DDMathEvaluatorResult *valueBuffer = value; + valueUnwrapped = valueBuffer.number; + } + return valueUnwrapped; +} + @end diff --git a/DDMathParser/DDMathEvaluatorResult.h b/DDMathParser/DDMathEvaluatorResult.h new file mode 100644 index 0000000..8e3cd02 --- /dev/null +++ b/DDMathParser/DDMathEvaluatorResult.h @@ -0,0 +1,22 @@ +// +// DDMathEvaluatorResult.h +// DDMathParser +// +// Created by Artem Viter on 08.12.2023. +// + +#import + + +@interface DDMathEvaluatorResult : NSObject + +@property (readonly) NSNumber * number; + +@property (readonly) NSString * salesforceType; + + +- (instancetype)initWithNumber:(NSNumber *)number salesforceType:(NSString *)salesforceType; + +- (instancetype)initWithNumber:(NSNumber *)number; + +@end diff --git a/DDMathParser/DDMathEvaluatorResult.m b/DDMathParser/DDMathEvaluatorResult.m new file mode 100644 index 0000000..f1464a2 --- /dev/null +++ b/DDMathParser/DDMathEvaluatorResult.m @@ -0,0 +1,41 @@ +// +// DDMathEvaluatorResult.m +// DDMathParser +// +// Created by Artem Viter on 08.12.2023. +// + +#import +#import "DDMathEvaluatorResult.h" + +@implementation DDMathEvaluatorResult + +- (instancetype)initWithNumber:(NSNumber *)number salesforceType:(NSString *)salesforceType { + self = [super init]; + if (self) { + _number = [number copy]; + _salesforceType = [salesforceType copy]; + } + return self; +} + +- (instancetype)initWithNumber:(NSNumber *)number { + return [self initWithNumber:number salesforceType:nil]; +} + +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + + if (![object isKindOfClass:[DDMathEvaluatorResult class]]) { + return NO; + } + + DDMathEvaluatorResult *otherEvaluatorResult = (DDMathEvaluatorResult *)object; + + return [self.number isEqual:otherEvaluatorResult.number]; +} + + +@end diff --git a/DDMathParser/NSString+DDMathParsing.h b/DDMathParser/NSString+DDMathParsing.h index 26dd7dd..1c1182b 100644 --- a/DDMathParser/NSString+DDMathParsing.h +++ b/DDMathParser/NSString+DDMathParsing.h @@ -7,12 +7,12 @@ // #import - +#import "DDMathEvaluatorResult.h" @interface NSString (DDMathParsing) -- (NSNumber *)numberByEvaluatingString; -- (NSNumber *)numberByEvaluatingStringWithSubstitutions:(NSDictionary *)substitutions; -- (NSNumber *)numberByEvaluatingStringWithSubstitutions:(NSDictionary *)substitutions error:(NSError **)error; +- (DDMathEvaluatorResult *)numberByEvaluatingString; +- (DDMathEvaluatorResult *)numberByEvaluatingStringWithSubstitutions:(NSDictionary *)substitutions; +- (DDMathEvaluatorResult *)numberByEvaluatingStringWithSubstitutions:(NSDictionary *)substitutions error:(NSError **)error; @end diff --git a/DDMathParser/NSString+DDMathParsing.m b/DDMathParser/NSString+DDMathParsing.m index 648cb37..9fa463f 100644 --- a/DDMathParser/NSString+DDMathParsing.m +++ b/DDMathParser/NSString+DDMathParsing.m @@ -12,11 +12,11 @@ @implementation NSString (DDMathParsing) -- (NSNumber *)numberByEvaluatingString { +- (DDMathEvaluatorResult *)numberByEvaluatingString { return [self numberByEvaluatingStringWithSubstitutions:nil]; } -- (NSNumber *)numberByEvaluatingStringWithSubstitutions:(NSDictionary *)substitutions { +- (DDMathEvaluatorResult *)numberByEvaluatingStringWithSubstitutions:(NSDictionary *)substitutions { NSError *error = nil; NSNumber *returnValue = [self numberByEvaluatingStringWithSubstitutions:substitutions error:&error]; if (returnValue == nil) { @@ -25,7 +25,7 @@ - (NSNumber *)numberByEvaluatingStringWithSubstitutions:(NSDictionary *)substitu return returnValue; } -- (NSNumber *)numberByEvaluatingStringWithSubstitutions:(NSDictionary *)substitutions error:(NSError **)error { +- (DDMathEvaluatorResult *)numberByEvaluatingStringWithSubstitutions:(NSDictionary *)substitutions error:(NSError **)error { return [[DDMathEvaluator defaultMathEvaluator] evaluateString:self withSubstitutions:substitutions error:error]; } diff --git a/DDMathParser/_DDFunctionExpression.m b/DDMathParser/_DDFunctionExpression.m index 104100f..aa4c92d 100644 --- a/DDMathParser/_DDFunctionExpression.m +++ b/DDMathParser/_DDFunctionExpression.m @@ -85,7 +85,7 @@ - (DDExpression *)simplifiedExpressionWithEvaluator:(DDMathEvaluator *)evaluator if (canSimplify) { if (evaluator == nil) { evaluator = [DDMathEvaluator defaultMathEvaluator]; } - id result = [evaluator evaluateExpression:self withSubstitutions:nil error:error]; + id result = [evaluator unwrapFromMathResult:[evaluator evaluateExpression:self withSubstitutions:nil error:error]]; if ([result isKindOfClass:[_DDNumberExpression class]]) { return result; From d65f7c7c7b69a8f2a76c54d3b03663c4a62b697e Mon Sep 17 00:00:00 2001 From: Artem Viter Date: Mon, 5 Feb 2024 12:53:03 +0400 Subject: [PATCH 2/4] Apply unwrapFromMathResult function for all evaluateExpression in math functions. --- DDMathParser/_DDFunctionEvaluator.m | 196 +++++++++---------- DDMathParser/_DDPrecisionFunctionEvaluator.m | 132 ++++++------- DDMathParser/_DDRewriteRule.m | 2 +- 3 files changed, 165 insertions(+), 165 deletions(-) diff --git a/DDMathParser/_DDFunctionEvaluator.m b/DDMathParser/_DDFunctionEvaluator.m index 80ab405..df22509 100644 --- a/DDMathParser/_DDFunctionEvaluator.m +++ b/DDMathParser/_DDFunctionEvaluator.m @@ -111,10 +111,10 @@ - (DDExpression *)evaluateFunction:(_DDFunctionExpression *)expression variables - (DDExpression *)add:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(2); - NSNumber *firstValue = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; + NSNumber *firstValue = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; RETURN_IF_NIL(firstValue); - NSNumber *secondValue = [[self evaluator] evaluateExpression:[arguments objectAtIndex:1] withSubstitutions:variables error:error]; + NSNumber *secondValue = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:1] withSubstitutions:variables error:error]]; RETURN_IF_NIL(secondValue); NSNumber *result = @([firstValue doubleValue] + [secondValue doubleValue]); return [DDExpression numberExpressionWithNumber:result]; @@ -122,9 +122,9 @@ - (DDExpression *)add:(NSArray *)arguments variables:(NSDictionary *)variables e - (DDExpression *)subtract:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(2); - NSNumber *firstValue = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; + NSNumber *firstValue = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; RETURN_IF_NIL(firstValue); - NSNumber *secondValue = [[self evaluator] evaluateExpression:[arguments objectAtIndex:1] withSubstitutions:variables error:error]; + NSNumber *secondValue = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:1] withSubstitutions:variables error:error]]; RETURN_IF_NIL(secondValue); NSNumber *result = @([firstValue doubleValue] - [secondValue doubleValue]); return [DDExpression numberExpressionWithNumber:result]; @@ -132,9 +132,9 @@ - (DDExpression *)subtract:(NSArray *)arguments variables:(NSDictionary *)variab - (DDExpression *)multiply:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(2); - NSNumber *firstValue = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; + NSNumber *firstValue = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; RETURN_IF_NIL(firstValue); - NSNumber *secondValue = [[self evaluator] evaluateExpression:[arguments objectAtIndex:1] withSubstitutions:variables error:error]; + NSNumber *secondValue = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:1] withSubstitutions:variables error:error]]; RETURN_IF_NIL(secondValue); NSNumber *result = @([firstValue doubleValue] * [secondValue doubleValue]); return [DDExpression numberExpressionWithNumber:result]; @@ -142,9 +142,9 @@ - (DDExpression *)multiply:(NSArray *)arguments variables:(NSDictionary *)variab - (DDExpression *)divide:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(2); - NSNumber *firstValue = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; + NSNumber *firstValue = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; RETURN_IF_NIL(firstValue); - NSNumber *secondValue = [[self evaluator] evaluateExpression:[arguments objectAtIndex:1] withSubstitutions:variables error:error]; + NSNumber *secondValue = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:1] withSubstitutions:variables error:error]]; RETURN_IF_NIL(secondValue); NSNumber *result = @([firstValue doubleValue] / [secondValue doubleValue]); return [DDExpression numberExpressionWithNumber:result]; @@ -152,9 +152,9 @@ - (DDExpression *)divide:(NSArray *)arguments variables:(NSDictionary *)variable - (DDExpression *)mod:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(2); - NSNumber *firstValue = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; + NSNumber *firstValue = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; RETURN_IF_NIL(firstValue); - NSNumber *secondValue = [[self evaluator] evaluateExpression:[arguments objectAtIndex:1] withSubstitutions:variables error:error]; + NSNumber *secondValue = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:1] withSubstitutions:variables error:error]]; RETURN_IF_NIL(secondValue); NSNumber *result = @(fmod([firstValue doubleValue], [secondValue doubleValue])); return [DDExpression numberExpressionWithNumber:result]; @@ -162,7 +162,7 @@ - (DDExpression *)mod:(NSArray *)arguments variables:(NSDictionary *)variables e - (DDExpression *)negate:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(1); - NSNumber *firstValue = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; + NSNumber *firstValue = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; RETURN_IF_NIL(firstValue); NSNumber *result = @(-1 * [firstValue doubleValue]); return [DDExpression numberExpressionWithNumber:result]; @@ -170,7 +170,7 @@ - (DDExpression *)negate:(NSArray *)arguments variables:(NSDictionary *)variable - (DDExpression *)factorial:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(1); - NSNumber *firstValue = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; + NSNumber *firstValue = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; RETURN_IF_NIL(firstValue); NSNumber *result = nil; @@ -190,9 +190,9 @@ - (DDExpression *)factorial:(NSArray *)arguments variables:(NSDictionary *)varia - (DDExpression *)pow:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(2); - NSNumber *base = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; + NSNumber *base = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; RETURN_IF_NIL(base); - NSNumber *exponent = [[self evaluator] evaluateExpression:[arguments objectAtIndex:1] withSubstitutions:variables error:error]; + NSNumber *exponent = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:1] withSubstitutions:variables error:error]]; RETURN_IF_NIL(exponent); NSNumber *result = @(pow([base doubleValue], [exponent doubleValue])); @@ -201,9 +201,9 @@ - (DDExpression *)pow:(NSArray *)arguments variables:(NSDictionary *)variables e - (DDExpression *)nthroot:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(2); - NSNumber *base = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; + NSNumber *base = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; RETURN_IF_NIL(base); - NSNumber *root = [[self evaluator] evaluateExpression:[arguments objectAtIndex:1] withSubstitutions:variables error:error]; + NSNumber *root = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:1] withSubstitutions:variables error:error]]; RETURN_IF_NIL(root); NSNumber *result = @(pow([base doubleValue], 1/[root doubleValue])); @@ -212,9 +212,9 @@ - (DDExpression *)nthroot:(NSArray *)arguments variables:(NSDictionary *)variabl - (DDExpression *)and:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(2); - NSNumber *first = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; + NSNumber *first = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; RETURN_IF_NIL(first); - NSNumber *second = [[self evaluator] evaluateExpression:[arguments objectAtIndex:1] withSubstitutions:variables error:error]; + NSNumber *second = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:1] withSubstitutions:variables error:error]]; RETURN_IF_NIL(second); NSNumber *result = @([first integerValue] & [second integerValue]); return [DDExpression numberExpressionWithNumber:result]; @@ -222,9 +222,9 @@ - (DDExpression *)and:(NSArray *)arguments variables:(NSDictionary *)variables e - (DDExpression *)or:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(2); - NSNumber *first = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; + NSNumber *first = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; RETURN_IF_NIL(first); - NSNumber *second = [[self evaluator] evaluateExpression:[arguments objectAtIndex:1] withSubstitutions:variables error:error]; + NSNumber *second = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:1] withSubstitutions:variables error:error]]; RETURN_IF_NIL(second); NSNumber *result = @([first integerValue] | [second integerValue]); return [DDExpression numberExpressionWithNumber:result]; @@ -232,7 +232,7 @@ - (DDExpression *)or:(NSArray *)arguments variables:(NSDictionary *)variables er - (DDExpression *)not:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(1); - NSNumber *first = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; + NSNumber *first = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; RETURN_IF_NIL(first); NSNumber *result = @(~[first integerValue]); return [DDExpression numberExpressionWithNumber:result]; @@ -240,9 +240,9 @@ - (DDExpression *)not:(NSArray *)arguments variables:(NSDictionary *)variables e - (DDExpression *)xor:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(2); - NSNumber *first = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; + NSNumber *first = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; RETURN_IF_NIL(first); - NSNumber *second = [[self evaluator] evaluateExpression:[arguments objectAtIndex:1] withSubstitutions:variables error:error]; + NSNumber *second = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:1] withSubstitutions:variables error:error]]; RETURN_IF_NIL(second); NSNumber *result = @([first integerValue] ^ [second integerValue]); return [DDExpression numberExpressionWithNumber:result]; @@ -250,9 +250,9 @@ - (DDExpression *)xor:(NSArray *)arguments variables:(NSDictionary *)variables e - (DDExpression *)rshift:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(2); - NSNumber *first = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; + NSNumber *first = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; RETURN_IF_NIL(first); - NSNumber *second = [[self evaluator] evaluateExpression:[arguments objectAtIndex:1] withSubstitutions:variables error:error]; + NSNumber *second = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:1] withSubstitutions:variables error:error]]; RETURN_IF_NIL(second); NSNumber *result = @([first integerValue] >> [second integerValue]); return [DDExpression numberExpressionWithNumber:result]; @@ -260,9 +260,9 @@ - (DDExpression *)rshift:(NSArray *)arguments variables:(NSDictionary *)variable - (DDExpression *)lshift:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(2); - NSNumber *first = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; + NSNumber *first = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; RETURN_IF_NIL(first); - NSNumber *second = [[self evaluator] evaluateExpression:[arguments objectAtIndex:1] withSubstitutions:variables error:error]; + NSNumber *second = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:1] withSubstitutions:variables error:error]]; RETURN_IF_NIL(second); NSNumber *result = @([first integerValue] << [second integerValue]); return [DDExpression numberExpressionWithNumber:result]; @@ -282,7 +282,7 @@ - (DDExpression *)sum:(NSArray *)arguments variables:(NSDictionary *)variables e REQUIRE_GTOE_N_ARGS(1); NSMutableArray * evaluatedNumbers = [NSMutableArray array]; for (DDExpression * e in arguments) { - NSNumber *n = [[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); [evaluatedNumbers addObject:n]; } @@ -306,7 +306,7 @@ - (DDExpression *)min:(NSArray *)arguments variables:(NSDictionary *)variables e NSNumber *result = nil; for (NSUInteger index = 0; index < [arguments count]; ++index) { DDExpression *e = [arguments objectAtIndex:index]; - NSNumber *value = [[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]; + NSNumber *value = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]]; RETURN_IF_NIL(value); if (index == 0 || [result compare:value] == NSOrderedDescending) { //result > value (or is first index) @@ -322,7 +322,7 @@ - (DDExpression *)max:(NSArray *)arguments variables:(NSDictionary *)variables e NSNumber *result = nil; for (NSUInteger index = 0; index < [arguments count]; ++index) { DDExpression *e = [arguments objectAtIndex:index]; - NSNumber *value = [[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]; + NSNumber *value = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]]; RETURN_IF_NIL(value); if (index == 0 || [result compare:value] == NSOrderedAscending) { //result < value (or is first index) @@ -337,7 +337,7 @@ - (DDExpression *)median:(NSArray *)arguments variables:(NSDictionary *)variable REQUIRE_GTOE_N_ARGS(2); NSMutableArray *evaluatedNumbers = [NSMutableArray array]; for (DDExpression *e in arguments) { - NSNumber *n = [[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); [evaluatedNumbers addObject:n]; } @@ -365,7 +365,7 @@ - (DDExpression *)stddev:(NSArray *)arguments variables:(NSDictionary *)variable double avg = [[avgExpression number] doubleValue]; double stddev = 0; for (DDExpression *e in arguments) { - NSNumber *argValue = [[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]; + NSNumber *argValue = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]]; RETURN_IF_NIL(argValue); double diff = avg - [argValue doubleValue]; diff = diff * diff; @@ -380,7 +380,7 @@ - (DDExpression *)stddev:(NSArray *)arguments variables:(NSDictionary *)variable - (DDExpression *)sqrt:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(1); - NSNumber *n = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSNumber *result = @(sqrt([n doubleValue])); @@ -397,7 +397,7 @@ - (DDExpression *)random:(NSArray *)arguments variables:(NSDictionary *)variable NSMutableArray * params = [NSMutableArray array]; for (DDExpression *e in arguments) { - NSNumber *value = [[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]; + NSNumber *value = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]]; RETURN_IF_NIL(value); [params addObject:value]; } @@ -422,7 +422,7 @@ - (DDExpression *)random:(NSArray *)arguments variables:(NSDictionary *)variable - (DDExpression *)log:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(1); - NSNumber *n = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSNumber *result = @(log10([n doubleValue])); @@ -431,14 +431,14 @@ - (DDExpression *)log:(NSArray *)arguments variables:(NSDictionary *)variables e - (DDExpression *)ln:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(1); - NSNumber *n = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); return [DDExpression numberExpressionWithNumber:@(log([n doubleValue]))]; } - (DDExpression *)log2:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(1); - NSNumber *n = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSNumber *result = @(log2([n doubleValue])); @@ -447,7 +447,7 @@ - (DDExpression *)log2:(NSArray *)arguments variables:(NSDictionary *)variables - (DDExpression *)exp:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(1); - NSNumber *n = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSNumber *result = @(exp([n doubleValue])); @@ -456,7 +456,7 @@ - (DDExpression *)exp:(NSArray *)arguments variables:(NSDictionary *)variables e - (DDExpression *)ceil:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(1); - NSNumber *n = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSNumber *result = @(ceil([n doubleValue])); return [DDExpression numberExpressionWithNumber:result]; @@ -464,7 +464,7 @@ - (DDExpression *)ceil:(NSArray *)arguments variables:(NSDictionary *)variables - (DDExpression *)abs:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(1); - NSNumber *n = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSNumber *result = @(llabs([n longLongValue])); @@ -473,7 +473,7 @@ - (DDExpression *)abs:(NSArray *)arguments variables:(NSDictionary *)variables e - (DDExpression *)floor:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(1); - NSNumber *n = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSNumber *result = @(floor([n doubleValue])); @@ -499,12 +499,12 @@ - (DDExpression *)percent:(NSArray *)arguments variables:(NSDictionary *)variabl if (percentIsRightArgument) { DDExpression *baseExpression = [[percentContext arguments] objectAtIndex:0]; - context = [[self evaluator] evaluateExpression:baseExpression withSubstitutions:variables error:error]; + context = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:baseExpression withSubstitutions:variables error:error]]; } } } - NSNumber *percent = [[self evaluator] evaluateExpression:percentArgument withSubstitutions:variables error:error]; + NSNumber *percent = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:percentArgument withSubstitutions:variables error:error]]; RETURN_IF_NIL(context); RETURN_IF_NIL(percent); @@ -517,7 +517,7 @@ - (DDExpression *)sin:(NSArray *)arguments variables:(NSDictionary *)variables e REQUIRE_N_ARGS(1); DDExpression *e = [arguments objectAtIndex:0]; e = _DDDTOR(e, [self evaluator], error); - NSNumber *n = [[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSNumber *result = @(sin([n doubleValue])); @@ -528,7 +528,7 @@ - (DDExpression *)cos:(NSArray *)arguments variables:(NSDictionary *)variables e REQUIRE_N_ARGS(1); DDExpression *e = [arguments objectAtIndex:0]; e = _DDDTOR(e, [self evaluator], error); - NSNumber *n = [[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSNumber *result = @(cos([n doubleValue])); @@ -539,7 +539,7 @@ - (DDExpression *)tan:(NSArray *)arguments variables:(NSDictionary *)variables e REQUIRE_N_ARGS(1); DDExpression *e = [arguments objectAtIndex:0]; e = _DDDTOR(e, [self evaluator], error); - NSNumber *n = [[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSNumber *result = @(tan([n doubleValue])); @@ -548,7 +548,7 @@ - (DDExpression *)tan:(NSArray *)arguments variables:(NSDictionary *)variables e - (DDExpression *)asin:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(1); - NSNumber *n = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSNumber *result = @(asin([n doubleValue])); @@ -557,7 +557,7 @@ - (DDExpression *)asin:(NSArray *)arguments variables:(NSDictionary *)variables - (DDExpression *)acos:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(1); - NSNumber *n = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSNumber *result = @(acos([n doubleValue])); @@ -566,7 +566,7 @@ - (DDExpression *)acos:(NSArray *)arguments variables:(NSDictionary *)variables - (DDExpression *)atan:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(1); - NSNumber *n = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSNumber *result = @(atan([n doubleValue])); @@ -577,7 +577,7 @@ - (DDExpression *)sinh:(NSArray *)arguments variables:(NSDictionary *)variables REQUIRE_N_ARGS(1); DDExpression *e = [arguments objectAtIndex:0]; e = _DDDTOR(e, [self evaluator], error); - NSNumber *n = [[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSNumber *result = @(sinh([n doubleValue])); @@ -588,7 +588,7 @@ - (DDExpression *)cosh:(NSArray *)arguments variables:(NSDictionary *)variables REQUIRE_N_ARGS(1); DDExpression *e = [arguments objectAtIndex:0]; e = _DDDTOR(e, [self evaluator], error); - NSNumber *n = [[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSNumber *result = @(cosh([n doubleValue])); @@ -599,7 +599,7 @@ - (DDExpression *)tanh:(NSArray *)arguments variables:(NSDictionary *)variables REQUIRE_N_ARGS(1); DDExpression *e = [arguments objectAtIndex:0]; e = _DDDTOR(e, [self evaluator], error); - NSNumber *n = [[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSNumber *result = @(tanh([n doubleValue])); @@ -608,7 +608,7 @@ - (DDExpression *)tanh:(NSArray *)arguments variables:(NSDictionary *)variables - (DDExpression *)asinh:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(1); - NSNumber *n = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSNumber *result = @(asinh([n doubleValue])); @@ -617,7 +617,7 @@ - (DDExpression *)asinh:(NSArray *)arguments variables:(NSDictionary *)variables - (DDExpression *)acosh:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(1); - NSNumber *n = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSNumber *result = @(acosh([n doubleValue])); @@ -626,7 +626,7 @@ - (DDExpression *)acosh:(NSArray *)arguments variables:(NSDictionary *)variables - (DDExpression *)atanh:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(1); - NSNumber *n = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSNumber *result = @(atanh([n doubleValue])); @@ -637,7 +637,7 @@ - (DDExpression *)csc:(NSArray *)arguments variables:(NSDictionary *)variables e REQUIRE_N_ARGS(1); DDExpression *e = [arguments objectAtIndex:0]; e = _DDDTOR(e, [self evaluator], error); - NSNumber *n = [[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSNumber *result = @(1/sin([n doubleValue])); @@ -648,7 +648,7 @@ - (DDExpression *)sec:(NSArray *)arguments variables:(NSDictionary *)variables e REQUIRE_N_ARGS(1); DDExpression *e = [arguments objectAtIndex:0]; e = _DDDTOR(e, [self evaluator], error); - NSNumber *n = [[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSNumber *result = @(1/cos([n doubleValue])); @@ -659,7 +659,7 @@ - (DDExpression *)cotan:(NSArray *)arguments variables:(NSDictionary *)variables REQUIRE_N_ARGS(1); DDExpression *e = [arguments objectAtIndex:0]; e = _DDDTOR(e, [self evaluator], error); - NSNumber *n = [[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSNumber *result = @(1/tan([n doubleValue])); @@ -668,7 +668,7 @@ - (DDExpression *)cotan:(NSArray *)arguments variables:(NSDictionary *)variables - (DDExpression *)acsc:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(1); - NSNumber *n = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSNumber *result = @(1/asin([n doubleValue])); @@ -677,7 +677,7 @@ - (DDExpression *)acsc:(NSArray *)arguments variables:(NSDictionary *)variables - (DDExpression *)asec:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(1); - NSNumber *n = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSNumber *result = @(1/acos([n doubleValue])); @@ -686,7 +686,7 @@ - (DDExpression *)asec:(NSArray *)arguments variables:(NSDictionary *)variables - (DDExpression *)acotan:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(1); - NSNumber *n = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSNumber *result = @(1/atan([n doubleValue])); @@ -697,7 +697,7 @@ - (DDExpression *)csch:(NSArray *)arguments variables:(NSDictionary *)variables REQUIRE_N_ARGS(1); DDExpression *e = [arguments objectAtIndex:0]; e = _DDDTOR(e, [self evaluator], error); - NSNumber *n = [[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSNumber *result = @(1/sinh([n doubleValue])); @@ -708,7 +708,7 @@ - (DDExpression *)sech:(NSArray *)arguments variables:(NSDictionary *)variables REQUIRE_N_ARGS(1); DDExpression *e = [arguments objectAtIndex:0]; e = _DDDTOR(e, [self evaluator], error); - NSNumber *n = [[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSNumber *result = @(1/cosh([n doubleValue])); @@ -719,7 +719,7 @@ - (DDExpression *)cotanh:(NSArray *)arguments variables:(NSDictionary *)variable REQUIRE_N_ARGS(1); DDExpression *e = [arguments objectAtIndex:0]; e = _DDDTOR(e, [self evaluator], error); - NSNumber *n = [[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSNumber *result = @(1/tanh([n doubleValue])); @@ -728,7 +728,7 @@ - (DDExpression *)cotanh:(NSArray *)arguments variables:(NSDictionary *)variable - (DDExpression *)acsch:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(1); - NSNumber *n = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSNumber *result = @(1/sinh([n doubleValue])); @@ -737,7 +737,7 @@ - (DDExpression *)acsch:(NSArray *)arguments variables:(NSDictionary *)variables - (DDExpression *)asech:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(1); - NSNumber *n = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSNumber *result = @(1/cosh([n doubleValue])); @@ -746,7 +746,7 @@ - (DDExpression *)asech:(NSArray *)arguments variables:(NSDictionary *)variables - (DDExpression *)acotanh:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(1); - NSNumber *n = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSNumber *result = @(1/atanh([n doubleValue])); @@ -757,7 +757,7 @@ - (DDExpression *)versin:(NSArray *)arguments variables:(NSDictionary *)variable REQUIRE_N_ARGS(1); DDExpression *e = [arguments objectAtIndex:0]; e = _DDDTOR(e, [self evaluator], error); - NSNumber *n = [[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSNumber *result = @(1-cos([n doubleValue])); @@ -768,7 +768,7 @@ - (DDExpression *)vercosin:(NSArray *)arguments variables:(NSDictionary *)variab REQUIRE_N_ARGS(1); DDExpression *e = [arguments objectAtIndex:0]; e = _DDDTOR(e, [self evaluator], error); - NSNumber *n = [[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSNumber *result = @(1+cos([n doubleValue])); @@ -779,7 +779,7 @@ - (DDExpression *)coversin:(NSArray *)arguments variables:(NSDictionary *)variab REQUIRE_N_ARGS(1); DDExpression *e = [arguments objectAtIndex:0]; e = _DDDTOR(e, [self evaluator], error); - NSNumber *n = [[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSNumber *result = @(1-sin([n doubleValue])); @@ -790,7 +790,7 @@ - (DDExpression *)covercosin:(NSArray *)arguments variables:(NSDictionary *)vari REQUIRE_N_ARGS(1); DDExpression *e = [arguments objectAtIndex:0]; e = _DDDTOR(e, [self evaluator], error); - NSNumber *n = [[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSNumber *result = @(1+sin([n doubleValue])); @@ -801,7 +801,7 @@ - (DDExpression *)haversin:(NSArray *)arguments variables:(NSDictionary *)variab REQUIRE_N_ARGS(1); DDExpression *e = [arguments objectAtIndex:0]; e = _DDDTOR(e, [self evaluator], error); - NSNumber *n = [[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSNumber *result = @((1-cos([n doubleValue]))/2); @@ -812,7 +812,7 @@ - (DDExpression *)havercosin:(NSArray *)arguments variables:(NSDictionary *)vari REQUIRE_N_ARGS(1); DDExpression *e = [arguments objectAtIndex:0]; e = _DDDTOR(e, [self evaluator], error); - NSNumber *n = [[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSNumber *result = @((1+cos([n doubleValue]))/2); @@ -823,7 +823,7 @@ - (DDExpression *)hacoversin:(NSArray *)arguments variables:(NSDictionary *)vari REQUIRE_N_ARGS(1); DDExpression *e = [arguments objectAtIndex:0]; e = _DDDTOR(e, [self evaluator], error); - NSNumber *n = [[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSNumber *result = @((1-sin([n doubleValue]))/2); @@ -834,7 +834,7 @@ - (DDExpression *)hacovercosin:(NSArray *)arguments variables:(NSDictionary *)va REQUIRE_N_ARGS(1); DDExpression *e = [arguments objectAtIndex:0]; e = _DDDTOR(e, [self evaluator], error); - NSNumber *n = [[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSNumber *result = @((1+sin([n doubleValue]))/2); @@ -845,7 +845,7 @@ - (DDExpression *)exsec:(NSArray *)arguments variables:(NSDictionary *)variables REQUIRE_N_ARGS(1); DDExpression *e = [arguments objectAtIndex:0]; e = _DDDTOR(e, [self evaluator], error); - NSNumber *n = [[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSNumber *result = @((1/cos([n doubleValue]))-1); @@ -856,7 +856,7 @@ - (DDExpression *)excsc:(NSArray *)arguments variables:(NSDictionary *)variables REQUIRE_N_ARGS(1); DDExpression *e = [arguments objectAtIndex:0]; e = _DDDTOR(e, [self evaluator], error); - NSNumber *n = [[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSNumber *result = @((1/sin([n doubleValue]))-1); @@ -867,7 +867,7 @@ - (DDExpression *)crd:(NSArray *)arguments variables:(NSDictionary *)variables e REQUIRE_N_ARGS(1); DDExpression *e = [arguments objectAtIndex:0]; e = _DDDTOR(e, [self evaluator], error); - NSNumber *n = [[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSNumber *result = @(2*sin([n doubleValue]/2)); @@ -876,7 +876,7 @@ - (DDExpression *)crd:(NSArray *)arguments variables:(NSDictionary *)variables e - (DDExpression *)dtor:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(1); - NSNumber *n = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSNumber *result = @([n doubleValue]/180 * M_PI); @@ -885,7 +885,7 @@ - (DDExpression *)dtor:(NSArray *)arguments variables:(NSDictionary *)variables - (DDExpression *)rtod:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(1); - NSNumber *n = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSNumber *result = @([n doubleValue]/M_PI * 180); @@ -960,8 +960,8 @@ - (DDExpression *)ln10:(NSArray *)arguments variables:(NSDictionary *)variables // logical functions - (DDExpression *)l_and:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(2); - NSNumber *left = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; - NSNumber *right = [[self evaluator] evaluateExpression:[arguments objectAtIndex:1] withSubstitutions:variables error:error]; + NSNumber *left = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; + NSNumber *right = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:1] withSubstitutions:variables error:error]]; RETURN_IF_NIL(left); RETURN_IF_NIL(right); NSNumber *result = @([left boolValue] && [right boolValue]); @@ -970,8 +970,8 @@ - (DDExpression *)l_and:(NSArray *)arguments variables:(NSDictionary *)variables - (DDExpression *)l_or:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(2); - NSNumber *left = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; - NSNumber *right = [[self evaluator] evaluateExpression:[arguments objectAtIndex:1] withSubstitutions:variables error:error]; + NSNumber *left = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; + NSNumber *right = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:1] withSubstitutions:variables error:error]]; RETURN_IF_NIL(left); RETURN_IF_NIL(right); NSNumber *result = @([left boolValue] || [right boolValue]); @@ -980,7 +980,7 @@ - (DDExpression *)l_or:(NSArray *)arguments variables:(NSDictionary *)variables - (DDExpression *)l_not:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(1); - NSNumber *n = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSNumber *result = @(![n boolValue]); return [DDExpression numberExpressionWithNumber:result]; @@ -988,8 +988,8 @@ - (DDExpression *)l_not:(NSArray *)arguments variables:(NSDictionary *)variables - (DDExpression *)l_eq:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(2); - NSNumber *left = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; - NSNumber *right = [[self evaluator] evaluateExpression:[arguments objectAtIndex:1] withSubstitutions:variables error:error]; + NSNumber *left = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; + NSNumber *right = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:1] withSubstitutions:variables error:error]]; RETURN_IF_NIL(left); RETURN_IF_NIL(right); NSComparisonResult compare = [left compare:right]; @@ -999,8 +999,8 @@ - (DDExpression *)l_eq:(NSArray *)arguments variables:(NSDictionary *)variables - (DDExpression *)l_neq:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(2); - NSNumber *left = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; - NSNumber *right = [[self evaluator] evaluateExpression:[arguments objectAtIndex:1] withSubstitutions:variables error:error]; + NSNumber *left = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; + NSNumber *right = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:1] withSubstitutions:variables error:error]]; RETURN_IF_NIL(left); RETURN_IF_NIL(right); NSComparisonResult compare = [left compare:right]; @@ -1010,8 +1010,8 @@ - (DDExpression *)l_neq:(NSArray *)arguments variables:(NSDictionary *)variables - (DDExpression *)l_lt:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(2); - NSNumber *left = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; - NSNumber *right = [[self evaluator] evaluateExpression:[arguments objectAtIndex:1] withSubstitutions:variables error:error]; + NSNumber *left = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; + NSNumber *right = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:1] withSubstitutions:variables error:error]]; RETURN_IF_NIL(left); RETURN_IF_NIL(right); NSComparisonResult compare = [left compare:right]; @@ -1020,9 +1020,9 @@ - (DDExpression *)l_lt:(NSArray *)arguments variables:(NSDictionary *)variables } - (DDExpression *)l_gt:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { - REQUIRE_N_ARGS(2); - NSNumber *left = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; - NSNumber *right = [[self evaluator] evaluateExpression:[arguments objectAtIndex:1] withSubstitutions:variables error:error]; + REQUIRE_N_ARGS(2); + NSNumber *left = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; + NSNumber *right = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:1] withSubstitutions:variables error:error]]; RETURN_IF_NIL(left); RETURN_IF_NIL(right); NSComparisonResult compare = [left compare:right]; @@ -1032,8 +1032,8 @@ - (DDExpression *)l_gt:(NSArray *)arguments variables:(NSDictionary *)variables - (DDExpression *)l_ltoe:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(2); - NSNumber *left = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; - NSNumber *right = [[self evaluator] evaluateExpression:[arguments objectAtIndex:1] withSubstitutions:variables error:error]; + NSNumber *left = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; + NSNumber *right = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:1] withSubstitutions:variables error:error]]; RETURN_IF_NIL(left); RETURN_IF_NIL(right); NSComparisonResult compare = [left compare:right]; @@ -1043,8 +1043,8 @@ - (DDExpression *)l_ltoe:(NSArray *)arguments variables:(NSDictionary *)variable - (DDExpression *)l_gtoe:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(2); - NSNumber *left = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; - NSNumber *right = [[self evaluator] evaluateExpression:[arguments objectAtIndex:1] withSubstitutions:variables error:error]; + NSNumber *left = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; + NSNumber *right = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:1] withSubstitutions:variables error:error]]; RETURN_IF_NIL(left); RETURN_IF_NIL(right); NSComparisonResult compare = [left compare:right]; diff --git a/DDMathParser/_DDPrecisionFunctionEvaluator.m b/DDMathParser/_DDPrecisionFunctionEvaluator.m index 62c0dbf..03f7c59 100644 --- a/DDMathParser/_DDPrecisionFunctionEvaluator.m +++ b/DDMathParser/_DDPrecisionFunctionEvaluator.m @@ -16,10 +16,10 @@ @implementation _DDPrecisionFunctionEvaluator - (DDExpression *)add:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(2); - NSNumber *firstValue = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; + NSNumber *firstValue = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; RETURN_IF_NIL(firstValue); - NSNumber *secondValue = [[self evaluator] evaluateExpression:[arguments objectAtIndex:1] withSubstitutions:variables error:error]; + NSNumber *secondValue = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:1] withSubstitutions:variables error:error]]; RETURN_IF_NIL(secondValue); NSDecimal decimal = DDDecimalAdd([firstValue decimalValue], [secondValue decimalValue]); @@ -29,9 +29,9 @@ - (DDExpression *)add:(NSArray *)arguments variables:(NSDictionary *)variables e - (DDExpression *)subtract:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(2); - NSNumber *firstValue = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; + NSNumber *firstValue = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; RETURN_IF_NIL(firstValue); - NSNumber *secondValue = [[self evaluator] evaluateExpression:[arguments objectAtIndex:1] withSubstitutions:variables error:error]; + NSNumber *secondValue = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:1] withSubstitutions:variables error:error]]; RETURN_IF_NIL(secondValue); NSDecimal decimal = DDDecimalSubtract([firstValue decimalValue], [secondValue decimalValue]); NSDecimalNumber *result = [NSDecimalNumber decimalNumberWithDecimal:decimal]; @@ -40,9 +40,9 @@ - (DDExpression *)subtract:(NSArray *)arguments variables:(NSDictionary *)variab - (DDExpression *)multiply:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(2); - NSNumber *firstValue = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; + NSNumber *firstValue = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; RETURN_IF_NIL(firstValue); - NSNumber *secondValue = [[self evaluator] evaluateExpression:[arguments objectAtIndex:1] withSubstitutions:variables error:error]; + NSNumber *secondValue = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:1] withSubstitutions:variables error:error]]; RETURN_IF_NIL(secondValue); NSDecimal decimal = DDDecimalMultiply([firstValue decimalValue], [secondValue decimalValue]); NSDecimalNumber *result = [NSDecimalNumber decimalNumberWithDecimal:decimal]; @@ -51,9 +51,9 @@ - (DDExpression *)multiply:(NSArray *)arguments variables:(NSDictionary *)variab - (DDExpression *)divide:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(2); - NSNumber *firstValue = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; + NSNumber *firstValue = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; RETURN_IF_NIL(firstValue); - NSNumber *secondValue = [[self evaluator] evaluateExpression:[arguments objectAtIndex:1] withSubstitutions:variables error:error]; + NSNumber *secondValue = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:1] withSubstitutions:variables error:error]]; RETURN_IF_NIL(secondValue); NSDecimal decimal = DDDecimalDivide([firstValue decimalValue], [secondValue decimalValue]); NSDecimalNumber *result = [NSDecimalNumber decimalNumberWithDecimal:decimal]; @@ -62,9 +62,9 @@ - (DDExpression *)divide:(NSArray *)arguments variables:(NSDictionary *)variable - (DDExpression *)mod:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(2); - NSNumber *firstValue = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; + NSNumber *firstValue = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; RETURN_IF_NIL(firstValue); - NSNumber *secondValue = [[self evaluator] evaluateExpression:[arguments objectAtIndex:1] withSubstitutions:variables error:error]; + NSNumber *secondValue = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:1] withSubstitutions:variables error:error]]; RETURN_IF_NIL(secondValue); NSDecimal decimal = DDDecimalMod([firstValue decimalValue], [secondValue decimalValue]); NSDecimalNumber *result = [NSDecimalNumber decimalNumberWithDecimal:decimal]; @@ -73,7 +73,7 @@ - (DDExpression *)mod:(NSArray *)arguments variables:(NSDictionary *)variables e - (DDExpression *)negate:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(1); - NSNumber *firstValue = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; + NSNumber *firstValue = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; RETURN_IF_NIL(firstValue); NSDecimal decimal = [firstValue decimalValue]; DDDecimalNegate(&decimal); @@ -83,7 +83,7 @@ - (DDExpression *)negate:(NSArray *)arguments variables:(NSDictionary *)variable - (DDExpression *)factorial:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(1); - NSNumber *firstValue = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; + NSNumber *firstValue = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; RETURN_IF_NIL(firstValue); NSNumber *result = nil; @@ -109,9 +109,9 @@ - (DDExpression *)factorial:(NSArray *)arguments variables:(NSDictionary *)varia - (DDExpression *)pow:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(2); - NSNumber *base = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; + NSNumber *base = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; RETURN_IF_NIL(base); - NSNumber *exponent = [[self evaluator] evaluateExpression:[arguments objectAtIndex:1] withSubstitutions:variables error:error]; + NSNumber *exponent = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:1] withSubstitutions:variables error:error]]; RETURN_IF_NIL(exponent); NSDecimal decimal = DDDecimalPower([base decimalValue], [exponent decimalValue]); @@ -121,9 +121,9 @@ - (DDExpression *)pow:(NSArray *)arguments variables:(NSDictionary *)variables e - (DDExpression *)nthroot:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(2); - NSNumber *base = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; + NSNumber *base = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; RETURN_IF_NIL(base); - NSNumber *root = [[self evaluator] evaluateExpression:[arguments objectAtIndex:1] withSubstitutions:variables error:error]; + NSNumber *root = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:1] withSubstitutions:variables error:error]]; RETURN_IF_NIL(root); NSDecimal exponent = DDDecimalInverse([root decimalValue]); @@ -139,9 +139,9 @@ - (DDExpression *)nthroot:(NSArray *)arguments variables:(NSDictionary *)variabl - (DDExpression *)rshift:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(2); - NSNumber *first = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; + NSNumber *first = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; RETURN_IF_NIL(first); - NSNumber *second = [[self evaluator] evaluateExpression:[arguments objectAtIndex:1] withSubstitutions:variables error:error]; + NSNumber *second = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:1] withSubstitutions:variables error:error]]; RETURN_IF_NIL(second); NSDecimal decimal = DDDecimalRightShift([first decimalValue], [second decimalValue]); NSDecimalNumber *result = [NSDecimalNumber decimalNumberWithDecimal:decimal]; @@ -150,9 +150,9 @@ - (DDExpression *)rshift:(NSArray *)arguments variables:(NSDictionary *)variable - (DDExpression *)lshift:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(2); - NSNumber *first = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; + NSNumber *first = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; RETURN_IF_NIL(first); - NSNumber *second = [[self evaluator] evaluateExpression:[arguments objectAtIndex:1] withSubstitutions:variables error:error]; + NSNumber *second = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:1] withSubstitutions:variables error:error]]; RETURN_IF_NIL(second); NSDecimal decimal = DDDecimalLeftShift([first decimalValue], [second decimalValue]); NSDecimalNumber *result = [NSDecimalNumber decimalNumberWithDecimal:decimal]; @@ -175,7 +175,7 @@ - (DDExpression *)sum:(NSArray *)arguments variables:(NSDictionary *)variables e REQUIRE_GTOE_N_ARGS(1); NSDecimal sum = DDDecimalZero(); for (DDExpression *e in arguments) { - NSNumber *n = [[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); sum = DDDecimalAdd(sum, [n decimalValue]); } @@ -197,7 +197,7 @@ - (DDExpression *)median:(NSArray *)arguments variables:(NSDictionary *)variable REQUIRE_GTOE_N_ARGS(2); NSMutableArray *evaluatedNumbers = [NSMutableArray array]; for (DDExpression *e in arguments) { - NSNumber *n = [[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); [evaluatedNumbers addObject:n]; } @@ -226,7 +226,7 @@ - (DDExpression *)stddev:(NSArray *)arguments variables:(NSDictionary *)variable NSDecimal avg = [[avgExpression number] decimalValue]; NSDecimal stddev = DDDecimalZero(); for (DDExpression *e in arguments) { - NSNumber *argValue = [[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]; + NSNumber *argValue = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]]; RETURN_IF_NIL(argValue); NSDecimal diff = DDDecimalSubtract(avg, [argValue decimalValue]); diff = DDDecimalPower(diff, DDDecimalTwo()); @@ -240,7 +240,7 @@ - (DDExpression *)stddev:(NSArray *)arguments variables:(NSDictionary *)variable - (DDExpression *)sqrt:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(1); - NSNumber *n = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSDecimal decimal = DDDecimalSqrt([n decimalValue]); @@ -254,7 +254,7 @@ - (DDExpression *)sqrt:(NSArray *)arguments variables:(NSDictionary *)variables - (DDExpression *)log:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(1); - NSNumber *n = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); // FIXME: use high precision math NSNumber *result = @(log10([n doubleValue])); @@ -263,7 +263,7 @@ - (DDExpression *)log:(NSArray *)arguments variables:(NSDictionary *)variables e - (DDExpression *)ln:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(1); - NSNumber *n = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); // FIXME: use high precision math return [DDExpression numberExpressionWithNumber:@(log([n doubleValue]))]; @@ -271,7 +271,7 @@ - (DDExpression *)ln:(NSArray *)arguments variables:(NSDictionary *)variables er - (DDExpression *)log2:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(1); - NSNumber *n = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); // FIXME: use high precision math NSNumber *result = @(log2([n doubleValue])); @@ -280,7 +280,7 @@ - (DDExpression *)log2:(NSArray *)arguments variables:(NSDictionary *)variables - (DDExpression *)exp:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(1); - NSNumber *n = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); // FIXME: use high precision math NSNumber *result = @(exp([n doubleValue])); @@ -289,7 +289,7 @@ - (DDExpression *)exp:(NSArray *)arguments variables:(NSDictionary *)variables e - (DDExpression *)ceil:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(1); - NSNumber *n = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSDecimal decimal = [n decimalValue]; @@ -300,7 +300,7 @@ - (DDExpression *)ceil:(NSArray *)arguments variables:(NSDictionary *)variables - (DDExpression *)abs:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(1); - NSNumber *n = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSDecimal decimal = [n decimalValue]; @@ -314,7 +314,7 @@ - (DDExpression *)abs:(NSArray *)arguments variables:(NSDictionary *)variables e - (DDExpression *)floor:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(1); - NSNumber *n = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSDecimal decimal = [n decimalValue]; @@ -341,13 +341,13 @@ - (DDExpression *)percent:(NSArray *)arguments variables:(NSDictionary *)variabl if (percentIsRightArgument) { DDExpression *baseExpression = [[percentContext arguments] objectAtIndex:0]; - context = [[self evaluator] evaluateExpression:baseExpression withSubstitutions:variables error:error]; + context = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:baseExpression withSubstitutions:variables error:error]]; } } } - NSNumber *percent = [[self evaluator] evaluateExpression:percentArgument withSubstitutions:variables error:error]; + NSNumber *percent = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:percentArgument withSubstitutions:variables error:error]]; RETURN_IF_NIL(context); RETURN_IF_NIL(percent); @@ -364,7 +364,7 @@ - (DDExpression *)sin:(NSArray *)arguments variables:(NSDictionary *)variables e REQUIRE_N_ARGS(1); DDExpression *e = [arguments objectAtIndex:0]; e = _DDDTOR(e, [self evaluator], error); - NSNumber *n = [[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSDecimal decimal = DDDecimalSin([n decimalValue]); @@ -376,7 +376,7 @@ - (DDExpression *)cos:(NSArray *)arguments variables:(NSDictionary *)variables e REQUIRE_N_ARGS(1); DDExpression *e = [arguments objectAtIndex:0]; e = _DDDTOR(e, [self evaluator], error); - NSNumber *n = [[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSDecimal decimal = DDDecimalCos([n decimalValue]); @@ -388,7 +388,7 @@ - (DDExpression *)tan:(NSArray *)arguments variables:(NSDictionary *)variables e REQUIRE_N_ARGS(1); DDExpression *e = [arguments objectAtIndex:0]; e = _DDDTOR(e, [self evaluator], error); - NSNumber *n = [[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSDecimal decimal = DDDecimalTan([n decimalValue]); @@ -398,7 +398,7 @@ - (DDExpression *)tan:(NSArray *)arguments variables:(NSDictionary *)variables e - (DDExpression *)asin:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(1); - NSNumber *n = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSDecimal decimal = DDDecimalAsin([n decimalValue]); @@ -408,7 +408,7 @@ - (DDExpression *)asin:(NSArray *)arguments variables:(NSDictionary *)variables - (DDExpression *)acos:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(1); - NSNumber *n = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSDecimal decimal = DDDecimalAcos([n decimalValue]); @@ -418,7 +418,7 @@ - (DDExpression *)acos:(NSArray *)arguments variables:(NSDictionary *)variables - (DDExpression *)atan:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(1); - NSNumber *n = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSDecimal decimal = DDDecimalAtan([n decimalValue]); @@ -430,7 +430,7 @@ - (DDExpression *)sinh:(NSArray *)arguments variables:(NSDictionary *)variables REQUIRE_N_ARGS(1); DDExpression *e = [arguments objectAtIndex:0]; e = _DDDTOR(e, [self evaluator], error); - NSNumber *n = [[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSDecimal decimal = DDDecimalSinh([n decimalValue]); @@ -442,7 +442,7 @@ - (DDExpression *)cosh:(NSArray *)arguments variables:(NSDictionary *)variables REQUIRE_N_ARGS(1); DDExpression *e = [arguments objectAtIndex:0]; e = _DDDTOR(e, [self evaluator], error); - NSNumber *n = [[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSDecimal decimal = DDDecimalCosh([n decimalValue]); @@ -454,7 +454,7 @@ - (DDExpression *)tanh:(NSArray *)arguments variables:(NSDictionary *)variables REQUIRE_N_ARGS(1); DDExpression *e = [arguments objectAtIndex:0]; e = _DDDTOR(e, [self evaluator], error); - NSNumber *n = [[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSDecimal decimal = DDDecimalTanh([n decimalValue]); @@ -464,7 +464,7 @@ - (DDExpression *)tanh:(NSArray *)arguments variables:(NSDictionary *)variables - (DDExpression *)asinh:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(1); - NSNumber *n = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSDecimal decimal = DDDecimalAsinh([n decimalValue]); @@ -474,7 +474,7 @@ - (DDExpression *)asinh:(NSArray *)arguments variables:(NSDictionary *)variables - (DDExpression *)acosh:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(1); - NSNumber *n = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSDecimal decimal = DDDecimalAcosh([n decimalValue]); @@ -484,7 +484,7 @@ - (DDExpression *)acosh:(NSArray *)arguments variables:(NSDictionary *)variables - (DDExpression *)atanh:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(1); - NSNumber *n = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSDecimal decimal = DDDecimalAtanh([n decimalValue]); @@ -496,7 +496,7 @@ - (DDExpression *)csc:(NSArray *)arguments variables:(NSDictionary *)variables e REQUIRE_N_ARGS(1); DDExpression *e = [arguments objectAtIndex:0]; e = _DDDTOR(e, [self evaluator], error); - NSNumber *n = [[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSDecimal decimal = DDDecimalCsc([n decimalValue]); @@ -508,7 +508,7 @@ - (DDExpression *)sec:(NSArray *)arguments variables:(NSDictionary *)variables e REQUIRE_N_ARGS(1); DDExpression *e = [arguments objectAtIndex:0]; e = _DDDTOR(e, [self evaluator], error); - NSNumber *n = [[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSDecimal decimal = DDDecimalSec([n decimalValue]); @@ -520,7 +520,7 @@ - (DDExpression *)cotan:(NSArray *)arguments variables:(NSDictionary *)variables REQUIRE_N_ARGS(1); DDExpression *e = [arguments objectAtIndex:0]; e = _DDDTOR(e, [self evaluator], error); - NSNumber *n = [[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSDecimal decimal = DDDecimalCot([n decimalValue]); @@ -530,7 +530,7 @@ - (DDExpression *)cotan:(NSArray *)arguments variables:(NSDictionary *)variables - (DDExpression *)acsc:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(1); - NSNumber *n = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSDecimal decimal = DDDecimalAcsc([n decimalValue]); @@ -540,7 +540,7 @@ - (DDExpression *)acsc:(NSArray *)arguments variables:(NSDictionary *)variables - (DDExpression *)asec:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(1); - NSNumber *n = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSDecimal decimal = DDDecimalAsec([n decimalValue]); @@ -550,7 +550,7 @@ - (DDExpression *)asec:(NSArray *)arguments variables:(NSDictionary *)variables - (DDExpression *)acotan:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(1); - NSNumber *n = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSDecimal decimal = DDDecimalAcot([n decimalValue]); @@ -562,7 +562,7 @@ - (DDExpression *)csch:(NSArray *)arguments variables:(NSDictionary *)variables REQUIRE_N_ARGS(1); DDExpression *e = [arguments objectAtIndex:0]; e = _DDDTOR(e, [self evaluator], error); - NSNumber *n = [[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSDecimal decimal = DDDecimalCsch([n decimalValue]); @@ -574,7 +574,7 @@ - (DDExpression *)sech:(NSArray *)arguments variables:(NSDictionary *)variables REQUIRE_N_ARGS(1); DDExpression *e = [arguments objectAtIndex:0]; e = _DDDTOR(e, [self evaluator], error); - NSNumber *n = [[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSDecimal decimal = DDDecimalSech([n decimalValue]); @@ -586,7 +586,7 @@ - (DDExpression *)cotanh:(NSArray *)arguments variables:(NSDictionary *)variable REQUIRE_N_ARGS(1); DDExpression *e = [arguments objectAtIndex:0]; e = _DDDTOR(e, [self evaluator], error); - NSNumber *n = [[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSDecimal decimal = DDDecimalCoth([n decimalValue]); @@ -596,7 +596,7 @@ - (DDExpression *)cotanh:(NSArray *)arguments variables:(NSDictionary *)variable - (DDExpression *)acsch:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(1); - NSNumber *n = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSDecimal decimal = DDDecimalAcsch([n decimalValue]); @@ -606,7 +606,7 @@ - (DDExpression *)acsch:(NSArray *)arguments variables:(NSDictionary *)variables - (DDExpression *)asech:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(1); - NSNumber *n = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSDecimal decimal = DDDecimalAsech([n decimalValue]); @@ -616,7 +616,7 @@ - (DDExpression *)asech:(NSArray *)arguments variables:(NSDictionary *)variables - (DDExpression *)acotanh:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(1); - NSNumber *n = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSDecimal decimal = DDDecimalAcoth([n decimalValue]); @@ -628,7 +628,7 @@ - (DDExpression *)versin:(NSArray *)arguments variables:(NSDictionary *)variable REQUIRE_N_ARGS(1); DDExpression *e = [arguments objectAtIndex:0]; e = _DDDTOR(e, [self evaluator], error); - NSNumber *n = [[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSDecimal decimal = DDDecimalCos([n decimalValue]); @@ -641,7 +641,7 @@ - (DDExpression *)vercosin:(NSArray *)arguments variables:(NSDictionary *)variab REQUIRE_N_ARGS(1); DDExpression *e = [arguments objectAtIndex:0]; e = _DDDTOR(e, [self evaluator], error); - NSNumber *n = [[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSDecimal decimal = DDDecimalCos([n decimalValue]); @@ -654,7 +654,7 @@ - (DDExpression *)coversin:(NSArray *)arguments variables:(NSDictionary *)variab REQUIRE_N_ARGS(1); DDExpression *e = [arguments objectAtIndex:0]; e = _DDDTOR(e, [self evaluator], error); - NSNumber *n = [[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSDecimal decimal = DDDecimalSin([n decimalValue]); @@ -667,7 +667,7 @@ - (DDExpression *)covercosin:(NSArray *)arguments variables:(NSDictionary *)vari REQUIRE_N_ARGS(1); DDExpression *e = [arguments objectAtIndex:0]; e = _DDDTOR(e, [self evaluator], error); - NSNumber *n = [[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSDecimal decimal = DDDecimalSin([n decimalValue]); @@ -724,7 +724,7 @@ - (DDExpression *)exsec:(NSArray *)arguments variables:(NSDictionary *)variables REQUIRE_N_ARGS(1); DDExpression *e = [arguments objectAtIndex:0]; e = _DDDTOR(e, [self evaluator], error); - NSNumber *n = [[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSDecimal decimal = DDDecimalCos([n decimalValue]); @@ -738,7 +738,7 @@ - (DDExpression *)excsc:(NSArray *)arguments variables:(NSDictionary *)variables REQUIRE_N_ARGS(1); DDExpression *e = [arguments objectAtIndex:0]; e = _DDDTOR(e, [self evaluator], error); - NSNumber *n = [[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSDecimal decimal = DDDecimalSin([n decimalValue]); @@ -752,7 +752,7 @@ - (DDExpression *)crd:(NSArray *)arguments variables:(NSDictionary *)variables e REQUIRE_N_ARGS(1); DDExpression *e = [arguments objectAtIndex:0]; e = _DDDTOR(e, [self evaluator], error); - NSNumber *n = [[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:e withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSDecimal decimal = DDDecimalCos([n decimalValue]); @@ -764,7 +764,7 @@ - (DDExpression *)crd:(NSArray *)arguments variables:(NSDictionary *)variables e - (DDExpression *)dtor:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(1); - NSNumber *n = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSDecimal decimal = [n decimalValue]; @@ -776,7 +776,7 @@ - (DDExpression *)dtor:(NSArray *)arguments variables:(NSDictionary *)variables - (DDExpression *)rtod:(NSArray *)arguments variables:(NSDictionary *)variables error:(NSError **)error { REQUIRE_N_ARGS(1); - NSNumber *n = [[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]; + NSNumber *n = [[self evaluator] unwrapFromMathResult:[[self evaluator] evaluateExpression:[arguments objectAtIndex:0] withSubstitutions:variables error:error]]; RETURN_IF_NIL(n); NSDecimal decimal = [n decimalValue]; diff --git a/DDMathParser/_DDRewriteRule.m b/DDMathParser/_DDRewriteRule.m index a7b04a4..b58a51a 100644 --- a/DDMathParser/_DDRewriteRule.m +++ b/DDMathParser/_DDRewriteRule.m @@ -139,7 +139,7 @@ - (BOOL)matchExpression:(DDExpression *)target replacements:(NSMutableDictionary if (matches && _condition) { DDExpression *resolvedCondition = [self _expressionByApplyingReplacements:replacements toPattern:_condition]; NSError *evalError = nil; - NSNumber *result = [evaluator evaluateExpression:resolvedCondition withSubstitutions:replacements error:&evalError]; + NSNumber *result = [evaluator unwrapFromMathResult:[evaluator evaluateExpression:resolvedCondition withSubstitutions:replacements error:&evalError]]; matches &= [result boolValue]; } return matches; From 2b0f4771c87da90bf04bd9df7028f700c1b72384 Mon Sep 17 00:00:00 2001 From: Artem Viter Date: Fri, 9 Feb 2024 12:43:17 +0400 Subject: [PATCH 3/4] Implements copyWithZone and compare methods for DDMathEvaluatorResult.m. Fixes evaluateExpression: unwraps value before initing DDMathEvaluatorResult with this value. --- DDMathParser/DDMathEvaluator.m | 2 +- DDMathParser/DDMathEvaluatorResult.m | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/DDMathParser/DDMathEvaluator.m b/DDMathParser/DDMathEvaluator.m index 263b474..3fcb94c 100644 --- a/DDMathParser/DDMathEvaluator.m +++ b/DDMathParser/DDMathEvaluator.m @@ -203,7 +203,7 @@ - (DDMathEvaluatorResult *)evaluateString:(NSString *)expressionString withSubst - (DDMathEvaluatorResult *)evaluateExpression:(DDExpression *)expression withSubstitutions:(NSDictionary *)substitutions error:(NSError **)error { if ([expression expressionType] == DDExpressionTypeNumber) { - return [[DDMathEvaluatorResult alloc] initWithNumber:[expression number] salesforceType:expression.salesforceReturnType]; + return [[DDMathEvaluatorResult alloc] initWithNumber: [self unwrapFromMathResult: [expression number]] salesforceType:expression.salesforceReturnType]; // todo ?? } else if ([expression expressionType] == DDExpressionTypeVariable) { return [self _evaluateVariableExpression:expression withSubstitutions:substitutions error:error]; } else if ([expression expressionType] == DDExpressionTypeFunction) { diff --git a/DDMathParser/DDMathEvaluatorResult.m b/DDMathParser/DDMathEvaluatorResult.m index f1464a2..921cd3a 100644 --- a/DDMathParser/DDMathEvaluatorResult.m +++ b/DDMathParser/DDMathEvaluatorResult.m @@ -37,5 +37,27 @@ - (BOOL)isEqual:(id)object { return [self.number isEqual:otherEvaluatorResult.number]; } +- (id)copyWithZone:(NSZone *)zone { + // Create a new instance of DDMathEvaluatorResult + DDMathEvaluatorResult *copy = [[[self class] allocWithZone:zone] init]; + + // Copy the properties to the new instance + copy->_number = [self.number copy]; + copy->_salesforceType = [self.salesforceType copy]; + + return copy; +} + +- (NSComparisonResult)compare:(DDMathEvaluatorResult *)otherResult { + // Compare the numbers of self and otherResult + NSNumber* compareWith = nil; + if(otherResult == nil) { + return [self.number compare:nil]; + } else if([otherResult isKindOfClass: DDMathEvaluatorResult.class]) { + return [self.number compare:otherResult.number]; + } else { + return [self.number compare:otherResult]; + } +} @end From 0a172c9da613d7fa19024327be92d55111fbc383 Mon Sep 17 00:00:00 2001 From: Artem Viter Date: Fri, 9 Feb 2024 15:47:48 +0400 Subject: [PATCH 4/4] Deletes `todo` comment. --- DDMathParser/DDMathEvaluator.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DDMathParser/DDMathEvaluator.m b/DDMathParser/DDMathEvaluator.m index 3fcb94c..657b057 100644 --- a/DDMathParser/DDMathEvaluator.m +++ b/DDMathParser/DDMathEvaluator.m @@ -203,7 +203,7 @@ - (DDMathEvaluatorResult *)evaluateString:(NSString *)expressionString withSubst - (DDMathEvaluatorResult *)evaluateExpression:(DDExpression *)expression withSubstitutions:(NSDictionary *)substitutions error:(NSError **)error { if ([expression expressionType] == DDExpressionTypeNumber) { - return [[DDMathEvaluatorResult alloc] initWithNumber: [self unwrapFromMathResult: [expression number]] salesforceType:expression.salesforceReturnType]; // todo ?? + return [[DDMathEvaluatorResult alloc] initWithNumber: [self unwrapFromMathResult: [expression number]] salesforceType:expression.salesforceReturnType]; } else if ([expression expressionType] == DDExpressionTypeVariable) { return [self _evaluateVariableExpression:expression withSubstitutions:substitutions error:error]; } else if ([expression expressionType] == DDExpressionTypeFunction) {