任何人都可以帮助解决这个DDMathParser新function?
我正在注册一个求和函数是sum(expression,initial,final)
。 expression
包含独立variablesx
, initial
和final
是整数。 例如, sum(2x,2,4)
应该返回2 * 2 + 3 * 2 + 4 * 2 = 18
。 不过,我无法用expression
x
代替initial
和final
之间的每个值。 这是我的代码,它不起作用。 谁能告诉我如何解决它?
//sum(expr (dependent on x),initial,final) [evaluator registerFunction:^DDExpression *(NSArray *args, NSDictionary *vars, DDMathEvaluator *eval, NSError *__autoreleasing *error) { DDExpression *final = nil; if([args count] == 3){ DDExpression *expr = [args objectAtIndex:0]; DDExpression *start = [args objectAtIndex:1]; DDExpression *end = [args objectAtIndex:2]; //test whether start and end are integers double startDouble = [[start evaluateWithSubstitutions:nil evaluator:evaluator error:nil] doubleValue]; double endDouble = [[end evaluateWithSubstitutions:nil evaluator:evaluator error:nil] doubleValue]; int startInt = (int)startDouble; int endInt = (int)endDouble; if (((startDouble-startInt)>0.9999 || (startDouble-startInt)<0.0001) && ((endDouble-endInt)>0.9999 || (endDouble-endInt)<0.0001)) { //start and end are integers double resultSum = 0; for (int i=startInt; i<=endInt; i++) { NSNumber *xValue = [NSNumber numberWithInt:i]; NSDictionary *substitution = [NSDictionary dictionaryWithObjectsAndKeys:xValue,@"x", nil]; NSNumber *valueOfExpr = [expr evaluateWithSubstitutions:substitution evaluator:evaluator error:nil]; resultSum = resultSum + [valueOfExpr doubleValue]; } final = [DDExpression numberExpressionWithNumber:[NSNumber numberWithDouble:resultSum]]; } } return final; }forName:@"sum"];
DDMathParser作者在这里。
有两件事情是错的,一件事情是不理想的。
- 错了 – 你不能调用这个函数“sum”。 “sum”是一个内置函数 , 内置函数不能被覆盖 。
- 错误 – 你的函数的第一个参数是:
"2x"
。 这很好,除了x
被解释为一个函数 ,但在你的for循环里,你把x
当作一个variables来对待。 你需要从根本上改变你的函数的工作方式,或者使用2 * $x
(或者2$x
)这个forms作为函数的第一个参数。 - 次优 – 不是从计算的参数中获取
doubleValue
,而是取而代之的是integerValue
并避免整个double-to-int转换。
下面是我如何清理你的函数(尽pipe你可能需要做更多的工作来填充error
输出参数):
[evaluator registerFunction:^DDExpression *(NSArray *args, NSDictionary *vars, DDMathEvaluator *eval, NSError *__autoreleasing *error) { DDExpression *final = nil; if ([args count] == 3) { DDExpression *expr = [args objectAtIndex:0]; DDExpression *start = [args objectAtIndex:1]; DDExpression *end = [args objectAtIndex:2]; //get the start and end values NSInteger startValue = [[eval evaluateExpression:start withSubstitutions:vars error:error] integerValue]; NSInteger endValue = [[eval evaluateExpression:end withSubstitutions:vars error:error] integerValue]; double sum = 0; for (NSInteger i = startValue; i <= endValue; i++) { NSDictionary *substitution = @{@"x": @(i)}; NSNumber *value = [eval evaluateExpression:expr withSubstitutions:substitution error:error]; sum += [value doubleValue]; } final = [DDExpression numberExpressionWithNumber:@(sum)]; } return final; } forName:@"sum2"];
有了这个,你可以做sum2(2*$x, 2, 4)
,它会评估到18。