NCalc - переопределяя оператор ^, чтобы действовать как Math.Pow - PullRequest
0 голосов
/ 05 сентября 2018

Я хочу переопределить оператор ^ в NCalc. В настоящее время он работает как побитовый оператор, и я хочу изменить его, чтобы он работал как Math.Pow.

Это потому, что он принимает данные от аналитика, который используется, чтобы превзойти формулы стиля, и использует ^ для этой цели.

Выше мой вопрос. Ниже приведена дополнительная информация для потомков:

Мой текущий подход заключается в том, чтобы вручную заменить «^» на «pow» во входной строке перед вычислением, но это плохая идея по нескольким причинам. Изучите текущую реализацию, которая принимает уравнение, разбитое на отдельные элементы: *

    private static List<String> ReplacePow(this List<String> input) //called while(input.Contains("^))
    {
        var index = input.IndexOf("^");
        List<String> res = new List<string>();
        res.AddRange(input.Take(index - 1));
        res.Add("Pow(");
        res.Add(input.Skip(index - 1).FirstOrDefault());
        res.Add(",");



        if(input[index + 1] != "-")
        {
            res.Add(input.Skip(index + 1).FirstOrDefault());
        }
        else
        {
            res.AddRange(input.Skip(index + 1).Take(2));
            index++;
        }

        res.Add(")");
        res.AddRange(input.Skip(index + 2));

        return res;
    }

Как вы можете видеть, в этом коде есть явная проверка для обработки, если в Pow () передается отрицательное число. Более того, эта реализация не будет работать хорошо, если мне нужно преобразовать из некоторого уравнения со сложными входными данными, идущими в pow, например:

5 ^ if (1 == 1, 2, -4)

...