miroiu / string-math

Evaluates a math expression from a string. Supports variables and custom operators.
MIT License
47 stars 4 forks source link

Question about conditionals. #11

Open dnmnsmith opened 9 months ago

dnmnsmith commented 9 months ago

Hi Emanuel-

Looking at how to handle conditionals, as not everything maps to linear functions. I'd really like a fn (a,b,c) which returns b if a else c, or functionality equivalent to a ? b : c

I don't see anything supporting that in the framework. Lunchtime hacking turned up the below.

If this approach is good, it may be worth including in examples. If not, what is the recommended approach, and is a ternary operator a reasonable feature request?

Thanks!

Duncan

        context.RegisterLogical("<=", (a, b) => a <= b, Precedence.Addition);
        context.RegisterLogical(">", (a, b) => a > b, Precedence.Addition);

        context.RegisterBinary("if",(a,b) => (b != 0) ? a : 0, Precedence.Addition);

        MathExpr expr = new MathExpr("({x} if {x} <= 0.5) + (({x} - 0.5) if ({x} > 0.5))", context);

        var fn = expr.Compile("x");

        Debug.Assert(IsNear(fn(0.0), 0));
        Debug.Assert(IsNear(fn(0.75), 0.25));
miroiu commented 9 months ago

Hi Duncan,

Conditionals are not part of the library and I don't believe they would work well with the existing features. The best and fastest thing I could do is to add support for user defined functions. (see PR: #12) This is a breaking change because new functionality was added to IMathContext which is a public interface.

While I'm not comfortable with adding this feature into the library right now, I may consider it for a future major release.

Thanks!