任何人都可以帮助解决这个DDMathParser新功能?(Can anyone help fix t

2019-10-17 22:27发布

我注册求和函数即sum(expression,initial,final) 。 该expression包含独立变量xinitialfinal是整数。 例如, sum(2x,2,4)应返回2 * 2 + 3 * 2 + 4 * 2 = 18 。 然而,我有麻烦代xexpression对之间的每个值initialfinal 。 这里是我的代码,它不工作。 谁能告诉我如何解决它?

//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"];

Answer 1:

DDMathParser笔者在这里。

有两件事情错了,一件事不理想。

  1. 错误 - 你不能调用该函数“求和”。 “和”是一个内置的功能 ,并内置函数不能被重写 。
  2. 错误-你的函数的第一个参数是: "2x" 。 这很好,除了x被解释为功能 ,但是你在for循环中你治疗x就好像它是一个变量。 您可能需要从根本上改变你的函数是如何工作的,或者使用表格2 * $x (或只是2$x )作为第一个参数,以你的函数。
  3. 次优-不但得不到的doubleValue断评估参数,刚刚拿到integerValue代替,避免了整个双到INT的转换。

以下是我会收拾你的函数(虽然你可能应该在填充的方式多做一点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。



文章来源: Can anyone help fix this DDMathParser new function?