如何在 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
的值就是输出文件的名字。
我有一个 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
的值就是输出文件的名字。