On Sep 8, 2009, at 3:22 PM, Stavros Macrakis wrote:
>
> Your code will also create malformed expressions in some cases:
> ll:x^y$ push(3,ll) => 3^x ((mexpt simp) 3 $x $y). But mexpt takes
> exactly 2 arguments.
I see.. I don't even think a 'general' push/pop would be very useful
(one can always push onto a list and then when finished, apply a
function). Seems to me push/pop should only work on lists and perhaps
sets (again, perhaps not a good idea, since sets reorder elements) -
so unless $listp or $setp returns true, it should throw an error.
Since (meval 'expression') returns a simplified result, there is no
need to remove the simp flag when pushing onto a list, right?
>
> It is an error to use Lisp's push function to modify a Maxima
> variable. In particular, this means you can't push onto a subscripted
> variable: zz[1]:[]$ push(3,zz[1]) => error.
Ah, these are the cases I always forget about, because accessing a
maxima variable that is also a lisp variable is so easy to do. So in
this case I can get the attached list with 'meval', modify it, but
how do I then attach it back to the zz[1]?
One way is probably by constructing a 'mset' expression and
evaluating it, but can we use something cheaper in this case (since
it is known what we want)?
To make a fast push/pop I would still have special code, when push/
pop gets a 'symbolp' (regular Maxima variable). In this case it's
probably OK to just use lisp's 'set'?
>
> I hope my comments help you understand how Maxima works internally
> better.
>
> -s
Thanks for clarifications, they are very useful.
Regards,
Ziga