Может кто-нибудь указать на учебник по добавлению новых функций в 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,
  ...
};

(Очевидно, что это немного сложнее, но это основная идея)

Когда оценщик оценивает строку и наталкивается на функцию, он ищет в этом словаре, что такое блок для функции. Он извлекает блок, а затем выполняет блок с аргументами (если они есть) из строки. Результатом блока является результат функции.

Этот результат подставляется обратно, и оценка продолжается.

Другие вопросы по тегам