2010-11-06 33 views
10

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?

+0

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

+0

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. –

+0

@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

Trả lời

11

Tôi đã tham khảo ý kiến ​​của một đồng nghiệp về vấn đề này và đề xuất của anh ấy về cơ bản là đưa ra định nghĩa giá trị trên MakeBoxes khi bạn chứng minh là tốt hơn sử dụng Format khi bạn muốn mọi thứ được tích hợp chặt chẽ từ đầu ra trở lại đầu vào. Format là không thực sự có ý định để sản xuất ra có thể được tái sử dụng như đầu vào, nhưng chỉ để định dạng đầu ra, vì thế mà đệ quy bất ngờ với Interpretation khi chuyển sang StandardForm vv

Bạn có thể tìm thấy chức năng ToBoxes một bổ sung hữu ích đến MakeBoxes.

Cuối cùng, here's a tutorial về cấu trúc hộp.

HTH!

+0

Cảm ơn Michael. Điều kỳ lạ là công trình xây dựng tốt trừ khi bạn "đánh giá tại chỗ". Một nhân viên hỗ trợ tại WRI đã gửi báo cáo lỗi cho tôi. Bây giờ, tôi sẽ tiếp tục sử dụng 'MakeBoxes' (và' ToBoxes'). – Simon

Các vấn đề liên quan