我有一个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
或类似的东西。我尝试了几种语法,但没有任何效果。
另外,我知道在lisp中编程的Maxima,我学习了在Lisp中连接字符串的语法,但我还没弄清楚如何在Maxima中使用它。
非常感谢。
答案 0 :(得分:0)
这是我想出的。它花了一些时间来讨论功能中的参数引用和评估,但我认为它现在有效。
(%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
的值是输出文件的名称。