Wolfram mathematica 使用ToExpression[]将字符串转换为表达式时,如何防止计算结果?
我有以下字符串:Wolfram mathematica 使用ToExpression[]将字符串转换为表达式时,如何防止计算结果?,wolfram-mathematica,Wolfram Mathematica,我有以下字符串: "{f[{-1 + x, y}]; f[{1 + x, y}]; f[{x, 1 + y}]}" 我想把它转换成表达式。直接应用ToExpression只给出最后一个,即{f[{x,1+y}}。如何获取整个列表?您可以查看ToExpression的文档,找到它的第三个参数,并使用 ToExpression["{f[{-1 + x, y}]; f[{1 + x, y}]; f[{x, 1 + y}]}", InputForm, Hold] 防止评估 几个转换表达式或提取部分的
"{f[{-1 + x, y}]; f[{1 + x, y}]; f[{x, 1 + y}]}"
我想把它转换成表达式。直接应用
ToExpression
只给出最后一个,即{f[{x,1+y}}
。如何获取整个列表?您可以查看ToExpression
的文档,找到它的第三个参数,并使用
ToExpression["{f[{-1 + x, y}]; f[{1 + x, y}]; f[{x, 1 + y}]}", InputForm, Hold]
防止评估
几个转换表达式或提取部分的函数(提取
,级别
,等等)可以选择将提取的部分包装到任意函数中。一个常见的用法是将它们包装在Hold
中,以防止计算
编辑:请注意,您的表达式不是列表。这是一个
复合表达式
。你可能在找
ToExpression["{f[{-1 + x, y}]; f[{1 + x, y}]; f[{x, 1 + y}]}", InputForm, Hold] /. CompoundExpression -> List // ReleaseHold
你能解释一下你想要达到什么目的,以及字符串是从哪里来的吗?实际上
ToExpression
正在将整个字符串转换成你所期望的表达式。在下面的示例中
In[1]:= ToExpression["a=1;b=2"]
Out[1]= 2
In[2]:= a
Out[2]= 1
您可以看到,第一部分a=1
作为复合表达式的一部分得到了正确的计算
您可能需要将用分号分隔的表达式转换为表达式列表。您可以使用StringSplit进行以下操作:
In[3]:= ToExpressionList[s_String] := ToExpression /@ StringSplit[s, ";"]
In[4]:= ToExpressionList["x;y"]
Out[4]= {x,y}
编辑:
看起来您正试图使用分号作为列表
分隔符。在Mathematica中,必须使用,
来进行此操作。因此
也可以通过将,
替换为,实现您想要的功能代码>输入
输入字符串,然后应用进行表达式
:
In[20] := ToExpression @
StringReplace[
"{f[{-1 + x, y}]; f[{1 + x, y}]; f[{x, 1 + y}]}",
";" -> ","
]
Out[20] = {f({x-1,y}),f({x+1,y}),f({x,y+1})}
但是,我确实想保留
afterToExpression
ok,现在我明白了!然后我误解了你的问题。Szabolcs当时给出了正确的答案。我必须指出,在这种上下文中使用字符串通常是脆弱的,尤其是在这种情况下。分号也是/的一部分
(Condition
)操作符,具有明显的后果。在我这样做之后,我在表达式前面得到了Hold
。在这之后如何摆脱束缚?使用Apply
?当要计算表达式时,使用ReleaseHold
删除保持。或者,使用HoldForm
而不是Hold
——这类似于Hold,但不显示。@littleEinstein如果你去掉Hold
,表达式将求值,你将再次得到{f[{x,1+y}}
。我想你可能对有误解代码>是。请告诉我们你想要实现什么。我想要实现的是从字符串“{f[{-1+x,y}];f[{1+x,y}];f[{x,1+y}]}”
到表达式{f[{-1+x,y}];f[{1+x,y}];f[{x,1+y}
。我正在写一些计算机生成的数学code@littleEinstein如果您生成代码,使用Hold表达式(Hold
)可能比使用字符串更好。