Information / Information`InformationValueForm utilizzando Full- o InputForm

Sep 12 2020

Ho un problema con la Informationfunzione incorporata per i simboli definiti dall'utente con StandardForm personalizzato in Mathematica 12.1.1.0:

Ad esempio con le definizioni di funzione

ClearAll[CM];
CM[1, a__] := CM[a]
CM /: Format[CM[a_, b___], StandardForm] := Row[{a, b}, " "]
CM::usage = "CM";

la query Information[CM]risulta in:

Le definizioni nell'output vengono formattate utilizzando StandardForm senza nemmeno visualizzarlo correttamente. Lo stesso problema si verifica quando si definisce UpValues . A questo punto questo rende la casella delle informazioni semplicemente illeggibile ma peggiora durante l'utilizzo InterpretationBox. Con

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

Una chiamata a Information[CM]risulta in una ricorsione infinita e diversi avvisi ed errori:

Ispezionare i FullFormrisultati delle Information[CM]rivelazioni

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]]]]],
    ...
]]

e con esso la funzione interna e ovviamente non documentata ...InformationValueFormche viene utilizzata per produrre le definizioni trovate.

C'è un modo per configurare o manipolare Informationo il sottostante InformationValueFormper visualizzare le definizioni di funzione utilizzando Full- o InputForm ? Sono stato in grado di manipolare l'output FullForm convertendo gli argomenti di RuleDelayedinside InformationValueFormin Strings ma non sono stato in grado di allegare questa correzione a Informationo InformationValueForm.

Non capisco la decisione di progettazione dietro l'utilizzo di StandardForm nell'output di Informationper le funzioni definite dall'utente e l'intera situazione è fondamentalmente un bug secondo me. Il vero problema sono le infinite ricorsioni ed errori per le funzioni di formattazione più coinvolte che possono mandare in crash il kernel e / o il front-end. Tendo a documentare le mie funzioni ea volte mi piace usare Informationper ricordare a me stesso l'ordine degli argomenti. La soluzione alternativa piuttosto insoddisfacente che sto attualmente utilizzando è disabilitare le Informationmie funzioni formattate utilizzando UpValues:

CM /: Information[CM, opts___] := CM::usage;

In questo modo ho almeno accesso al messaggio di utilizzo ma le definizioni, le opzioni e tutti gli altri Informationdati non sono accessibili utilizzando questa soluzione alternativa.

Risposte

1 N0va Oct 07 2020 at 04:48

Ho trovato la risposta alla mia domanda nel codice sorgente di diverse funzioni principali di Mathematica. L'uso della funzione immensamente utile GeneralUtilities`PrintDefinitionssu eg InterpolatingFunction(o qualsiasi altra funzione principale che utilizza BoxForm` ArrangeSummaryBoxper il suo output formattato) rivela la funzione / variabile del kernel protetta BoxForm`UseIcons. Questa sembra essere una variabile dinamica correlata alla BoxFormquale è falsa per le caselle generate da Information. Il codice seguente consente la formattazione personalizzata nel notebook ma non nell'output di Information(inclusi ?e ??) e altri ambienti con BoxForm`UseIcons=False:

MakeBoxes[..., StandartForm] /; BoxForm`UseIcons := ...

Allegare la formattazione personalizzata a MakeBoxesinvece di Formate controllare la variabile BoxForm`UseIconsfa il trucco e risponde alla mia domanda in modo soddisfacente. Questa soluzione è di gran lunga la soluzione migliore rispetto alla mia risposta precedente e il metodo di scelta per almeno alcune funzioni principali con un output formattato di fantasia. Ho pubblicato una nuova risposta poiché la strategia della soluzione è diversa dalla precedente.

E 'un peccato che ciò non sia documentato a fianco Formato MakeBoxeso anche un'opzione o di default di tali funzioni.

N0va Sep 18 2020 at 06:01

Ho trovato una soluzione in qualche modo fattibile basata su UpValues ​​sui metodi / simboli utente problematici, ad esempio:

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

che si traduce nell'output

Il simbolo CMinfoviene utilizzato al ...InformationValueForm[...]posto di CMper impedire la formattazione nelle definizioni. L'output per FormatValuesè ancora formattato e quindi non molto informativo, quindi ho inserito un segnaposto. Forse con un po 'più di lavoro si potrebbe anche ottenere il FormatValueslavoro.

Questo approccio funziona abbastanza bene per me, ma sono ancora piuttosto insoddisfatto della necessità di tali misure. Il Information[...]metodo dovrebbe funzionare immediatamente su funzioni utente valide. Quindi sono ancora favorevole a chiamare l'intero pasticcio un bug, ma grazie a @Michael E2 per aver sottolineato nei commenti sotto la domanda che il tag "bug" richiede un controllo. Non ho letto la descrizione del tag e l'ho usata in modo sbagliato, mi dispiace.

Nota che entrambi Information[CM]e ??CMfunzionano come previsto durante la modifica ...InformationValueForm[...], il che sorprendentemente non è il caso della correzione proposta nella mia domanda (impostazione CM /: Information[CM] := CM::usage).

Le forme di input speciali ?e ??non sono solo speciali per nome ma anche speciali perché aggirano UpValues ​​per i Informationquali ancora una volta suona molto irragionevole per me.