Information / Information`InformationValueForm przy użyciu Full- lub InputForm

Sep 12 2020

Mam problem z Informationfunkcją wbudowaną dla symboli zdefiniowanych przez użytkownika z niestandardowym StandardForm w Mathematica 12.1.1.0:

Na przykład z definicjami funkcji

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

zapytanie Information[CM]skutkuje:

Definicje w danych wyjściowych są formatowane przy użyciu StandardForm, nawet bez prawidłowego wyświetlania. Ten sam problem występuje, gdy definiuje się UpValues . W tym momencie sprawia to, że okno informacyjne jest po prostu nieczytelne, ale pogarsza się podczas używania InterpretationBox. Z

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

Wywołanie do Information[CM]skutkuje nieskończoną rekurencją oraz kilkoma ostrzeżeniami i błędami:

Sprawdzanie FullFormwyników Information[CM]ujawnień

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

a wraz z nim wewnętrzna i oczywiście nieudokumentowana funkcja, ...InformationValueFormktóra służy do wyprowadzania znalezionych definicji.

Czy istnieje sposób na skonfigurowanie lub manipulowanie Informationlub podstawową InformationValueFormfunkcję wyświetlania definicji funkcji przy użyciu Full- lub InputForm ? Udało mi się manipulować danymi wyjściowymi FullForm, konwertując argumenty RuleDelayedinside InformationValueFormna Strings, ale nie mogłem dołączyć tej poprawki do Informationlub InformationValueForm.

Nie rozumiem decyzji projektowej stojącej za używaniem StandardForm na wyjściu Informationdla funkcji zdefiniowanych przez użytkownika, a cała sytuacja jest moim zdaniem w zasadzie błędem. Prawdziwym problemem są nieskończone rekursje i błędy bardziej zaangażowanych funkcji formatowania, które mogą spowodować awarię jądra i / lub interfejsu użytkownika. Zwykle dokumentuję swoje funkcje i czasami lubię Informationprzypominać sobie o kolejności argumentów. Raczej niezadowalającym obejściem, którego obecnie używam, jest wyłączenie Informationdla moich sformatowanych funkcji przy użyciu UpValues:

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

W ten sposób mam przynajmniej dostęp do komunikatu o użytkowaniu, ale definicje, opcje i wszystkie inne Information-dane nie są dostępne przy użyciu tego obejścia.

Odpowiedzi

1 N0va Oct 07 2020 at 04:48

Znalazłem odpowiedź na swoje pytanie w kodzie źródłowym kilku podstawowych funkcji Mathematica. Użycie niezwykle pomocnej funkcji GeneralUtilities`PrintDefinitionsna np. InterpolatingFunction(Lub jakiejkolwiek innej podstawowej funkcji używanej BoxForm` ArrangeSummaryBoxdo sformatowanego wyjścia) ujawnia chronioną funkcję / zmienną jądra BoxForm`UseIcons. Wydaje się, że jest to zmienna dynamiczna, z BoxFormktórą związane jest fałsz dla pól generowanych przez Information. Poniższy kod pozwala na niestandardowe formatowanie w notebooku, ale nie na wyjściu Information(w tym ?i ??) oraz innych środowiskach z BoxForm`UseIcons=False:

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

Dołączenie niestandardowego formatowania MakeBoxeszamiast Formati sprawdzanie zmiennej BoxForm`UseIconszałatwia sprawę i odpowiada na moje pytanie ku mojej satysfakcji. To rozwiązanie jest zdecydowanie lepszym rozwiązaniem w porównaniu z moją poprzednią odpowiedzią i metodą z wyboru przynajmniej dla niektórych podstawowych funkcji z fantazyjnie sformatowanym wyjściem. Opublikowałem tę nową odpowiedź, ponieważ strategia rozwiązania różni się od poprzedniej.

Szkoda, że to nie jest udokumentowane obok Formatlub MakeBoxeslub nawet opcję lub domyślne tych funkcji.

N0va Sep 18 2020 at 06:01

Znalazłem dość realne rozwiązanie w oparciu o UpValues ​​na problematycznych metodach / symbolach użytkownika, np .:

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

co skutkuje wynikiem

Symbol CMinfojest używany ...InformationValueForm[...]zamiast, CMaby zapobiec formatowaniu w definicjach. Dane wyjściowe dla FormatValuessą nadal sformatowane i dlatego nie zawierają zbyt wielu informacji, więc zamiast tego wstawiłem symbol zastępczy. Może przy odrobinie pracy można by też dostać FormatValuespracę.

To podejście działa w moim przypadku wystarczająco dobrze, ale nadal nie jestem zadowolony z konieczności podjęcia takich środków. Information[...]Metoda powinna działać po wyjęciu z pudełka z ważnych funkcji użytkownika. Więc nadal jestem za nazywaniem całego bałaganu błędem, ale dziękuję @Michaelowi E2 za wskazanie w komentarzach pod pytaniem, że tag „błąd” wymaga weryfikacji. Nie przeczytałem opisu tagu i użyłem go źle - przepraszam za to.

Zauważ, że oba Information[CM]i ??CMdziałają zgodnie z przeznaczeniem podczas modyfikacji ...InformationValueForm[...], co zaskakująco nie ma miejsca w przypadku poprawki przedstawionej w moim pytaniu (ustawienie CM /: Information[CM] := CM::usage).

Specjalne formularze wejściowe ?i ??są nie tylko specjalne z nazwy, ale także wyjątkowe, ponieważ omijają UpValues, Informationco znowu wydaje mi się bardzo nierozsądne.