2015-07-28 3 views
6

Я пытаюсь получить MuPad Matlabs так же красиво и удобно, как MathCad.Pretty MuPad: Вывод назначения, выражения и результата в одной строке - Как создать эту функцию?

Пусть две переменные задания:

x_a:=2*unit::mm; 
y_b:=5*unit::mm; 

и я хочу prettyfied (набраны Tex), выводимый как

z = x_a + y_b = 7 mm 

я уже успел сделать это с помощью output::mathText(...):

output::mathText(hold(z)," = " , (z:=hold(x_a+y_b)) , " = " , z) 

который выглядит так:

enter image description here

Но это не очень удобно и не удобочитаемо. Поэтому я стараюсь, чтобы обернуть его в макрос или функции:

evalPrint(z,x_a+y_b) 

Как я могу это сделать?


Что я пробовал:

Я написал процедуру следующим образом:

evalPrint := 
proc(x,y) begin 
    output::mathText(hold(x)," = " , (x:=hold(y)) , " = " , x) 
end_proc: 

, но я просто получить

enter image description here

Что мне не хватает?


Относительно horchler's answer: его первое решение это как-то не работает, а второй делает:

процедуры:

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); 

выход:

enter image description here

ответ

4

Это проблема scope. MuPAD ничем не отличается от большинства других языков программирования в том, что методы/функции/процедуры имеют ограниченный lexical scope. Тип домена DOM_VAR относится к локальной переменной процедуры (бит больше here). Вы не можете напрямую видеть имя переменной до ее передачи в функцию 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; 

возвращает

MuPAD output one

Однако, так как это было сделано в процедуре, значение z не был назначен значение в глобальном масштабе, как в вашем встроенном выражении. Чтобы справиться с этим, функция evalassign может быть использован:

evalPrint := proc(x,y) option hold; 
begin 
    output::mathText(x, " = ", evalassign(x,hold(y)), " = ", context(y)); 
end_proc: 

который теперь возвращает 7 mm для z как ваш инлайн выражение:

MuPAD output two

Эта форма работает как хорошо и немного более кратким:

evalPrint := proc(x,y) option hold; 
begin 
    output::mathText(x, " = ", y, " = ", evalassign(x,y)); 
end_proc: 

Протестировано в R2015a.

+1

Это уже выглядит очень многообещающим, я попробую его, как только смогу. И спасибо за интересные ссылки, мне как-то трудно найти эту информацию для Mupad. – thewaywewalk

+1

Работает хорошо. Я бы оставил это открытым немного дольше, так что ваш обширный ответ может привлечь больше внимания? И поскольку вы, кажется, эксперт по Mupad, возможно, вы заинтересованы в том, чтобы помочь мне с моим [последующим вопросом] (http://stackoverflow.com/questions/31786164/define-general-relative-search-path-for -custom-MuPAD-процедуры). – thewaywewalk

+0

На самом деле ваше первое решение не работает (см. Мое редактирование), но второе делает. Я не вижу причины, почему первый работает в вашем случае, а в моем нет. – thewaywewalk