2015-04-23 5 views
0

У меня есть программа Maxima, которая выполняет некоторую алгебру, а затем записывает некоторые вещи во внешний файл. Как включить в имя файла некоторые вычисленные значения и даже небольшие выражения?Как включить выражение в имя файла в Maxima

м.в.э. будет следующим:

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.

спасибо.

ответ

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 - это имя выходного файла.

+0

Работал отлично. Тем не менее, пока не удалось выполнить работу 'ssubst'. Я не знаю почему. Я использовал 'fname: subst (" div ","/", fname);' но строка вывода такая же, как и вход. Я также пытался убежать от персонажа. – TomCho

+0

@TomCho вы не имеете в виду 'fname: ssubst (" div ","/", fname)' ?? Рад слышать, как это работает для вас. –

+0

Да, @RobertDodier, спасибо. – TomCho