Как остановить рекурсию в конструкции Mathematica Format/Interpretation?

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

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

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

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

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

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

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

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


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

Ответ 1

Я проконсультировался с коллегой по этому поводу, и его рекомендация заключалась в том, что определение значения ценности MakeBoxes по сравнению с использованием Format лучше, чем использование Format, когда вы хотите, чтобы все было тесно интегрировано с выхода обратно на вход. Format на самом деле не предназначен для вывода вывода, который может быть повторно использован в качестве входных данных, а просто для форматирования вывода, поэтому неожиданная рекурсия с Interpretation при преобразовании в StandardForm и т.д.

Вы можете найти функцию ToBoxes полезным дополнением к MakeBoxes.

Наконец, здесь учебник о структурах ящиков.

НТН!