========== Assignment ========== --------- Immediate --------- A variable in FriCAS refers to a value. A variable has a name beginning with an uppercase or lowercase alphabetic character, "%", or "!". Successive characters (if any) can be any of the above, digits, or "?". Case is distinguished. The following are all examples of valid, distinct variable names: :: a tooBig? a1B2c3%!? A %j numberOfPoints beta6 %J numberofpoints The ":=" operator is the immediate assignment operator. Use it to associate a value with a variable. The syntax for immediate assignment for a single variable is: :: variable := expression The value returned by an immediate assignment is the value of expression. :: a := 1 1 Type: PositiveInteger The right-hand side of the expression is evaluated, yielding 1. The value is then assigned to a. :: b := a 1 Type: PositiveInteger The right-hand side of the expression is evaluated, yieldig 1. This value is then assigned to b. Thus a and b both have the value 1 after the sequence of assignments. :: a := 2 2 Type: PositiveInteger What is the value of b if a is assigned the value 2? :: b 1 Type: PositiveInteger The value of b is left unchanged. This is what we mean when we say this kind of assignment is immediate. The variable b has no dependency on a after the initial assignment. This is the usual notion of assignment in programming languages such as C, Pascal, and Fortran. ------- Delayed ------- FriCAS provides delayed assignment with "==". This implements a delayed evaluation of the right-hand side and dependency checking. The syntax for delayed assignment is :: variable == expression The value returned by a delayed assignment is the unique value of Void. :: a == 1 Type: Void b == a Type: Void Using a and b as above, these are the corresponding delayed assignments. :: a Compiling body of rule a to compute value of type PositiveInteger 1 Type: PositiveInteger The right-hand side of each delayed assignment is left unevaluated until the variables on the left-hand sides are evaluated. :: b Compiling body of rule b to compute value of type PositiveInteger 1 Type: PositiveInteger This gives the same results as before. But if we change a to 2 :: a == 2 Compiled code for a has been cleared. Compiled code for b has been cleared. 1 old definition(s) deleted for function or rule a Type: Void Then a evaluates to 2, as expected :: a Compiling body of rule a to compute value of type PositiveInteger 2 Type: PositiveInteger but the value of b reflects the change to a :: b Compiling body of rule b to compute value of type PositiveInteger 2 Type: PositiveInteger ------------------ Multiple Immediate ------------------ It is possible to set several variables at the same time by using a tuple of variables and a tuple of expressions. A tuple is a collection of things separated by commas, often surrounded by parentheses. The syntax for multiple immediate assignment is :: ( var1, var2, ..., varN ) := ( expr1, expr2, ..., exprN ) The value returned by an immediate assignment is the value of exprN. :: ( x, y ) := ( 1, 2 ) 2 Type: PositiveInteger This sets x to 1 and y to 2. Multiple immediate assignments are parallel in the sense that the expressions on the right are all evaluated before any assignments on the left are made. However, the order of evaluation of these expressions is undefined. :: ( x, y ) := ( y, x ) 1 Type: PositiveInteger x 2 Type: PositiveInteger The variable x now has the previous value of y. :: y 1 Type: PositiveInteger The variable y now has the previous value of x. There is no syntactic form for multiple delayed assignments.