Local Variables

See Also: ucDefineVariable

uCalc lets you define variables that are local to an expression.  The definition is done within the expression itself.  If a variable with the same name was already defined, the local variable will not interfere with the previously defined variable of the same name.  A local variable can hold a separate value from the previously defined variable.  An expression can have any number of local variables, separated by commas.

Example 1: Multiple local variables in an expression

This example uses two local variables: x, and y.  After the expression is finished, x reverts to being undefined, and y still has its original value of 123, which it had before the expression was evaluated.

Visual Basic

 ucDefineVariable "y = 123"   Print ucEvalStr("Local(x, y, (uc_For(x, 1, 5, 1, SetVar(y, y+x^2)); y))") ' Returns 55 Print ucEvalStr("x") ' Returns an error: Undefined identifier Print ucEvalStr("y") ' Returns 123

Example 2:  Local variable, and ByHandle argument (Summation)

This example defines a summation routine named Sum().  The actual callback function is named Sum_(), and requires 5 arguments, where the last one is a variable passed ByHandle.  A syntax construct named Sum() is defined so that the last two arguments are optional.  The last argument is made local.  If omitted it defaults to a variable named x.  By making it local you don't have to worry about defining a variable ahead of time for use with Sum().  Plus it will not interfere with another variable of the same name, whether it is outside the expression, or Sum is nested several times within the same expression.  Expressions such as the following can be entered:

Sum(x^2, 1, 10)               ' returns 385

Sum(n+5, 1, 25, 1, n)         ' returns 450

Sum(Sum(x^2, 1, 10)*10, 1, 5) ' returns 19250

Visual Basic

 ' The following 3 lines can be placed in Form_Load() ucDefineFunction "Native: Sum_(ByExpr Expr, Start, Finish, Step, ByHandle Var)", AddressOf ucSum ucDefineSyntax "Sum({Expr}, {Start}, {Finish} [, {Step=1} [, {Var=x}]])" _              + "::= Local({Var}, Sum_({Expr}, {Start}, {Finish}, {Step}, {Var}))"   ' The following callback routine goes in a separate module, such as DemoVB.Bas Sub ucSum(ByVal Expr As Long)    Dim Expression As Long, VarHandle As Long    Dim Start As Long, Finish As Long, sStep As Long    Dim x As Double, Total As Double      Expression = ucArgHandle(Expr, 1)    Start = ucArg(Expr, 2)    Finish = ucArg(Expr, 3)    sStep = ucArg(Expr, 4)    VarHandle = ucArgHandle(Expr, 5)      For x = Start To Finish Step sStep       ucSetVariableValue VarHandle, x       Total = Total + ucEvaluate(Expression)    Next      ucReturn Expr, Total End Sub

This same example is also found in the source code for the demo program for C#, C++ Builder, PB, VB (classic), VB.NET, and VC++.

Example 3:  Local variable, and ByHandle argument (Equation Solver)

The concept in this example is very similar to that of the previous example.  This routine is a simple equation solver based on an adaptation of the bisection method algorithm.  This code is just enough to get you started.  You will want to add to it for a more robust solver.  Here are examples of equations it can solve:

Solve(x^2 + 1 = 26)           ' returns  5

Solve(x^2 + 1 = 26, -1000, 0) ' returns -5

Visual Basic

 ' The following lines can be placed in Form_Load() ucDefineFunction "Native: Solve_(ByExpr Expr, a, b, ByHandle Var)", AddressOf ucSolve ucDefineSyntax "Solve({Expr} [, {a=-100000000} [, {b=100000000} [, {Var=x}]]]) " _              + "::= Local({Var}, Solve_({Expr}, {a}, {b}, {Var}))" ucDefineSyntax "Solve({Left} = {Right} [, {etc}]) ::= Solve({Left}-({Right}) {etc: , {etc}})"   ' The following callback routine goes in a separate module, such as DemoVB.Bas Sub ucSolve(ByVal Expr As Long)    Dim Expression As Long, Variable As Long, Iterations As Long    Dim a As Double, b As Double, fa As Double, fb As Double    Dim Value As Double, tmp As Double      Expression = ucArgHandle(Expr, 1)    a = ucArg(Expr, 2)    b = ucArg(Expr, 3)    Variable = ucArgHandle(Expr, 4)      ucSetVariableValue Variable, a: fa = ucEvaluate(Expression)    ucSetVariableValue Variable, b: fb = ucEvaluate(Expression)       If fb < fa Then tmp = a: a = b: b = tmp   'swap a, b        Do While Abs(b - a) > 0.000000000000001       ucSetVariableValue Variable, (a + b) / 2             Value = ucEvaluate(Expression)             If Value = 0 Then a = (a + b) / 2: Exit Do         If Value < 0 _       Then a = (a + b) / 2 _       Else b = (a + b) / 2         Iterations = Iterations + 1       If Iterations = 100 Then Exit Do    Loop       If Abs(Value) > 0.0000000001 Then ucRaiseErrorMessage Expr, "Solution not found"      ucReturn Expr, a End Sub

This same example is also found in the source code for the demo program for C#, C++ Builder, PB, VB (classic), VB.NET, and VC++.