gpt4 book ai didi

wolfram-mathematica - 解释输入单元格框表达式的问题

转载 作者:行者123 更新时间:2023-12-04 02:17:42 24 4
gpt4 key购买 nike

如何将从单元表达式中提取的任意框规范转换为输入表达式?

这是我对 Save Mathematica code in FullForm syntax 的回答的一个问题。 .在这种情况下,模式匹配被用于从使用 Import 读取的笔记本表达式中提取框规范。 .

我以为ToExpressionMakeExpression会做盒子解释的工作,但在某些情况下他们不会。

考虑一个包含表达式的输入单元格:

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"]

如果我正常评估这个单元格,我会得到预期的结果。但是如果我尝试申请 ToExpressionBoxData子表达式像以前一样:
ToExpression @
BoxData[
RowBox[{"StringForm", "[",
RowBox[{"\"\<\!\(\*
StyleBox[\"a\",
FontSlant->\"Italic\"]\) = ``\>\"", ",", " ", "1"}], "]"}]]

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

许多(如果不是全部)内联字符串框转义序列都会发生相同类型的错误。我已经尝试将表单明确指定为 ToExpressionMakeExpression ,但我得到了同样的错误。这让我想到了我的问题......

我该怎么做才能模拟 Mathematica 从输入单元表达式中解释框的方式?

最佳答案

我认为这是一个错误。这是一个适用于我测试的几个示例的解决方法:

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\" - 逃生本身的逃生失踪了。

关于wolfram-mathematica - 解释输入单元格框表达式的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8283256/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com