Information / Information`InformationValueForm mit Full- oder InputForm
Ich habe ein Problem mit der integrierten InformationFunktion für benutzerdefinierte Symbole mit benutzerdefiniertem StandardForm in Mathematica 12.1.1.0:
Zum Beispiel mit den Funktionsdefinitionen
ClearAll[CM];
CM[1, a__] := CM[a]
CM /: Format[CM[a_, b___], StandardForm] := Row[{a, b}, " "]
CM::usage = "CM";
Die Abfrage Information[CM]führt zu:
Die Definitionen in der Ausgabe werden mit StandardForm formatiert, ohne dass sie korrekt angezeigt werden. Das gleiche Problem tritt auf, wenn man UpValues definiert . Zu diesem Zeitpunkt ist das Informationsfeld nur noch unlesbar, es wird jedoch bei der Verwendung schlechter InterpretationBox. Mit
ClearAll[CM];
CM[1, a__] := CM[a]
CM /: Format[CM[a_, b___], StandardForm] := With[{box = ToBoxes[Row[{a, b}," "]]},
RawBoxes[InterpretationBox[RowBox[{box}], CM[a, b]]]
];
CM::usage = "CM";
Ein Aufruf von Information[CM]führt zu einer unendlichen Rekursion und mehreren Warnungen und Fehlern:
Überprüfung FullFormder Ergebnisse von Information[CM]enthüllt
InformationData[Association[
...
Rule["DownValues",Information`InformationValueForm[DownValues,CM,List[RuleDelayed[CM[1,Pattern[a,BlankSequence[]]],CM[a]]]]],
...
Rule["FormatValues",Information`InformationValueForm[FormatValues,CM,List[RuleDelayed[MakeBoxes[CM[Pattern[a,Blank[]],Pattern[b,BlankNullSequence[]]],StandardForm],Format[With[List[Set[box,ToBoxes[Row[List[a,b]," "]]]],RawBoxes[InterpretationBox[RowBox[List[box]],CM[a,b]]]],StandardForm]]]]],
...
]]
und damit die interne und natürlich undokumentierte Funktion, mit ...InformationValueFormder die gefundenen Definitionen ausgegeben werden.
Gibt es eine Möglichkeit zum Konfigurieren oder Bearbeiten Informationoder InformationValueFormzum Anzeigen der Funktionsdefinitionen mithilfe von Full- oder InputForm ? Ich konnte die FullForm-Ausgabe manipulieren, indem ich die Argumente von RuleDelayedinside InformationValueFormin Strings konvertierte , aber ich konnte diesen Fix nicht an Informationoder anhängen InformationValueForm.
Ich verstehe die Entwurfsentscheidung hinter der Verwendung von StandardForm bei der Ausgabe von Informationbenutzerdefinierten Funktionen nicht und die gesamte Situation ist meiner Meinung nach im Grunde genommen ein Fehler. Das eigentliche Problem sind die unendlichen Rekursionen und Fehler für komplexere Formatierungsfunktionen, die den Kernel und / oder das Front-End zum Absturz bringen können. Ich neige dazu, meine Funktionen zu dokumentieren, und manchmal Informationerinnere ich mich gerne an die Reihenfolge der Argumente. Die ziemlich unbefriedigende Problemumgehung, die ich derzeit verwende, besteht darin, Informationmeine formatierten Funktionen mit UpValues zu deaktivieren :
CM /: Information[CM, opts___] := CM::usage;
Auf diese Weise habe ich zumindest Zugriff auf die Verwendungsnachricht, aber auf Definitionen, Optionen und alle anderen Information-Daten kann mit dieser Problemumgehung nicht zugegriffen werden.
Antworten
Die Antwort auf meine Frage fand ich im Quellcode mehrerer Mathematica-Kernfunktionen. Wenn Sie die immens hilfreiche Funktion GeneralUtilities`PrintDefinitionsfür z. B. InterpolatingFunction(oder eine andere Kernfunktion, die BoxForm` ArrangeSummaryBoxfür die formatierte Ausgabe verwendet wird) verwenden, wird die geschützte Kernelfunktion / -variable angezeigt BoxForm`UseIcons. Dies scheint eine dynamische Variable zu sein, BoxFormdie für die von generierten Boxen falsch ist Information. Der folgende Code ermöglicht die benutzerdefinierte Formatierung im Notebook, jedoch nicht in der Ausgabe von Information(einschließlich ?und ??) und anderen Umgebungen mit BoxForm`UseIcons=False:
MakeBoxes[..., StandartForm] /; BoxForm`UseIcons := ...
Das Anhängen der benutzerdefinierten Formatierung an MakeBoxesanstelle von Formatund das Überprüfen der Variablen BoxForm`UseIconsreicht aus und beantwortet meine Frage zu meiner Zufriedenheit. Diese Lösung ist bei weitem die bessere Lösung im Vergleich zu meiner vorherigen Antwort und der Methode der Wahl für zumindest einige Kernfunktionen mit ausgefallener formatierter Ausgabe. Ich habe diese neue Antwort gepostet, da sich die Lösungsstrategie von der vorherigen unterscheidet.
Es ist schade, dass dies nicht neben Formatoder MakeBoxesoder sogar einer Option oder Standardeinstellung dieser Funktionen dokumentiert ist .
Ich habe eine etwas praktikable Lösung basierend auf UpValues für die problematischen Benutzermethoden / -symbole gefunden, z.
ClearAll[CM];
CM[1, a__] := CM[a]
CM /: Format[CM[a_, b__], StandardForm] := Row[{a, b}, " "]
CM /: Format[CM[a_], StandardForm] := a
Unprotect[CMinfo]; ClearAll[CMinfo];
CMinfo /: Format[CMinfo, StandardForm] = "CM";
Attributes[CMinfo] = {Protected, Constant};
CM /: Information`InformationValueForm[val_, CM, exp_List] :=
With[{s = ReleaseHold[Hold[exp] /. CM -> CMinfo]},
Information`InformationValueForm[val, CMinfo, s]]
CM /: Information`InformationValueForm[FormatValues, CM, exp_List] :=
With[{s = {Skeleton[Length[exp]]}},
Information`InformationValueForm[val, CMinfo, s]]
CM::usage = "CM::usage";
was zur Ausgabe führt
Das Symbol CMinfowird in ...InformationValueForm[...]verwendet CM, um die Formatierung in den Definitionen zu verhindern. Die Ausgabe für FormatValuesist immer noch formatiert und daher nicht sehr informativ, daher habe ich stattdessen einen Platzhalter eingefügt. Vielleicht könnte man mit etwas mehr Arbeit auch FormatValuesarbeiten.
Dieser Ansatz funktioniert für mich gut genug, aber ich bin immer noch ziemlich unzufrieden mit der Notwendigkeit solcher Maßnahmen. Die Information[...]Methode sollte bei gültigen Benutzerfunktionen sofort funktionieren. Ich bin immer noch dafür, das ganze Chaos als Fehler zu bezeichnen, aber ich danke @Michael E2, dass er in den Kommentaren unter der Frage darauf hingewiesen hat, dass das Tag "Fehler" überprüft werden muss. Ich habe die Tag-Beschreibung nicht gelesen und falsch verwendet - Entschuldigung.
Beachten Sie, dass beide Information[CM]und ??CMbeim Ändern wie beabsichtigt funktionieren ...InformationValueForm[...], was überraschenderweise bei dem in meiner Frage (Einstellung CM /: Information[CM] := CM::usage) vorgebrachten Fix nicht der Fall ist .
Die speziellen Eingabemasken ?und ??sind nicht nur besondere namentlich , sondern auch etwas Besonderes , weil sie circumvent UpValues für Informationwelche wieder nur sehr unvernünftig klingt für mich.