From stanly Sat Jan 8 11:19:21 1983 To: fateman Subject: comments on primer Status: R comments by Stanly Steinberg on MACSYMA Primer for VAX/UNIX by Richard Fateman The primer is excellent. I found chapter 1 much like what I do when I give demos or workshops on vaxima. For people who want to use vaxima on applied math problems, I include a lot of stuff on calculus before I start on programming. However, for programmers wanting to learn about symbol manipulation I would proceed as in the primer. The demos in my directory show how I introduce material for physics and applied math types. I found Chapter 2 especially interesting, helpful and, in fact, I learned a few new things. Some suggestions. On page 1-1 , near the bottom how about equivalent --> mathematically equivalent How about describing how to quit() right after how to start? The Rules 1.22 section is really good! Section 2.1 first line. f1 and f2 --> f1 and f2, defined below, I prefer the following program to compute n! to one containing an explicit loop. f(n) := block([temp], temp:1, while n > 1 do ( temp:n*temp, n:n-1, endwhile), temp)$ The note in 2.4 on using an arbitrary number of parameters is very helpful. This is not in the old manual?? I would like to see the array convention removed from any future symbol manipulators. This could be replaced by some explicit convention for saving calculations! Serious Business (2.7) is excellent. In Section 2.9, I would have avoided the lambda notation (save this for much later) and would have included a call of the form: p[n](x) I find the use of functional notation much more natural for Newton's method. Thus I have a preference for a program of the following form: newton(f,x,x0,eps) := block([xnew,xtemp,numer], /* This is a program for estimating the zero of a function of a single variable. f is the name of a function of one variable x is the variable in which the zero is to be found x0 is an initial guess for the zero xnew is used to store the estimates of the zero xtemp is used to avoid a diff-subst confusion eps is the tolerance within which the zero is to be found numer is a flag */ numer:true, xnew:x0, fprime(x) := subst(x,xtemp,diff(f(xtemp),xtemp)), while abs(f(xnew)) > eps do ( xnew:xnew-f(xnew)/fprime(xnew)), return(xnew))$ The use of the xtemp varible in the definition of fprime is, I believe, natural from the mathematical point of view. I don't remember this as always being true but, in fact, this program is broken! Thus if f(x) := (x-1)*(x-2) then all works. However, the call newton(sin,x,5,10^-5) will find a zero of the previously defined f! Try the program: test(f,x) := display(f(x)) ?Que pasa? On page 1-28, I don't understand the purpose of the declare construction of complex numbers. Section (Chapter) 3 page 1-29. This stuff is really important for my programs and cannot be over emphasized.