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

时间:2015-04-23 17:42:04

标签: string output concatenation 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或类似的东西。我尝试了几种语法,但没有任何效果。

另外,我知道在lisp中编程的Maxima,我学习了在Lisp中连接字符串的语法,但我还没弄清楚如何在Maxima中使用它。

非常感谢。

1 个答案:

答案 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的值是输出文件的名称。