Может кто-нибудь указать на учебник по добавлению новых функций в ddmathparser?
Я новичок в программировании. Я хочу добавить некоторые новые функции, такие как производные и интеграции ddmathparser
, Единственное, что я могу найти, это краткое руководство по ddmathparser
Вики-страница https://github.com/davedelong/DDMathParser/wiki/Adding-New-Functions. Однако я не могу следить за этим, потому что он слишком короткий, и после прочтения несколько раз я все еще не могу понять, что он делает. Так может кто-нибудь разработать шаги, чтобы добавить новую функцию или дать мне более подробные учебники по этому? Я действительно провел исследование, но не могу найти. Спасибо большое.
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,
...
};
(Очевидно, что это немного сложнее, но это основная идея)
Когда оценщик оценивает строку и наталкивается на функцию, он ищет в этом словаре, что такое блок для функции. Он извлекает блок, а затем выполняет блок с аргументами (если они есть) из строки. Результатом блока является результат функции.
Этот результат подставляется обратно, и оценка продолжается.