I believe my recent patch for $matrix fixes this problem without having to
rename variables, etc.
On Fri, Mar 6, 2009 at 12:34 PM, Volker van Nek <volkervannek at googlemail.com
> wrote:
> Hello,
> due to subscribing with @gmail.com instead of @googlemail.com
> I had problems to post this morning. Here is my posting again.
> Please excuse if you recieve this twice.
>
>
> Hi,
>
> I think this is a bug. The problem is not the lambda expression.
> I try to point to the problem:
>
> (%i1) display2d:false$
> (%i2) foo(f,x):= block([i:2], f(x))$
>
> mat_function is written like foo.
> For internal loopings etc. it uses the variables i,ii,j,k,n and some more.
> My i in foo stands for one of these and interferes with an i which is
> passed in by the function f:
>
> (%i3) bar(x):= x^i$
> (%i4) foo(bar,x);
> (%o4) x^2
>
> In your example you protect the exponent i by using block([i], .
>
> (%i5) baz(x):= block([i],x^i)$
> (%i6) foo(baz,x);
> (%o6) x^i
>
> You also can do this with a lambda expression:
>
> (%i7) foo(lambda([x],x^i),x);
> (%o7) x^2
> (%i8) foo(lambda([x],block([i],x^i)),x);
> (%o8) x^i
>
> I hope the last solves your problem.
>
> I think that diag.mac should be revised.
> I found some presumably unintended programming constructs.
>
> To avoid variables beeing catched gensym-like names could be used
> or the functions could be rewritten in Lisp using defmspec: E.g.
>
> (%i9) :lisp (defmspec $foo1 (a) (let ((i 2)(f (cadr a)) (z (caddr a)))
> (mfuncall f z)))
> (LAMBDA-CLOSURE () () () (A)
> (LET ((I 2) (F (CADR A)) (Z (CADDR A))) (MFUNCALL F Z)))
> (%i9) foo1(bar,x);
> (%o9) x^i
> (%i10) foo1(lambda([x],x^i),x);
> (%o10) x^i
>
> Greetings
> Volker van Nek
>
>
>
> Xiang Liu schrieb:
> > *Function:* *mat_function** (f,mat)*
> >
> > Returns *f(mat)*, where f is an analytic function and mat a matrix.
> > I have tried:
> >
> > load(diag);
> >
> >
> > A:matrix([4,1,2],[0,2,-4],[0,1,6]);
> >
> >
> > mat_function(lambda([x],x^k),A);
> >
> >
> > fpow(x):=block([k],declare(k,integer),x^k);
> >
> >
> > mat_function(fpow,A);
> >
> >
> > The question is: why lambda expression doesn't work here?[?]
> >
> >
> > ------------------------------------------------------------------------
> >
> > _______________________________________________
> > Maxima mailing list
> > Maxima at math.utexas.edu
> > http://www.math.utexas.edu/mailman/listinfo/maxima
> >
>
> _______________________________________________
> Maxima mailing list
> Maxima at math.utexas.edu
> http://www.math.utexas.edu/mailman/listinfo/maxima
>