What a thorough explaination!
I see!
Thank you very much!
On Fri, Jul 18, 2003 at 10:00:14PM -0400, Stavros Macrakis wrote:
> > I'm trying to conpare MAXIMA with LISP.
>
> Though there are some similarities, there are also some big differences.
>
> > It seems a single quote stands for QUOTE and double single
> > quote stands for EVAL.
>
> The semantics of Maxima single-quote are more complicated than Lisp
> quote. Single-quote of an expression does correspond to Lisp quote:
>
> '(print(3)) => print(3)
>
> but keep in mind that *simplification* is orthogonal to evaluation:
>
> '(print(3+4)) => print(7)
>
> Single-quote of a function in function-application context applies the
> *noun form* of the function to the (evaluated) arguments:
>
> 'print(print(3)) prints 3 and returns print(3)
> print('print(3)) prints print(3) and returns print(3)
>
> A noun form function stays unevaluated:
>
> ev('print(3)) => print(3)
>
> By default, noun form functions display the same as verb form functions.
> This can be confusing, so I'd recommend turning on the noundisp flag so
> the difference will be visible:
>
> (C1) print(3);
> 3
> (D1) 3
> (C2) '(print(3));
> (D2) PRINT(3)
> (C3) ev(d2);
> 3
> (D3) 3
> (C4) 'print(3);
> (D4) PRINT(3)
> (C5) ev(d4);
> (D5) PRINT(3)
> (C6) noundisp:true;
> (D6) TRUE
> (C7) c1;
> (D7) PRINT(3)
> (C8) c2;
> (D8) '(PRINT(3))
> (C9) c3;
> (D9) EV(D2)
> (C10) c4;
> (D10) 'PRINT(3)
> (C11) c5;
> (D11) EV(D4)
> (C12) d1;
> (D12) 3
> (C13) d2;
> (D13) PRINT(3)
> (C14) d3;
> (D14) 3
> (C15) d4;
> (D15) 'PRINT(3)
> (C16) d5;
> (D16) 'PRINT(3)
>
>
> Compare with quoting the whole expression:
>
> '( print(print(3)) ) returns print(print(3))
> print( '(print(3)) ) prints print(3) and returns print(3)
>
> ----------------------------
>
> Double-quote in Maxima doesn't correspond directly to anything in Lisp.
> It is a *read-time* substitution of a value. So for example:
>
> v: 'vv1;
> vv1: 'vvv1;
> vv2: 'vvv2;
>
> [v, ''v, v: 'vv2, v, ''v] => [vv1, vvv1, vv2, vv2, vvv1]
>
> Note that the fifth result is NOT affected by setting v to 'vv2.
>
> Compare
>
> [v, ev(v), v: 'vv2, v, ev(v)] => [vv2, vvv2, vv2, vv2, vvv2]
>
>
>
> > How can I make eq2 be evaluated to 101?
>
> Nouns can be evaluated by verbs either by using the "nouns" flag to
> "ev", or by naming the specific noun in the arguments to ev:
>
> p1(x):=print(['p1,x]);
> p2(x):=print(['p2,x]);
>
> qq: ['p1(4),'p2(5)] => ['p1(4), 'p2(5)]
>
> ev(qq) => ['p1(4), 'p2(5)] ------same thing
> ev(qq,nouns) prints [p1, 4] and [p2, 5] and returns [[p1, 4], [p2,
> 5]]
> ev(qq,p1) prints [p1, 4] and returns [[p1, 4], 'p2(5)].
>
> The noun form is actually kept as the operator of the expression (not as
> some sort of quoting operator surrounding the expression):
>
> apply( op('p1(3)), [9] ) => 'p1(9)
> apply(op('(p1(3))),[9]) prints [p1, 9] and returns [p1, 9]
>
> ?print(op('p1(3))) -> %p1 -- print internal form
> ?print(op('(p1(3)))) -> $p1
>
> op('p1(3)) - op('(p1(3))) => p1 - p1 -- these are two different
> things
>
> (note that noundisp only affects the display of nouns when
> they are applied to arguments)
>
> I don't like all this complexity, but that is the way Maxima currently
> works.
>
> -s
>
>
--
Wang Yin
Deparment of Computer Science and Technology,
Tsinghua University,
100084
Beijing China