2010-11-06 1 views
10

Diese Frage ergibt sich aus der Antwort von Michael Pilat in Preventing “Plus” from rearranging things. Es definiert er eine benutzerdefinierte + NotationWie kann ich die Rekursion in einer Format/Interpretation Mathematica Konstruktion stoppen?

Das Problem mit dabei ist, Sie nicht die Ausgabe kopieren und einfügen können (obwohl% oder Out [] noch funktioniert). Um dies zu umgehen, sollten Sie den Typ Interpretation verwenden, der es ermöglicht, dass ein Ausdruck als eine Sache angezeigt wird, aber als eine andere interpretiert wird, wenn er als Eingabe geliefert wird. Meine Änderung von Michaels Antwort ist

Format[myPlus[expr__]] := Interpretation[Row[{expr}, "+"], myPlus[expr]] 

Dies kann kopiert und eingefügt werden erfolgreich. Das Problem liegt darin, kopierte Ausdrücke zu modifizieren. Sie können einen kopierten Ausdruck zurück in InputForm mit Ctrl-Shift-I konvertieren, dann ändern Sie alles, was Sie wollen, und verwenden Sie die InputForm in einem beliebigen Ausdruck. Aber Wenn Sie versuchen, es wieder in StandardForm mit Ctrl-Shift-N ändern, dann geben Sie eine Rekursion, wo das zweite Argument in der Interpretation wiederholt ausgewertet wird. Dies ist trotz Interpretation mit dem Attribut HoldAll (die während der normalen Auswertung ordnungsgemäß funktioniert).

Normalerweise, wenn einfache Notationen definieren, verwende ich die Low-Level-MakeBoxes, zB

myPlus/:MakeBoxes[myPlus[expr__],fmt_]:=With[{r=Riffle[MakeBoxes/@{expr},"+"]}, 
    InterpretationBox[RowBox[r],myPlus[expr]]] 

die einwandfrei funktioniert, so habe ich nicht diese Rekursion Problem vor.


Also meine Frage (endlich) ist: Was mit meinem Format Typ Befehl falsch gelaufen ist und wie sie durch feste? Oder: Wie machen Sie ein High-Level-Äquivalent von meinem MakeBoxes Befehl?

+0

BTW, da Interpretation funktioniert gut während der normalen Auswertung, könnte dies nur ein Fehler mit der "Convert To" -Auswertungen sein ... – Simon

+0

Replizieren nicht auf M'ma 7.0.1/Linux AMD64. Getestet wurde der Ausdruck Interpretation [] als "myPlus [a, b, c]". Konvertiert problemlos hin und her. –

+0

@Eric Das ist die gleiche Version und das gleiche System, das ich verwende. Ich habe der WRI einen Fehlerbericht gesendet, um zu sehen, ob sie das Verhalten reproduzieren. – Simon

Antwort

11

Ich beriet mich mit einem Kollegen, und seine Empfehlung war im Wesentlichen, dass das Aufstellen von Wertdefinitionen auf MakeBoxes, wie Sie demonstrieren, besser ist als die Verwendung von Format, wenn Sie Dinge eng von der Ausgabe zurück zu Eingang integriert werden wollen. Format ist nicht wirklich beabsichtigt Ausgabe zu erzeugen, die als Eingabe wiederverwendet werden kann, sondern nur Ausgabe zu formatieren, damit die unerwartete Rekursion mit Interpretation wenn zu StandardForm Umwandlung usw.

Sie könnten die Funktion ToBoxes eine sinnvolle Ergänzung finden zu MakeBoxes.

Schließlich here's a tutorial über Box-Strukturen.

HTH!

+0

Danke Michael. Das Seltsame ist, dass die Bauarbeiten in Ordnung sind, außer wenn Sie "an Ort und Stelle bewerten". Ein Support-Typ bei der WRI hat einen Fehlerbericht für mich eingereicht. Momentan werde ich 'MakeBoxes' (und' ToBoxes') verwenden. – Simon

Verwandte Themen