Information / Information`InformationValueForm menggunakan Full- atau InputForm

Sep 12 2020

Saya memiliki masalah dengan Informationfungsi bawaan untuk simbol yang ditentukan pengguna dengan StandardForm kustom di Mathematica 12.1.1.0:

Misalnya dengan definisi fungsi

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

Information[CM]hasil kueri di:

Definisi dalam output diformat menggunakan StandardForm bahkan tanpa menampilkannya dengan benar. Masalah yang sama terjadi ketika seseorang mendefinisikan UpValues . Pada titik ini, ini membuat kotak Informasi tidak dapat dibaca tetapi menjadi lebih buruk saat digunakan InterpretationBox. Dengan

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

Panggilan untuk Information[CM]menghasilkan rekursi tak terbatas dan beberapa peringatan dan kesalahan:

Memeriksa FullFormhasil Information[CM]pengungkapan

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

dan dengan itu fungsi internal dan tentu saja tidak terdokumentasi ...InformationValueFormyang digunakan untuk mengeluarkan definisi yang ditemukan.

Apakah ada cara untuk mengkonfigurasi atau memanipulasi Informationatau mendasari InformationValueFormuntuk menampilkan definisi fungsi menggunakan Full- atau InputForm ? Saya dapat memanipulasi output FullForm dengan mengubah argumen RuleDelayedinside InformationValueFormke Strings tetapi saya tidak dapat melampirkan perbaikan ini ke Informationor InformationValueForm.

Saya tidak mengerti keputusan desain di balik penggunaan StandardForm dalam output Informationuntuk fungsi yang ditentukan pengguna dan seluruh situasi pada dasarnya adalah bug menurut saya. Masalah sebenarnya adalah rekursi dan kesalahan tak terbatas untuk fungsi pemformatan yang lebih terlibat yang dapat merusak kernel dan / atau front-end. Saya cenderung mendokumentasikan fungsi saya dan saya terkadang suka menggunakannya Informationuntuk mengingatkan diri saya tentang urutan argumen. Solusi yang agak tidak memuaskan yang saat ini saya gunakan adalah menonaktifkan Informationfungsi yang diformat menggunakan UpValues:

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

Dengan cara ini saya setidaknya memiliki akses ke pesan penggunaan tetapi definisi, opsi, dan semua Information-data lainnya tidak dapat diakses menggunakan solusi ini.

Jawaban

1 N0va Oct 07 2020 at 04:48

Saya menemukan jawaban atas pertanyaan saya dalam kode sumber dari beberapa fungsi inti Mathematica. Menggunakan fungsi yang sangat membantu GeneralUtilities`PrintDefinitionspada mis InterpolatingFunction(atau fungsi inti lainnya yang digunakan BoxForm` ArrangeSummaryBoxuntuk keluaran yang diformat) mengungkapkan fungsi / variabel kernel yang dilindungi BoxForm`UseIcons. Ini tampaknya merupakan variabel dinamis terkait BoxFormyang salah untuk kotak yang dibuat oleh Information. Kode berikut memungkinkan pemformatan kustom di notebook tetapi tidak di output Information(termasuk ?dan ??) dan lingkungan lain dengan BoxForm`UseIcons=False:

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

Melampirkan pemformatan khusus ke MakeBoxesalih-alih Formatdan memeriksa variabel BoxForm`UseIconsmelakukan trik dan menjawab pertanyaan saya untuk kepuasan saya. Solusi ini sejauh ini merupakan solusi yang lebih baik dibandingkan dengan jawaban saya sebelumnya dan metode pilihan untuk setidaknya beberapa fungsi inti dengan keluaran berformat mewah. Saya memposting jawaban baru ini karena strategi solusi berbeda dari yang sebelumnya.

Ini sangat disayangkan bahwa ini tidak didokumentasikan bersama Formatatau MakeBoxesatau bahkan pilihan atau default fungsi-fungsi.

N0va Sep 18 2020 at 06:01

Saya menemukan solusi yang agak layak berdasarkan UpValues ​​pada metode / simbol pengguna yang bermasalah misalnya:

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

yang menghasilkan keluaran

Simbol CMinfodigunakan dalam ...InformationValueForm[...]alih-alih CMuntuk mencegah pemformatan dalam definisi. Keluaran untuk FormatValuesmasih diformat dan oleh karena itu tidak terlalu informatif jadi saya memasukkan placeholder sebagai gantinya. Mungkin dengan sedikit lebih banyak pekerjaan orang bisa mendapatkan FormatValuespekerjaan juga.

Pendekatan ini bekerja cukup baik bagi saya tetapi saya masih agak tidak senang dengan perlunya tindakan semacam itu. The Information[...]Metode harus bekerja di luar kotak pada fungsi pengguna yang valid. Jadi saya masih mendukung untuk menyebut seluruh kekacauan sebagai bug, tetapi terima kasih kepada @Michael E2 karena telah menunjukkan di komentar di bawah pertanyaan bahwa tag 'bug' memerlukan pemeriksaan. Saya tidak membaca deskripsi tag dan menggunakannya secara salah - maaf untuk itu.

Perhatikan bahwa keduanya Information[CM]dan ??CMberfungsi sebagaimana dimaksud saat memodifikasi ...InformationValueForm[...], yang secara diam-diam bukan kasus untuk perbaikan yang diajukan dalam pertanyaan saya (pengaturan CM /: Information[CM] := CM::usage).

Bentuk masukan khusus ?dan ??tidak hanya khusus menurut namanya tetapi juga khusus karena menghindari UpValues Informationyang lagi-lagi terdengar sangat tidak masuk akal bagi saya.