При преобразовании строки в выражение с помощью ToExpression [], как предотвратить оценку результата? - PullRequest
4 голосов
/ 31 декабря 2011

У меня есть следующая строка:

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

И я хочу преобразовать это в выражение (я). Непосредственное применение ToExpression дает только последний, т.е. {f[{x, 1 + y}]}. Как получить весь список?

Ответы [ 2 ]

8 голосов
/ 31 декабря 2011

Вы можете проверить документацию ToExpression, чтобы найти 3-й аргумент, и использовать

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

, чтобы предотвратить оценку.

Несколько функций, которые либо преобразуют выражения, либо извлекают части (Extract, Level и т. Д.) Имеют возможность обернуть извлеченную деталь в произвольную функцию.Обычное использование заключается в том, чтобы обернуть их в Hold, предотвращая оценку.


РЕДАКТИРОВАТЬ: Обратите внимание, что ваше выражение не список.Это CompoundExpression.Возможно, вы ищете

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

Можете ли вы объяснить, чего вы пытаетесь достичь и откуда вы взяли строку?

1 голос
/ 31 декабря 2011

На самом деле 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})}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...