使用ToExpression []将字符串转换为表达式时,如何防止评估结果?

时间:2011-12-31 18:03:37

标签: wolfram-mathematica

我有以下字符串:

"{f[{-1 + x, y}]; f[{1 + x, y}]; f[{x, 1 + y}]}"

我想将其转换为表达式。直接申请ToExpression仅提供最后一个,即{f[{x, 1 + y}]}。如何获得整个列表?

2 个答案:

答案 0 :(得分:8)

您可以查看ToExpression的文档以查找其第三个参数,并使用

ToExpression["{f[{-1 + x, y}]; f[{1 + x, y}]; f[{x, 1 + y}]}", InputForm, Hold]

以防止评估。

转换表达式或提取部分(ExtractLevel等)的几个函数可以选择将提取的部分包装在任意函数中。常见的用法是将它们包装在Hold中,以防止评估。


编辑:请注意,您的表达式不是列表。这是一个CompoundExpression。您可能正在寻找

ToExpression["{f[{-1 + x, y}]; f[{1 + x, y}]; f[{x, 1 + y}]}", InputForm, Hold] /. CompoundExpression -> List // ReleaseHold

你能解释一下你想要实现的目标以及从哪里获得字符串吗?

答案 1 :(得分:1)

实际上ToExpression正在将整个字符串转换为您期望的表达式。在以下示例中

In[1]:= ToExpression["a=1;b=2"]
Out[1]= 2

In[2]:= a
Out[2]= 1

您可以看到第一部分a=1被正确评估为CompoundExpression的一部分。

您可能想要的是将由分号分隔的表达式转换为表达式列表。你可以使用StringSplit:

In[3]:= ToExpressionList[s_String] := ToExpression /@ StringSplit[s, ";"]

In[4]:= ToExpressionList["x;y"]
Out[4]= {x,y}

修改: 看起来您正在尝试使用分号作为列表 在Mathematica中,你必须使用,。所以你 也可以用,代替;来实现你想要的 您的字符串,然后再应用ToExpression

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})}