Как остановить рекурсию происходит в конструкции формата / интерпретации Mathematica?

Этот вопрос следует из ответа Майкла Пилата в Preventing») Плюс »от перестановки . Там он определил специальную нотацию + , используя

Format[myPlus[expr__]] := Row[Riffle[{expr}, "+"]]

. Проблема в том, что вы не можете скопировать и вставить вывод (хотя% или Out [] по-прежнему работают). Чтобы обойти это, вы должны использовать средство типа Interpretation , которое позволяет отображать выражение как одно, но интерпретировать как другое при вводе. Моя модификация ответа Майкла:

Format[myPlus[expr__]] := Interpretation[Row[{expr}, "+"], myPlus[expr]]

Это можно успешно скопировать и вставить. Проблема заключается в изменении скопированных выражений. Вы можете преобразовать скопированное выражение обратно в InputForm с помощью Ctrl-Shift-I , затем изменить все, что хотите, и использовать InputForm в любом выражении. Но , если вы попытаетесь изменить его обратно на StandardForm с помощью Ctrl-Shift-N , то вы введете рекурсию, где второй аргумент в Interpretation повторно оценивается. И это несмотря на то, что Интерпретация имеет атрибут HoldAll (который правильно работает при нормальной оценке).

Обычно при определении простых обозначений я использую низкоуровневые MakeBoxes , например

myPlus/:MakeBoxes[myPlus[expr__],fmt_]:=With[{r=Riffle[MakeBoxes/@{expr},"+"]},
   InterpretationBox[RowBox[r],myPlus[expr]]]

, который отлично работает, поэтому я раньше не сталкивался с этой проблемой рекурсии.


Итак, мой вопрос (наконец): Что пошло не так с моей командой типа Format и как это исправить? Или: Как сделать высокоуровневый эквивалент моей команды типа MakeBoxes ?

10
задан Community 23 May 2017 в 11:45
поделиться