Full- veya InputForm kullanarak Information / Information`InformationValueForm

Sep 12 2020

Mathematica 12.1.1.0'da Informationözel StandardForm ile kullanıcı tanımlı semboller için yerleşik işlevle ilgili bir sorun yaşıyorum:

Örneğin işlev tanımlarıyla

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

sorgu şu şekilde Information[CM]sonuçlanır:

Çıktıdaki tanımlar, doğru şekilde görüntülenmeden bile StandardForm kullanılarak biçimlendirilir . UpValues tanımlandığında da aynı sorun ortaya çıkar . Bu noktada bu, Bilgi kutusunu okunamaz hale getirir, ancak kullanılırken daha da kötüleşir InterpretationBox. İle

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

Information[CM]Sonsuz bir özyineleme ve birkaç uyarı ve hatayla sonuçlanan bir çağrı :

İncelenmesi FullFormsonuçlarının Information[CM]ortaya

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

ve onunla ...InformationValueFormbirlikte bulunan tanımların çıktısını almak için kullanılan dahili ve tabii ki belgelenmemiş işlev .

Configure veya manipüle etmek için bir yolu var mı Informationveya altta yatan InformationValueFormkullanarak işlev tanımları görüntülemek için tam veya InputForm ? Ben de savlarını dönüştürerek fullform çıktı işlemek başardı RuleDelayediç InformationValueFormStrings için ama bu düzeltmeyi takmak mümkün değildi Informationya InformationValueForm.

Kullanıcı tanımlı işlevlerin çıktısında StandardForm kullanmanın arkasındaki tasarım kararını anlamıyorum Informationve tüm durum temelde bence bir hata. Asıl sorun, çekirdeği ve / veya ön ucu çökertebilecek daha ilgili biçimlendirme işlevleri için sonsuz özyineleme ve hatalardır. İşlevlerimi belgeleme eğilimindeyim ve bazen Informationkendime argüman sırasını hatırlatmak için kullanmayı seviyorum . Şu anda kullandığım oldukça tatmin edici olmayan geçici çözüm, InformationUpValues ​​kullanarak biçimlendirilmiş işlevlerimi devre dışı bırakmaktır :

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

Bu şekilde en azından kullanım mesajına erişebilirim, ancak tanımlara, seçeneklere ve diğer tüm verilere Informationbu geçici çözüm kullanılarak erişilemez.

Yanıtlar

1 N0va Oct 07 2020 at 04:48

Birkaç Mathematica temel fonksiyonunun kaynak kodunda sorumun cevabını buldum. GeneralUtilities`PrintDefinitionsÖrneğin üzerinde son derece yararlı işlevi InterpolatingFunction(veya BoxForm` ArrangeSummaryBoxbiçimlendirilmiş çıktı için kullanan başka bir çekirdek işlevi) kullanmak , korumalı çekirdek işlevini / değişkenini ortaya çıkarır BoxForm`UseIcons. Bu BoxForm, tarafından üretilen kutular için yanlış olan dinamik bir değişken gibi görünüyor Information. Aşağıdaki kod, not defterinde özel biçimlendirmeye izin verir, ancak Information( ?ve dahil ??) ve diğer ortamların çıktılarında değil BoxForm`UseIcons=False:

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

Değişken MakeBoxesyerine özel biçimlendirmeyi eklemek Formatve kontrol etmek BoxForm`UseIconshile yapar ve sorumu tatmin edecek şekilde yanıtlar. Bu çözüm, önceki cevabıma kıyasla çok daha iyi bir çözüm ve süslü biçimlendirilmiş çıktıya sahip en azından bazı temel işlevler için tercih edilen yöntem. Çözüm stratejisi öncekinden farklı olduğu için bu yeni yanıtı gönderdim.

Bu yan yana belgelenmiştir değil üzücü Formatya MakeBoxeshatta bir seçenek ya da bu işlevlerin varsayılan.

N0va Sep 18 2020 at 06:01

Sorunlu kullanıcı yöntemlerine / sembollerine dayanan UpValues'e dayalı olarak biraz uygun bir çözüm buldum, örneğin:

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

hangi çıktıyla sonuçlanır

Tanımlarda biçimlendirmeyi önlemek yerine sembolü CMinfokullanılır . Çıktısı hala biçimlendirilmiş ve bu nedenle çok bilgilendirici değil, bu yüzden bunun yerine bir yer tutucu ekledim. Belki biraz daha fazla çalışmayla iş de elde edilebilir....InformationValueForm[...]CMFormatValuesFormatValues

Bu yaklaşım benim için yeterince iyi çalışıyor, ancak bu tür önlemlerin gerekliliğinden hala oldukça memnunum. Information[...]Yöntemi geçerli kullanıcı fonksiyonları üzerindeki kutudan çalışmalıdır. Bu yüzden hala tüm karışıklığı bir hata olarak adlandırmaktan yanayım ama 'bug' etiketinin inceleme gerektirdiğine dair yorumlarda işaret ettiği için @ Michael E2'ye teşekkür ederim. Etiket açıklamasını okumadım ve yanlış kullandım - bunun için üzgünüm.

Not her iki Information[CM]ve ??CMiş değiştirirken amaçlandığı gibi ...InformationValueForm[...]surprsingly soruma (Ayar ileri sürülen düzeltme için durum böyle değildir ki, CM /: Information[CM] := CM::usage).

Özel girdi formları ?ve ??sadece isme göre özel değil, aynı zamanda özeldirler çünkü Informationbana yine çok mantıksız gelen UpValue'ları atlatırlar .