【问题标题】:How to include a expression in the name of file in Maxima如何在 Maxima 中的文件名中包含表达式
【发布时间】:2015-04-23 17:42:03
【问题描述】:

我有一个 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 中使用它。

非常感谢。

【问题讨论】:

    标签: string output concatenation maxima


    【解决方案1】:

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

    (%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 的值就是输出文件的名称。

    【讨论】:

    • 完美运行。尽管如此,仍然无法使ssubst 工作。我不知道为什么。我一直在使用fname : subst("div", "/", fname);,但输出字符串与输入相同。我也尝试过逃避这个角色。
    • @TomCho 你不是说fname : ssubst("div", "/", fname) 吗?很高兴听到它对您有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-05
    • 1970-01-01
    • 1970-01-01
    • 2017-06-08
    • 1970-01-01
    相关资源
    最近更新 更多