Information / Information`InformationValueForm utilisant Full- ou InputForm
J'ai un problème avec la Informationfonction intégrée pour les symboles définis par l'utilisateur avec StandardForm personnalisé dans Mathematica 12.1.1.0:
Par exemple avec les définitions de fonction
ClearAll[CM];
CM[1, a__] := CM[a]
CM /: Format[CM[a_, b___], StandardForm] := Row[{a, b}, " "]
CM::usage = "CM";
la requête Information[CM]aboutit à:
Les définitions dans la sortie sont formatées à l'aide de StandardForm sans même l'afficher correctement. Le même problème se produit lorsque l'on définit UpValues . À ce stade, cela rend la boîte d'informations illisible, mais cela empire lors de l'utilisation InterpretationBox. Avec
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";
Un appel à Information[CM]entraîne une récursion infinie et plusieurs avertissements et erreurs:
Inspection FullFormdes résultats des Information[CM]révélations
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]]]]],
...
]]
et avec elle la fonction interne et bien sûr non documentée ...InformationValueFormqui est utilisée pour sortir les définitions trouvées.
Existe-t-il un moyen de configurer ou de manipuler Informationou le sous-jacent InformationValueFormpour afficher les définitions de fonction à l'aide de Full- ou InputForm ? J'ai pu manipuler la sortie FullForm en convertissant les arguments de RuleDelayedinside InformationValueFormen chaînes, mais je n'ai pas pu attacher ce correctif à Informationou InformationValueForm.
Je ne comprends pas la décision de conception derrière l'utilisation de StandardForm dans la sortie de Informationpour les fonctions définies par l'utilisateur et toute la situation est fondamentalement un bogue à mon avis. Le vrai problème, ce sont les récursions et les erreurs infinies pour les fonctions de formatage plus complexes qui peuvent planter le noyau et / ou le front-end. J'ai tendance à documenter mes fonctions et j'aime parfois m'en servir Informationpour me rappeler l'ordre des arguments. La solution de contournement plutôt insatisfaisante que j'utilise actuellement est de désactiver Informationpour mes fonctions formatées en utilisant UpValues:
CM /: Information[CM, opts___] := CM::usage;
De cette façon, j'ai au moins accès au message d'utilisation, mais les définitions, les options et toutes les autres données Informationne sont pas accessibles en utilisant cette solution de contournement.
Réponses
J'ai trouvé la réponse à ma question dans le code source de plusieurs fonctions de base de Mathematica. L'utilisation de la fonction extrêmement utile GeneralUtilities`PrintDefinitionssur eg InterpolatingFunction(ou toute autre fonction de base utilisée BoxForm` ArrangeSummaryBoxpour sa sortie formatée) révèle la fonction / variable du noyau protégée BoxForm`UseIcons. Cela semble être une variable dynamique liée à BoxFormlaquelle est faux pour les boîtes générées par Information. Le code suivant permet une mise en forme personnalisée dans le bloc-notes, mais pas dans la sortie de Information(y compris ?et ??) et d'autres environnements avec BoxForm`UseIcons=False:
MakeBoxes[..., StandartForm] /; BoxForm`UseIcons := ...
Joindre la mise en forme personnalisée au MakeBoxeslieu de Formatet vérifier la variable BoxForm`UseIconsfait l'affaire et répond à ma question à ma satisfaction. Cette solution est de loin la meilleure solution par rapport à ma réponse précédente et la méthode de choix pour au moins certaines fonctions de base avec une sortie au format sophistiqué. J'ai posté une nouvelle réponse car la stratégie de solution diffère de la précédente.
Il est dommage que cela ne soit pas documenté à côté Formatou MakeBoxesou même une option ou par défaut de ces fonctions.
J'ai trouvé une solution quelque peu faisable basée sur UpValues sur les méthodes / symboles utilisateur problématiques, par exemple:
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";
qui se traduit par la sortie
Le symbole CMinfoest utilisé dans ...InformationValueForm[...]au lieu de CMpour empêcher la mise en forme dans les définitions. La sortie pour FormatValuesest toujours formatée et donc pas très informative, j'ai donc inséré un espace réservé à la place. Peut-être qu'avec un peu plus de travail, on pourrait aussi faire FormatValuesfonctionner.
Cette approche fonctionne assez bien pour moi, mais je ne suis toujours pas satisfaite de la nécessité de telles mesures. La Information[...]méthode doit fonctionner hors de la boîte sur des fonctions utilisateur valides. Je suis donc toujours en faveur d'appeler le désordre entier un bogue mais merci à @Michael E2 d'avoir souligné dans les commentaires sous la question que la balise 'bug' doit être vérifiée. Je n'ai pas lu la description de la balise et je l'ai mal utilisée - désolé pour cela.
Notez que les deux Information[CM]et ??CMfonctionnent comme prévu lors de la modification ...InformationValueForm[...], ce qui n'est étonnamment pas le cas pour le correctif proposé dans ma question (paramètre CM /: Information[CM] := CM::usage).
Les formulaires de saisie spéciaux ?et ??sont non seulement spéciaux par leur nom, mais aussi spéciaux car ils contournent les UpValues pour Informationqui, encore une fois, me semble très déraisonnable.