using uCalcSoftware; var uc = new uCalc(); static void ShortCircuitOr(uCalc.Callback cb) { var arg1 = cb.ArgExpr(1); var arg2 = cb.ArgExpr(2); // Evaluate the first argument var result1 = arg1.EvaluateBool(); // If the first is true, return immediately without touching the second if (result1) { cb.ReturnBool(true); } else { // Otherwise, evaluate and return the second argument's result cb.ReturnBool(arg2.EvaluateBool()); } } static void FuncA(uCalc.Callback cb) { cb.uCalc.Eval("countA = countA + 1"); cb.ReturnBool(true); } static void FuncB(uCalc.Callback cb) { cb.uCalc.Eval("countB = countB + 1"); cb.ReturnBool(true); } uc.DefineVariable("countA = 0"); uc.DefineVariable("countB = 0"); uc.DefineFunction("FuncA() As Bool", FuncA); uc.DefineFunction("FuncB() As Bool", FuncB); uc.DefineFunction("SC_Or(ByExpr a, ByExpr b) As Bool", ShortCircuitOr); Console.WriteLine("Calling SC_Or(FuncA(), FuncB())..."); uc.Eval("SC_Or(FuncA(), FuncB())"); Console.WriteLine($"FuncA was called {uc.Eval("countA")} time(s)."); Console.WriteLine($"FuncB was called {uc.Eval("countB")} time(s)."); // Should be 0