Как преобразовать произвольную спецификацию блока, извлеченную из выражения ячейки, во входное выражение?
Это вызвало проблему с моим ответом на Сохранить код 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 интерпретирует поля из выражения входной ячейки?