Проблемы с интерпретацией входных выражений в ячейках - PullRequest
11 голосов
/ 27 ноября 2011

Как преобразовать произвольную спецификацию блока, извлеченную из выражения ячейки, во входное выражение?

Это вызвало проблему с моим ответом на Сохранить код Mathematica в FullForm синтаксис .В этом контексте сопоставление с образцом использовалось для извлечения спецификаций блоков из выражений блокнота, прочитанных с использованием Import.

. Я думал, что ToExpression или MakeExpression выполнят работу по интерпретации блоков, но в некоторых обстоятельствахони не.

Рассмотрим входную ячейку, содержащую выражение:

StringForm["a = ``", 1]

Выражение ячейки для такой ячейки выглядит следующим образом:

Cell[BoxData[
 RowBox[{"StringForm", "[", 
  RowBox[{"\"\<a = ``\>\"", ",", " ", "1"}], "]"}]], "Input"]

Я могувозьмите из этой ячейки подвыражение BoxData и используйте ToExpression для получения того же результата, как если бы я вычислял исходную ячейку:

ToExpression @
  BoxData[
    RowBox[{"StringForm", "[", 
      RowBox[{"\"\<a = ``\>\"", ",", " ", "1"}], "]"}]]

Но теперь рассмотрим следующее входное выражение:

StringForm["<em>a</em> = ``", 1]

Вы должны внимательно посмотреть, чтобы увидеть разницу: <em>a</em> выделено курсивом.Вот соответствующее выражение ячейки:

Cell[BoxData[
 RowBox[{"StringForm", "[", 
  RowBox[{"\"\<\!\(\*
StyleBox[\"a\",
FontSlant->\"Italic\"]\) = ``\>\"", ",", " ", "1"}], "]"}]], "Input"]

Если я оцениваю эту ячейку нормально, я получаю ожидаемый результат.Но если я попытаюсь применить ToExpression к подвыражению BoxData, как раньше:

ToExpression @
  BoxData[
   RowBox[{"StringForm", "[", 
    RowBox[{"\"\<\!\(\*
  StyleBox[\"a\",
  FontSlant->\"Italic\"]\) = ``\>\"", ",", " ", "1"}], "]"}]]

, произойдет ошибка:

StringForm::string : String expected at position 1 in StringForm[]\) = '',
FontSlant->"\~\(\*\nStyleBox["a Italic, 1].

Подобный тип ошибки возникает для многих, если нетвсе, из escape-последовательностей встроенного строкового блока.Я попытался явно указать форму для ToExpression и MakeExpression, но я получаю ту же ошибку.Это подводит меня к моему вопросу ...

Что мне нужно сделать, чтобы эмулировать то, как Mathematica интерпретирует поля из выражения входной ячейки?

Ответы [ 2 ]

5 голосов
/ 27 ноября 2011

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

Clear[toExpression];
toExpression[bd_BoxData] :=
   ToExpression[bd /.
      s_String :>
         StringReplace[
            StringReplace[s, "\n" :> ""],
            ShortestMatch[(start : "\(\*") ~~ body__ ~~ (end : "\)")] :> 
                   StringJoin[start, StringReplace[body, "\"" :> "\\\""], end]
         ]
   ];

Например, мы начнем с вашего случая:

In[747]:= 
 BoxData["\"\<\!\(\*
    StyleBox[\"a\",
       FontSlant->\"Italic\"]\) = ``\>\""]//toExpression

Out[747]= a = ``

Если мы сейчас рассмотрим ячейку, то это:

BoxData["\<\"\\!\\(\\*StyleBox[\\\"a\\\",FontSlant->\\\"Italic\\\"]\\)\ = ``\"\>"]

вместо

BoxData["\"\<\!\(\*StyleBox[\"a\",FontSlant->\"Italic\"]\) = ``\>\""]

(который является исходным с удаленными символами новой строки). И я бы сказал, что так и должно было быть с самого начала. Сейчас:

In[746]:= ToExpression@
   BoxData["\<\"\\!\\(\\*StyleBox[\\\"a\\\",FontSlant->\\\"Italic\\\"]\\) = ``\"\>"]

Out[746]= a = ``

Так что это уже отлично работает.

Я не знаю, насколько универсален этот обходной путь, но, похоже, он работает для примеров, которые я пробовал. Основная проблема заключалась в том, что при «строковании» таких вещей, как a и Italic, это должны были быть \\\"a\\\" и \\\"Italic\\\", а не \"a\" и \"Italic\" - побеги для побегов сами по себе отсутствовали.

2 голосов
/ 27 ноября 2011

Честно говоря, я не уверен, что вы пытаетесь сделать, но я подозреваю, что вам нужно будет использовать сам FrontEnd для обработки. Вот общий пример:

FrontEndExecute@FrontEnd`CellPrint[
  BoxData[RowBox[{"StringForm", "[", RowBox[{"\"\<\!\(\*
         StyleBox[\"a\",
         FontSlant->\"Italic\"]\) = ``\>\"", ",", " ", "1"}], "]"}]]
]

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

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