2015-07-28 9 views
6

Sto cercando di ottenere MatPad's MuPad bello e conveniente come MathCad.Pretty MuPad: output di assegnazione, espressione e risultato in una riga - Come creare quella funzione?

assumere due assegnazioni di variabili:

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

e voglio un prettyfied (formattato con Tex) output come

z = x_a + y_b = 7 mm 

ho già riuscito a farlo utilizzando output::mathText(...):

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

che sembra come desiderato:

enter image description here

Ma questo non è veramente conveniente e non leggibile. Così sto cercando di avvolgere in una o una funzione macro:

evalPrint(z,x_a+y_b) 

Come posso fare questo?


Quello che ho cercato:

ho scritto una procedura come segue:

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

ma ottengo solo

enter image description here

Che cosa mi manca?


Per quanto riguarda horchler's answer: la sua prima soluzione non in qualche modo funziona, mentre il secondo fa:

procedure:

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: 

chiamata:

evalPrintVal(U_1,15000*unit::V); 
evalPrintEq(E_h, U_1*1.05); 
evalPrintEq2(E_h, U_1*1.05); 

uscita:

enter image description here

risposta

4

Questo è un problema di scope. MuPAD non è diverso dalla maggior parte degli altri linguaggi di programmazione in quanto i metodi/funzioni/procedure hanno un numero limitato lexical scope. Il tipo di dominio DOM_VAR si riferisce a una variabile locale di una procedura (un po 'di più here). Non è possibile visualizzare direttamente il nome di una variabile prima di passare a una funzione Matlab (utilizzare inputname per questo) e MuPAD non è diverso. Inoltre, gli argomenti vengono normalmente valutati prima del che vengono passati nelle funzioni o nella procedura.

Fortunatamente, la correzione è abbastanza semplice in termini di codifica. Innanzitutto, è necessario utilizzare l'opzione hold per il proprio proc.Ciò sembra sia impedire la valutazione degli argomenti di input e consentire l'accesso a "il parametro effettivo nel modulo utilizzato nella chiamata di procedura". Quindi è necessario utilizzare context per valutare l'ultima parte dell'output. La procedura risultante è simile al seguente:

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

Poi

x_a := 2*unit::mm; 
y_b := 5*unit::mm; 
evalPrint(z, x_a+y_b); 
z; 

rendimenti

MuPAD output one

Tuttavia, dal momento che questo è stato fatto in una procedura, il valore di z non è stato assegnato un valore nell'ambito globale come nella tua espressione inline. Per gestire questa situazione, la funzione evalassign può essere utilizzato:

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

che ora torna 7 mm per z come la vostra espressione in linea:

MuPAD output two

Questa forma funziona così ed è leggermente più concisa:

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

Testato in R2015a.

+1

Questo sembra già molto promettente, lo proverò il prima possibile. E grazie per i link interessanti, ho difficoltà a trovare queste informazioni per Mupad. – thewaywewalk

+1

Funziona bene. L'avrei tenuto aperto un po 'più a lungo, quindi la tua risposta esaustiva può attirare ancora più attenzione? E come sembri un esperto di Mupad, forse sei interessato ad aiutarmi con la mia [domanda di follow-up] (http://stackoverflow.com/questions/31786164/define-general-relative-search-path-for -custom-MuPAD-procedure). – thewaywewalk

+0

in realtà la tua prima soluzione non funziona (vedi la mia modifica), ma la seconda lo fa. Non vedo il motivo per cui il primo funziona nel tuo caso e nel mio no. – thewaywewalk

Problemi correlati