9 9 CHAPTER 4 Operations and Constructions It is beneficial to separate the two concepts of _o_p_e_r_a_t_i_n_g _o_n _o_b_j_e_c_t_s and _c_o_n_s_t_r_u_c_t_i_n_g _o_b_j_e_c_t_s, and yet mix them together in use. When we operate on objects, we produce a result which is apparently different from what we started with. ____________________________________________________ (c1) 2+3; (d1) 7 5 ____________________________________________________ When we construct objects, we make a less obvious "change". ____________________________________________________ (c2) x+3; (d2) 7 x+3 ____________________________________________________ Apparently the "+" in the first example disappeared in the process of simplification into an internal representa- tion. The "+" in the second one got "absorbed" _i_n_t_o the internal representation, and was printed out. Although it is usually not apparent to the user, some constructors are always absorbed. 9 9Operations and Constructions 4-2 Operations and Constructions 4-1 ____________________________________________________ (c1) x/y; (d1) 79 y7x_ 9 ________________________________________________________ However, as indicated in the previous chapter, x/y is represented internally by a construction resembling more x*y8-19. Because people prefer it, the display program re- formats the internal form to resemble the illustrated display. Sometimes we want to prevent constructors from being absorbed. In this example, we use the _d_i_f_f or _d_e_r_i_v_a_t_i_v_e operator. Sometimes we get what we want by means of a "quote" (apostrophe or "'") which provides a level of "pro- tection" against operation. ____________________________________________________ (c1) diff(f(x),x) + 2*x; /* This diff is a construction since f is unknown */ (d1) 79 dx7d__9f(x) + 2x (c2) diff(x^2,x) + 2*x; /* This diff is an operator. */ (d2) 7 4x (c3) 'diff(x^2,x) + 2*x; /*This diff is a constructor. Note the "'". */ (d3) 79 dx7d__9(x829) + 2x ____________________________________________________ To make constructors into operators when possible, the _e_v command, which is described in more detail later, can be used: 9 9 Printed: May 31, 1986 Operations and Constructions 4-2 ____________________________________________________ (c4) ev(d3,diff); (d4) 7 4x ____________________________________________________ Many other operators serve dual purposes. They can be "quoted" in this way, or as is sometimes referred to in this manual, made into "nouns". They can subsequently be evaluated by ev and "verbified".* _1._1. _A_s_s_i_g_n_m_e_n_t Assignment to variables is fundamental. We treat it in two ways. First informally: the ":" operation is "infix", and has left- and right- hand sides. The left side is not, in gen- eral, evaluated, but used as a "name". EXAMPLE: x:2*3+sin(0); assigns to the name x, the value 6. That is, the "right hand side" of the assignment statement is evaluated and simplified. Even if x had had a value, say y, before that, y would not be changed. A variable can be assigned a new value at any time. The value of a variable can be a number, a matrix, a list, or any MACSYMA expression. If a variable has never been assigned a value (i.e. is used as an indeterminate) then it just represents itself. Some simple examples of assignment follow. (The comments in parentheses are not typed to or by MACSYMA). MACSYMA automatically assigns labels ci to the user's input lines and di to the output lines. You can use these labels as though they were the usual sort of assigned variable. box; c c c l l l. line-label expression comment _ (c1) a:16\$ (integer) (c2) lambda: -3/37\$ (rational number) (c3) x:d1; (x is assigned the value of d1) (d3) 16 (c4) rho:sigma; (since sigma has no value at this time rho is assigned the sym- bol sigma) (d4) sigma (c5) sigma: .005\$ (floating point) (c6) rho; (rho still has its old value since (d6) sigma it hasn't been reas- now, more formally, Operations and Constructions 4-3 : ( l_name,'r_any) This is usually written l_name : r_any. RETURNS: r_any. SIDE EFFECT: l_name now has the value r_any. NOTE: if l_name is subscripted, e.g. a[i,j], then i and j are evaluated. A different operator, "::" described below totally evaluates the left-hand side. Since the value assigned may be any expression, and assignments themselves have values, it is possible to make multi- ple assignments: Thus a:b:c:x+1 assigns x+1 to a, b, and c. The MACSYMA variable _v_a_l_u_e_s[DEFAULT: []] gives a list of all your atomic variables which have been bound (i.e. have been assigned values). ::( l_name,r_any) (e.g. x :: y) NOTE: the _v_a_l_u_e of the quantity on the left, which must evaluate to an atomic variable or subscripted variable is used. Thus continuing with the above examples: signed a new one) box; l l l. (c7) rho::lambda\$ (Note that the :: causes the value of (c8) sigma; lambda, i.e. -3/37, to be assigned to (d8) -3/37 the value of rho, There are many variables which have already been assigned values. These are referred to as MACSYMA variables or options. They provide a means for communicating between the user and the system in the execution of commands, which serves to influence, in a fashion more "global" in nature than the parameters of the command, the system behavior. It is a good idea to be aware of these and other built-in names when you choose variable names yourself, or when you program new function. The index to this manual distinguishes these MACSYMA variables and options with a colon (":") between the vari- able and its default value. 9 9 Printed: May 31, 1986 Operations and Constructions 4-4 _1._2. _F_u_n_c_t_i_o_n_s A function of a fixed number of arguments can be defined in MACSYMA by using the := operator. The left side of a function definition consists of the name of the func- tion followed by the list of formal parameters enclosed in parentheses. The right side consists of the function body. When a function is called, the formal parameters will be bound to the actual arguments, any free variables in the function body will take on the values which they have at the time of the call, and the function body will be evaluated. It is permissible to define functions which are recursive to an arbitrary depth. It is possible to pass function names as formal parameters, and it is possible to have name con- flicts resulting in subtle problems. The MACSYMA variable _f_u_n_c_t_i_o_n_s[DEFAULT: []] is a list of all user defined non-subscripted functions. The MACSYMA functions _d_i_s_p_f_u_n or _g_r_i_n_d may be used to display the definition of a function. These are described in a subsequent section. The following example was especially constructed to illustrate obscure points concerning the use of variables which are not parameters. It is included for historical rea- sons. i.e. sigma.) 9 9 Printed: May 31, 1986 Operations and Constructions 4-5 ____________________________________________________ (c1) f(x):=x^2+y\$ (c2) f(2); (d2) 7 y + 4 (c3) y:7\$ (c4) f(2); (d4) 7 11 /* If we now define another function, using y as a "dummy" variable, the effect of MACSYMA's dynamic binding scheme can be seen. Each time y is evaluat- ed, it will use the most recent binding. */ (c5) g(y,z):=f(z)+3*y; (d5) 7 g(y,z):=f(z) + 3y (c6) g(2*y+z,-.5); (d6) 7 3(z + 14) + z + 14.25 (c7) functions; (d7) 7 [f(x), g(y, z)] ____________________________________________________ To continue the obscure example (something we even more firmly advise against), we give some more explanation of how this function g is being evaluated: The value of y is of particular importance. Note the following sequence of events: (1) The arguments to g are evaluated giving z+14 and -.5. (y has the value 7) (2) G is then invoked and has its formal parameters bound. Y to z+14 (the first argument) and z to -.5 (the second argument). The evaluation of g then causes f to be invoked on the argument -.5 9 9 Printed: May 31, 1986 Operations and Constructions 4-6 (3) F has its formal parameter x bound to -.5 and returns the result of the evaluation x829+y with the current bindings which gives z+14.25. (4) The evaluation of g continues with 3y which yields 3(z+14). This is added to the result from (3) and returned. 9 9 Printed: May 31, 1986