如何正确使用`block`功能

How to properly use the `block` function

我正在尝试编写一个小函数,它需要 2 个向量,更改第一个向量第一个条目的符号,然后对它们执行点积。但是,当我这样做时,函数中更改的向量的全局值在函数外部发生了更改。

我尝试使用 block 函数来保护向量的全局值,但这似乎没有任何改变。

a: matrix([3],[4],[5]);
b: matrix([4],[5],[6]);
f(x,y):=block([x:x,y:y],x[1]:-x[1],x.y);
f(a,b);

我希望答案是 38,这是我第一次 运行 f(a,b); 但是当我第二次这样做时,我得到 62 因为 a 有全局更改。

您将一个矩阵传递给该函数,并且该矩阵未被复制,它是对同一矩阵的引用。正如 Maxima 文档所说,

Matrices are handled with speed and memory-efficiency in mind. This means that assigning a matrix to a variable will create a reference to, not a copy of the matrix. If the matrix is modified all references to the matrix point to the modified object (See copymatrix for a way of avoiding this)

所以需要复制一个矩阵独立处理:

f(x,y):=block([x:x, y:y, m:m, n:n],
    m:copymatrix(x), 
    n:copymatrix(y),
    m[1]:-m[1],
    m.n);