Проблемы с интерпретацией выражений поля ячеек ввода

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

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

11
задан Community 23 May 2017 в 12:27
поделиться