Как преобразовать произвольную спецификацию блока, извлеченную из выражения ячейки, во входное выражение?
Это возникло как проблема с моим ответом на Сохранить код Mathematica в FullForm
синтаксис . В этом контексте сопоставление с образцом использовалось для извлечения спецификаций блока из выражений записной книжки, считываемых с помощью Import
.
Я думал, что ToExpression
или MakeExpression
будут выполнять работу по интерпретации блоков, но в некоторых случаях они этого не делают.
Рассмотрим входную ячейку, которая содержит выражение:
StringForm["a = ``", 1]
Выражение ячейки для такой ячейки выглядит следующим образом:
Cell[BoxData[
RowBox[{"StringForm", "[",
RowBox[{"\"\\"", ",", " ", "1"}], "]"}]], "Input"]
Я могу взять подвыражение BoxData
из этой ячейки и использовать ToExpression
, чтобы получить такой же результат, как если бы я оценивал исходную ячейку:
ToExpression @
BoxData[
RowBox[{"StringForm", "[",
RowBox[{"\"\\"", ",", " ", "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 интерпретирует поля из выражения входной ячейки?