ข้อมูล / Information`InformationValueForm โดยใช้ Full- หรือ InputForm

Sep 12 2020

ฉันมีปัญหากับInformationฟังก์ชันbuild-in สำหรับสัญลักษณ์ที่ผู้ใช้กำหนดด้วยStandardFormแบบกำหนดเองใน Mathematica 12.1.1.0:

ตัวอย่างเช่นกับคำจำกัดความของฟังก์ชัน

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

แบบสอบถามInformation[CM]ผลลัพธ์ใน:

คำจำกัดความในเอาต์พุตถูกจัดรูปแบบโดยใช้StandardFormโดยไม่ได้แสดงอย่างถูกต้อง ปัญหาเดียวกันเกิดขึ้นเมื่อกำหนดUpValues ณ จุดนี้นี้จะทำให้ช่องข้อมูลเพียงแค่อ่านไม่ได้ InterpretationBoxแต่ได้รับเลวร้ายยิ่งเมื่อใช้ ด้วย

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]ส่งผลให้เกิดการเรียกซ้ำแบบไม่มีที่สิ้นสุดและคำเตือนและข้อผิดพลาดหลายประการ:

การตรวจสอบFullFormผลการInformation[CM]เปิดเผย

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

และด้วยฟังก์ชันภายในและแน่นอนที่ไม่มีเอกสาร...InformationValueFormซึ่งใช้ในการส่งออกคำจำกัดความที่พบ

มีวิธีกำหนดค่าหรือจัดการInformationหรือพื้นฐานInformationValueFormในการแสดงคำจำกัดความของฟังก์ชันโดยใช้Full-หรือInputFormหรือไม่? ผมสามารถที่จะจัดการกับการส่งออก fullform โดยการแปลงข้อโต้แย้งของRuleDelayedภายในInformationValueFormสตริง แต่ผมก็ไม่สามารถที่จะแนบแก้ไขนี้ไปหรือInformationInformationValueForm

ฉันไม่เข้าใจการตัดสินใจออกแบบเบื้องหลังการใช้StandardFormในผลลัพธ์ของInformationฟังก์ชันที่ผู้ใช้กำหนดเองและสถานการณ์ทั้งหมดเป็นข้อบกพร่องในความคิดของฉัน ปัญหาที่แท้จริงคือการเกิดซ้ำที่ไม่สิ้นสุดและข้อผิดพลาดสำหรับฟังก์ชันการจัดรูปแบบที่เกี่ยวข้องมากขึ้นซึ่งอาจทำให้เคอร์เนลและ / หรือส่วนหน้าผิดพลาด ฉันมักจะบันทึกหน้าที่ของฉันและบางครั้งฉันก็ชอบใช้Informationเพื่อเตือนตัวเองเกี่ยวกับลำดับการโต้แย้ง วิธีแก้ปัญหาที่ค่อนข้างไม่น่าพอใจซึ่งฉันกำลังใช้อยู่คือการปิดใช้งานInformationสำหรับฟังก์ชันที่จัดรูปแบบโดยใช้ UpValues:

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

ด้วยวิธีนี้อย่างน้อยฉันก็สามารถเข้าถึงข้อความการใช้งานได้ แต่คำจำกัดความตัวเลือกและInformationข้อมูลอื่น ๆ ทั้งหมดไม่สามารถเข้าถึงได้โดยใช้วิธีแก้ปัญหานี้

คำตอบ

1 N0va Oct 07 2020 at 04:48

ฉันพบคำตอบสำหรับคำถามของฉันในซอร์สโค้ดของฟังก์ชันหลักของ Mathematica หลายอย่าง การใช้ฟังก์ชั่นที่เป็นประโยชน์อย่างมากGeneralUtilities`PrintDefinitionsในเช่นInterpolatingFunction(หรือฟังก์ชั่นหลักอื่น ๆ ใด ๆ ที่ใช้BoxForm` ArrangeSummaryBoxสำหรับการส่งออกการจัดรูปแบบของมัน) BoxForm`UseIconsเผยการป้องกันฟังก์ชันเคอร์เนล นี้น่าจะเป็นตัวแปรแบบไดนามิกที่เกี่ยวข้องกับการที่เป็นเท็จสำหรับกล่องที่สร้างขึ้นโดยBoxForm Informationรหัสต่อไปนี้อนุญาตให้จัดรูปแบบแบบกำหนดเองในสมุดบันทึก แต่ไม่ได้อยู่ในผลลัพธ์ของInformation(รวมถึง?และ??) และสภาพแวดล้อมอื่น ๆ ด้วยBoxForm`UseIcons=False:

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

การแนบการจัดรูปแบบที่กำหนดเองเข้ากับMakeBoxesแทนFormatและการตรวจสอบตัวแปรBoxForm`UseIconsนั้นเป็นการหลอกลวงและตอบคำถามของฉันให้เป็นที่พอใจ โซลูชันนี้เป็นทางออกที่ดีกว่าเมื่อเทียบกับคำตอบก่อนหน้าของฉันและวิธีการเลือกสำหรับฟังก์ชันหลักอย่างน้อยบางฟังก์ชันที่มีเอาต์พุตที่จัดรูปแบบแฟนซี ฉันโพสต์คำตอบใหม่นี้เนื่องจากกลยุทธ์การแก้ปัญหาแตกต่างจากข้อก่อนหน้า

เป็นที่น่าเสียดายที่ไม่มีการจัดทำเอกสารนี้ควบคู่ไปกับFormatหรือMakeBoxesหรือแม้แต่ตัวเลือกหรือค่าเริ่มต้นของฟังก์ชันเหล่านั้น

N0va Sep 18 2020 at 06:01

ฉันพบวิธีแก้ปัญหาที่ค่อนข้างเป็นไปได้ตาม UpValues ​​บนวิธีการ / สัญลักษณ์ของผู้ใช้ที่มีปัญหาเช่น:

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

ซึ่งส่งผลให้เกิดผลลัพธ์

สัญลักษณ์CMinfoถูกใช้...InformationValueForm[...]แทนCMเพื่อป้องกันการจัดรูปแบบในคำจำกัดความ ผลลัพธ์สำหรับFormatValuesยังคงอยู่ในรูปแบบดังนั้นจึงไม่ค่อยให้ข้อมูลมากนักดังนั้นฉันจึงใส่ตัวยึดแทน อาจจะด้วยการทำงานเพิ่มขึ้นอีกเล็กน้อยอาจทำให้ได้ผลFormatValuesเช่นกัน

วิธีนี้ใช้ได้ผลดีพอสำหรับฉัน แต่ฉันยังค่อนข้างไม่พอใจกับความจำเป็นของมาตรการดังกล่าว Information[...]วิธีการควรจะทำงานออกจากกล่องในฟังก์ชั่นใช้ที่ถูกต้อง ดังนั้นฉันจึงยังคงชอบเรียกความยุ่งเหยิงทั้งหมดว่าเป็นจุดบกพร่อง แต่ขอขอบคุณ @Michael E2 ที่ชี้ให้เห็นในความคิดเห็นภายใต้คำถามที่แท็ก 'bug' ต้องได้รับการตรวจสอบ ฉันไม่ได้อ่านคำอธิบายแท็กและใช้ผิด - ขออภัยด้วย

โปรดทราบว่าทั้งสองอย่างInformation[CM]และ??CMทำงานได้ตามที่ตั้งใจไว้เมื่อทำการปรับเปลี่ยน...InformationValueForm[...]ซึ่งไม่น่าแปลกใจสำหรับการแก้ไขที่ยกมาในคำถามของฉัน (การตั้งค่าCM /: Information[CM] := CM::usage)

รูปแบบการป้อนข้อมูลพิเศษ?และ??ไม่เพียง แต่พิเศษตามชื่อเท่านั้น แต่ยังพิเศษอีกด้วยเพราะพวกเขาหลีกเลี่ยง UpValues Informationซึ่งฟังดูไม่สมเหตุสมผลสำหรับฉันอีกครั้ง