Pretty MuPad: вывод назначения, выражения и результата в одной строке-как создать эту функцию?
Я пытаюсь получить MuPad Matlabs так же красиво и удобно, как MathCad.
предположим два назначения переменных:
x_a:=2*unit::mm;
y_b:=5*unit::mm;
и я хочу prettyfied (typeset с Tex) выводить как
z = x_a + y_b = 7 mm
мне уже удалось сделать это с помощью output::mathText(...)
:
output::mathText(hold(z)," = " , (z:=hold(x_a+y_b)) , " = " , z)
который выглядит как нужные:
но это не очень удобно и не читабельно. Поэтому я пытаюсь обернуть его в макрос или функция:
evalPrint(z,x_a+y_b)
как я могу это сделать?
что я пробовал:
я написал процедуру следующим образом:
evalPrint :=
proc(x,y) begin
output::mathText(hold(x)," = " , (x:=hold(y)) , " = " , x)
end_proc:
но я просто
что я упустил?
о Хорхлер это: его первое решение как-то не работает, в то время как второе делает:
правила:
evalPrintVal := proc(x,y) option hold;
begin
output::mathText(x, " = ", evalassign(x,y));
end_proc:
evalPrintEq := proc(x,y) option hold;
begin
output::mathText(x, " = ", evalassign(x,y), " = ", context(y));
end_proc:
evalPrintEq2 := proc(x,y) option hold;
begin
output::mathText(x, " = ", y, " = ", evalassign(x,y));
end_proc:
звоните:
evalPrintVal(U_1,15000*unit::V);
evalPrintEq(E_h, U_1*1.05);
evalPrintEq2(E_h, U_1*1.05);
выход:
1 ответов
это проблема область. MuPAD ничем не отличается от большинства других языков программирования в том, что методы/функции/процедуры имеют ограниченный лексической области. The DOM_VAR
тип домена относится к локальной переменной процедуры (немного больше здесь). Вы не можете напрямую видеть имя переменной до ее передачи в функцию Matlab (используйте inputname
для этого), и MuPAD не отличается. Вдобавок, аргументы, как правило, оценивали до они переходят в функции или процедуру.
к счастью, исправить это довольно легко с точки зрения кодирования. Во-первых, вам нужно использовать hold
для proc
. Это, по-видимому, предотвращает оценку входных аргументов и разрешает доступ к "фактическому параметру в форме, которая использовалась в вызове процедуры."Тогда вам нужно использовать context
для оценки последние часть вашего выхода. Результирующая процедура выглядит следующим образом:
evalPrint := proc(x,y) option hold;
begin
output::mathText(x, " = ", y, " = ", context(y));
end_proc:
затем
x_a := 2*unit::mm;
y_b := 5*unit::mm;
evalPrint(z, x_a+y_b);
z;
возвращает
однако, поскольку это было сделано в процедуре, значение z
не было присвоено значение в глобальной области, как в вашем встроенном выражении. Для этого в evalassign
функция может быть использована:
evalPrint := proc(x,y) option hold;
begin
output::mathText(x, " = ", evalassign(x,hold(y)), " = ", context(y));
end_proc:
которая теперь возвращает 7 mm
на z
как ваш встроенный выражение:
эта форма также работает и немного более лаконична:
evalPrint := proc(x,y) option hold;
begin
output::mathText(x, " = ", y, " = ", evalassign(x,y));
end_proc:
протестировано в R2015a.