Как преобразовать произвольную спецификацию окна, извлеченную из выражения ячейки, в входное выражение?
Это вызвало проблему с моим ответом на Сохранить код 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["a = ``", 1]
Вам нужно будет внимательно посмотреть на разницу: a
выделен курсивом. Вот соответствующее выражение ячейки:
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 интерпретирует ящики из выражения входных ячеек?