如何在 Maxima 中的文件名中包含表达式

How to include a expression in the name of file in Maxima

我有一个 Maxima 程序,它可以执行一些代数运算,然后将一些内容写到外部文件中。如何在文件名中包含一些计算值甚至小表达式?

mwe 如下:

N:3;
f: erf(x);
tay: taylor(f,x,0,N);
with_stdout("taylor.txt", fortran(tay));

但此示例将文件命名为 taylor.txt。我想要一些将文件命名为 taylor_N3_f_erf.txt 或类似名称的东西。我尝试了几种语法但没有任何效果。

此外,我知道 Maxima 是用 lisp 编程的,我学习了在 Lisp 中连接字符串的语法,但我还不知道如何在 Maxima 中使用它。

非常感谢。

这是我想出的。在函数中使用参数引用和评估花了一些时间,但我认为它现在可以工作了。

(%i2) bar (name_base, name_extension, ['vars]) := sconcat (name_base, foo(vars), ".", name_extension) $
(%i3) foo(l) := apply (sconcat, join (makelist ("_", 2 * length (l)), join (l, map (string, map (ev, l))))) $
(%i4) [a, b, c] : [123, '(x + 1), '(y/2)];
                                             y
(%o4)                           [123, x + 1, -]
                                             2
(%i5) bar ("foobar", "txt", a, b, c);
(%o5)                    foobar_a_123_b_x+1_c_y/2.txt
(%i6) myname : bar ("baz", "quux", a, b);
(%o6)                        baz_a_123_b_x+1.quux
(%i7) with_stdout (myname, print ("HELLO WORLD"));
(%o7)                             HELLO WORLD
(%i8) printfile ("baz_a_123_b_x+1.quux");
HELLO WORLD 
(%o8)                        baz_a_123_b_x+1.quux

请注意,sconcat 连接字符串,string 生成表达式的字符串表示形式。

除法表达式可能会引起麻烦,因为 / 表示文件名中的目录...也许您必须替换这些字符或任何其他不允许的字符。参见 ssubst

请注意 with_stdout 计算它的第一个参数,所以如果你有一个变量,例如myname那么myname的值就是输出文件的名字。