【问题标题】:Can anyone point to a tutorial of adding new functions in ddmathparser? [closed]谁能指出在 ddmathparser 中添加新函数的教程? [关闭]
【发布时间】:2013-03-24 22:49:59
【问题描述】:

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

【问题讨论】:

    标签: objective-c ddmathparser


    【解决方案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,
      ...
    };
    

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

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

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

    【讨论】:

    • 谢谢。现在我明白了这是如何工作的。那么我应该把代码放在哪里呢?在需要该函数的文件中还是在 DDMathParser 文件之一中?
    • @zyl1024 把它放在你自己的代码中。
    • 谢谢你,特别是添加的解释。
    • 您好,德龙先生,我遇到了一个新问题。我想创建一个带有多个参数的新函数。我发现在 DDMathParser 中,所有参数都是 DDExpression 类型的(即使它们本质上是数字)。你能告诉我如何将 DDExpression 转换为 NSNumber 或 int 类型,因为我想对参数做一些复杂的事情,而且我更喜欢使用 NSNumber 或 int 吗?
    • @zyl1024 github.com/davedelong/DDMathParser/blob/master/DDMathParser/… DDExpression 对象不仅仅代表数字。它们还可以表示函数和变量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-17
    • 1970-01-01
    • 2013-06-22
    • 2010-10-23
    • 2012-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多