Thông tin / Thông tin`InformationValueForm sử dụng Full- hoặc InputForm
Tôi gặp sự cố với Informationhàm tích hợp cho các ký hiệu do người dùng xác định với StandardForm tùy chỉnh trong Mathematica 12.1.1.0:
Ví dụ với các định nghĩa hàm
ClearAll[CM];
CM[1, a__] := CM[a]
CM /: Format[CM[a_, b___], StandardForm] := Row[{a, b}, " "]
CM::usage = "CM";
Information[CM]kết quả truy vấn là :
Các định nghĩa trong đầu ra được định dạng bằng StandardForm mà thậm chí không hiển thị chính xác. Vấn đề tương tự xảy ra khi người ta định nghĩa UpValues . Tại thời điểm này, hộp Thông tin chỉ không thể đọc được nhưng nó trở nên tồi tệ hơn khi sử dụng InterpretationBox. Với
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";
Một lệnh gọi dẫn đến Information[CM]một đệ quy vô hạn và một số cảnh báo và lỗi:
Kiểm tra FullFormkết quả của Information[CM]tiết lộ
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]]]]],
...
]]
và cùng với nó là chức năng nội bộ và dĩ nhiên là không có tài liệu ...InformationValueFormđược sử dụng để xuất ra các định nghĩa tìm được.
Có cách nào để cấu hình hoặc thao tác Informationhoặc cơ bản InformationValueFormđể hiển thị các định nghĩa chức năng bằng Full- hoặc InputForm không? Tôi đã có thể thao tác đầu ra FullForm bằng cách chuyển đổi các đối số của RuleDelayedbên trong InformationValueFormthành Chuỗi nhưng tôi không thể đính kèm bản sửa lỗi này vào Informationhoặc InformationValueForm.
Tôi không hiểu quyết định thiết kế đằng sau việc sử dụng StandardForm trong đầu ra của các Informationchức năng do người dùng xác định và toàn bộ tình huống về cơ bản là một lỗi theo quan điểm của tôi. Vấn đề thực sự là các lỗi đệ quy vô hạn và lỗi đối với các hàm định dạng liên quan nhiều hơn có thể làm hỏng nhân và / hoặc giao diện người dùng. Tôi có xu hướng ghi lại các chức năng của mình và đôi khi tôi thích sử dụng Informationđể nhắc nhở bản thân về thứ tự đối số. Cách giải quyết khá không hài lòng mà tôi hiện đang sử dụng là tắt Informationcác chức năng được định dạng của tôi bằng cách sử dụng UpValues:
CM /: Information[CM, opts___] := CM::usage;
Bằng cách này, ít nhất tôi có quyền truy cập vào thông báo sử dụng nhưng các định nghĩa, tùy chọn và tất cả dữ liệu-dữ liệu khác Informationkhông thể truy cập được bằng cách sử dụng giải pháp này.
Trả lời
Tôi đã tìm thấy câu trả lời cho câu hỏi của mình trong mã nguồn của một số hàm cốt lõi của Mathematica. Việc sử dụng hàm vô cùng hữu ích GeneralUtilities`PrintDefinitionstrên ví dụ InterpolatingFunction(hoặc bất kỳ hàm cốt lõi nào khác sử dụng BoxForm` ArrangeSummaryBoxcho đầu ra được định dạng của nó) cho thấy hàm / biến hạt nhân được bảo vệ BoxForm`UseIcons. Đây dường như là một biến động liên quan đến biến BoxFormnày sai đối với các hộp được tạo bởi Information. Đoạn mã sau cho phép định dạng tùy chỉnh trong sổ ghi chép nhưng không cho phép định dạng trong Information(bao gồm ?và ??) và các môi trường khác với BoxForm`UseIcons=False:
MakeBoxes[..., StandartForm] /; BoxForm`UseIcons := ...
Việc đính kèm định dạng tùy chỉnh MakeBoxesthay vì Formatvà kiểm tra biến BoxForm`UseIconsthực hiện mẹo và trả lời câu hỏi của tôi để tôi hài lòng. Giải pháp này cho đến nay là giải pháp tốt hơn so với câu trả lời trước đây của tôi và là phương pháp lựa chọn cho ít nhất một số chức năng cốt lõi với đầu ra được định dạng lạ mắt. Tôi đã đăng một câu trả lời mới này vì chiến lược giải pháp khác với chiến lược trước đó.
Đó là một điều đáng tiếc rằng đây không phải là tài liệu bên cạnh Formathoặc MakeBoxeshoặc thậm chí là một lựa chọn hay mặc định của các chức năng.
Tôi đã tìm thấy một giải pháp khả thi dựa trên UpValues dựa trên các phương pháp / biểu tượng người dùng có vấn đề, ví dụ:
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";
kết quả là đầu ra
Biểu tượng CMinfođược sử dụng ...InformationValueForm[...]thay vì CMđể ngăn định dạng trong các định nghĩa. Đầu ra cho FormatValuesvẫn được định dạng và do đó không có nhiều thông tin nên tôi đã chèn trình giữ chỗ để thay thế. Có thể với nhiều công việc hơn một chút, người ta cũng có thể làm được FormatValuesviệc.
Cách tiếp cận này hoạt động đủ tốt đối với tôi nhưng tôi vẫn không hài lòng với sự cần thiết của các biện pháp như vậy. Các Information[...]phương pháp nên làm việc ra khỏi hộp trên hàm do người dùng hợp lệ. Vì vậy, tôi vẫn ủng hộ việc gọi toàn bộ mớ hỗn độn là một lỗi nhưng cảm ơn bạn @Michael E2 đã chỉ ra trong phần nhận xét dưới câu hỏi rằng thẻ 'lỗi' yêu cầu kiểm tra. Tôi đã không đọc mô tả thẻ và sử dụng nó sai - xin lỗi vì điều đó.
Lưu ý rằng cả hai Information[CM]và ??CMhoạt động như dự định khi sửa đổi ...InformationValueForm[...], điều này tuyệt nhiên không phải là trường hợp sửa chữa được đưa ra trong câu hỏi của tôi (cài đặt CM /: Information[CM] := CM::usage).
Các biểu mẫu đầu vào đặc biệt ?và ??không chỉ đặc biệt theo tên mà còn đặc biệt bởi vì chúng vượt qua UpValues Informationmà một lần nữa nghe có vẻ rất phi lý đối với tôi.