1

我是编程新手。我想在ddmathparser. 我唯一能找到的是ddmathparserwiki 页面https://github.com/davedelong/DDMathParser/wiki/Adding-New-Functions上的简短教程。但是,我看不懂,因为它太短了,看了几遍,我还是不明白它在做什么。那么任何人都可以详细说明添加新功能的步骤或给我一些更详细的教程吗?我真的做了我的研究,但我找不到一个。非常感谢。

4

1 回答 1

1

DDMathParser 作者在这里。

添加multiply by two函数的方法如下:

DDMathEvaluator *evaluator = [DDMathEvaluator sharedMathEvaluator];
// a function takes arguments, variable values, the evaluator, and an error pointer
// and returns a new expression
[evaluator registerFunction:^DDExpression *(NSArray *args, NSDictionary *vars, DDMathEvaluator *eval, NSError *__autoreleasing *error) {
    DDExpression *final = nil;

    // multiplyBy2() can only handle a single argument
    if ([args count] == 1) {
        // get the argument and simply wrap it in a "multiply()" function
        DDExpression *argExpression = [args objectAtIndex:0];
        DDExpression *twoExpression = [DDExpression numberExpressionWithNumber:@2];
        final = [DDExpression functionExpressionWithFunction:DDOperatorMultiply arguments:@[argExpression, twoExpression] error:nil];
    } else if (error) {
        // there wasn't only one argument
        NSString *description = [NSString stringWithFormat:@"multiplyBy2() requires 1 argument.  %ld were given", [args count]];
        *error = [NSError errorWithDomain:DDMathParserErrorDomain code:DDErrorCodeInvalidNumberOfArguments userInfo:@{NSLocalizedDescriptionKey: description}];
    }
    return final;

} forName:@"multiplyBy2"];

现在你可以这样做:

NSNumber *result = [@"multiplyBy2(21)" stringByEvaluatingString];

然后回来@42


这里发生了什么:

在内部,DDMathEvaluator基本上有一个很大的NSDictionary地方,它保存了它所知道的所有函数的列表,键入了该函数的名称,有点像这样:

_functions = @{
  @"multiply" : multiplyFunctionBlock,
  @"add" : addFunctionBlock,
  ...
};

(显然它比这要复杂一些,但这是基本思想)

当评估器评估一个字符串并遇到一个函数时,它会在这个字典中查找该函数的块是什么。它检索块,然后使用字符串中的参数(如果有的话)执行块。块的结果是函数的结果。

该结果被替换回来,并继续评估。

于 2013-03-24T14:43:40.087 回答