私はプログラミングに不慣れです。に派生関数や統合関数などの新しい関数を追加したいと思いddmathparser
ます。私が見つけることができるのは、ddmathparser
のwikiページhttps://github.com/davedelong/DDMathParser/wiki/Adding-New-Functionsの短いチュートリアルだけです。ただ、短すぎてフォローできず、何度か読んでも何をしているのかわからない。では、誰かが新しい関数を追加するための手順を詳しく説明したり、これを行うためのより詳細なチュートリアルを教えてもらえますか?私は本当に自分の研究をしましたが、見つけることができません。どうもありがとう。
質問する
317 次
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 に答える