Как остановить рекурсию в конструкции Format / Interpretation Mathematica? - PullRequest
10 голосов
/ 06 ноября 2010

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

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 неоднократно оценивается.Это несмотря на то, что Interpretation имеет атрибут HoldAll (который работает нормально при обычной оценке).

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

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

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


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

1 Ответ

11 голосов
/ 08 ноября 2010

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

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

Наконец, вот урок о структурах блоков.

HTH!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...