Проблема с вашей реализацией состоит в том, что слишком много и слишком мало вычислений - функция +=
не видит символ x
, поэтому она не знает, какой переменной присваивать результат, илевая часть задания не оценивается, поэтому +=
считает, что оно присваивает a
, а не x
.
. Вот один из способов получить правильное количество оценки.::=
определяет макрос, который является просто функцией, которая цитирует свои аргументы и для которой возвращаемое значение вычисляется снова.buildq
- это функция подстановки, которая цитирует выражение, в которое вы подставляете.Таким образом, комбинация ::=
и buildq
здесь состоит в том, чтобы создать выражение x: x + 2
и затем оценить его.
(%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
Так что, безусловно, это можно сделать, если вы хотите это сделать.Но могу я предложить, может быть, вам это не нужно?Изменение переменной усложняет умственное отслеживание происходящего.Политика программирования, такая как разовое назначение, может облегчить программисту понимание программы.Это часть общего подхода, называемого функциональным программированием;возможно, вы можете взглянуть на это.Maxima имеет различные функции, которые позволяют использовать функциональное программирование, хотя вы не обязаны их использовать.