Very cool. Thank you very much.
Ryan
On 5/16/07, Stavros Macrakis <macrakis at alum.mit.edu> wrote:
> On 5/16/07, Ryan Krauss <ryanlists at gmail.com> wrote:
> > This seems really powerful and I am increasingly interested in
> > learning to program in Maxima (and I planning to learn more lisp for
> > emacs anyways). Can you give me a bit more explanation on the divsimp
> > function. A brief comment for each line would help me learn a lot.
> >
>
> divsimp(ex,div):=
> if atom(ex) /* Is ex a symbol or a number? i.e. has no
> subparts */
> then ex /* if so, return it */
> elseif part(ex,0) ="+" /* part 0 of an expression is its operator:
> a+b+c is
> equivalent to "+"(a,b,c) */
> then block( /* a block is like begin/end or {} -- it groups
> a series of statements, possibly
> with local
> variables */
> [quorem /* list of local variables */
> : /* can be initialized using var:val
> instead of just var */
> divide(ex,div)] /* divides ex by div and
> returns [<quotient>,<remainder>] as a list */
> , /* statements separated with commas */
> factorsum(quorem[1]) /* quorem[1] is the quotient --
> apply factorsum to it */
> *factorsum(div)
> + factorsum(quorem[2]) /* quorem[2] is the remainder */
> ) /* close off the block */
> else map( /* map a function over expression subparts; map(f,a*b) ==
> f(a)*f(b)
> lambda([q],divsimp(q,div)), /*
> lambda([q],...) is an anonymous function, like
>
> defining fff(q):=... and then using fff here */
> ex)$
>
> To see what is going on, try trace(divsimp).
>
> -s
>
>