Câu hỏi này dựa trên câu trả lời của Michael Pilat trong Preventing “Plus” from rearranging things. Ở đó, ông đã xác định một tùy chỉnh +
ký hiệu sử dụngLàm thế nào để dừng việc đệ quy xảy ra trong một cấu trúc Mathematica Định dạng/Giải thích?
Vấn đề ở đây là bạn không thể sao chép và dán đầu ra (mặc dù% hoặc Out [] vẫn hoạt động). Để giải quyết vấn đề này, bạn nên sử dụng cơ sở loại Interpretation
cho phép biểu thức được hiển thị dưới dạng một thứ, nhưng được hiểu là biểu thức khác khi được cung cấp làm đầu vào. Việc sửa đổi câu trả lời của Michael là
Format[myPlus[expr__]] := Interpretation[Row[{expr}, "+"], myPlus[expr]]
Điều này có thể được sao chép và dán thành công. Vấn đề nằm trong việc sửa đổi các biểu thức đã sao chép. Bạn có thể chuyển đổi một biểu thức đã sao chép về InputForm
bằng cách sử dụng Ctrl-Shift-I
rồi thay đổi bất kỳ điều gì bạn muốn và sử dụng InputForm
trong bất kỳ biểu thức nào. Nhưng nếu bạn cố gắng đổi lại thành StandardForm
bằng cách sử dụng Ctrl-Shift-N
thì bạn nhập một đệ quy trong đó đối số thứ hai trong số Interpretation
nhiều lần được đánh giá. Điều này là mặc dù Interpretation
có thuộc tính HoldAll
(hoạt động bình thường trong khi đánh giá bình thường).
Thông thường, khi xác định các ký hiệu đơn giản tôi sử dụng ở mức độ thấp MakeBoxes
, ví dụ:
myPlus/:MakeBoxes[myPlus[expr__],fmt_]:=With[{r=Riffle[MakeBoxes/@{expr},"+"]},
InterpretationBox[RowBox[r],myPlus[expr]]]
mà hoạt động hoàn hảo, vì vậy tôi đã không gặp phải vấn đề đệ quy này trước đây.
Vì vậy, câu hỏi của tôi (cuối cùng) là: gì đã xảy ra với Format
loại lệnh của tôi và làm thế nào nó có thể bằng cách cố định? Hoặc: Làm thế nào để bạn thực hiện một mức tương đương cao của lệnh loại MakeBoxes
của tôi?
BTW, vì Giải thích hoạt động tốt trong quá trình đánh giá bình thường, đây có thể chỉ là lỗi với đánh giá kiểu "Chuyển đổi thành" ... – Simon
Không thể sao chép trên M'ma 7.0.1/Linux AMD64. Đã thử biểu thức Giải thích [] của bạn là "myPlus [a, b, c]". Chuyển đổi qua lại mà không gặp bất kỳ khó khăn nào. –
@Eric Đó là cùng một phiên bản và hệ thống tôi đang chạy. Tôi đã gửi một báo cáo lỗi cho WRI để xem liệu họ có tạo lại hành vi hay không. – Simon