Как остановить рекурсию в конструкции 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
.
Наконец, здесь учебник о структурах ящиков.
НТН!