1

私はプログラミングに不慣れです。に派生関数や統合関数などの新しい関数を追加したいと思いddmathparserます。私が見つけることができるのは、ddmathparserのwikiページ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 に答える