Search code examples
functionmaxima

Can I define a maxima function f(x) which assigns to the argument x


Sorry for the basic question, but it's quite hard to find too much discussion on Maxima specifics.

I'm trying to learn some Maxima and wanted to use something like

x:2
x+=2

which as far as I can tell doesn't exist in Maxima. Then I discovered that I can define my own operators as infix operators, so I tried doing

infix("+=");
"+=" (a,b):= a:(a+b);

However this doesn't work, as if I first set x:1 then try calling x+=2, the function returns 3, but if I check the value of x I see it hasn't changed.

Is there a way to achieve what I was trying to do in Maxima? Could anyone explain why the definition I gave fails?

Thanks!


Solution

  • The problem with your implementation is that there is too much and too little evaluation -- the += function doesn't see the symbol x so it doesn't know to what variable to assign the result, and the left-hand side of an assignment isn't evaluated, so += thinks it is assigning to a, not x.

    Here's one way to get the right amount of evaluation. ::= defines a macro, which is just a function which quotes its arguments, and for which the return value is evaluated again. buildq is a substitution function which quotes the expression into which you are substituting. So the combination of ::= and buildq here is to construct the x: x + 2 expression and then evaluate it.

    (%i1) infix ("+=") $
    (%i2) "+="(a, b) ::= buildq ([a, b], a: a + b) $
    (%i3) x: 100 $
    (%i4) macroexpand (x += 1);
    (%o4)                       x : x + 1
    (%i5) x += 1;
    (%o5)                          101
    (%i6) x;
    (%o6)                          101
    (%i7) x += 1;
    (%o7)                          102
    (%i8) x;
    (%o8)                          102
    

    So it is certainly possible to do so, if you want to do that. But may I suggest maybe you don't need it? Modifying a variable makes it harder to keep track, mentally, what is going on. A programming policy such as one-time assignment can make it easier for the programmer to understand the program. This is part of a general approach called functional programming; perhaps you can take a look at that. Maxima has various features which make it possible to use functional programming, although you are not required to use them.