Это старый вопрос, но я думаю, что есть ответ, который сочетает в себе достоинства ответа Эндрю Мойлана и ответа Велисария .Вы действительно хотите иметь списки правил с HoldPattern
слева, а не списки правил, которые Hold
обернуты вокруг всего, так что вы можете использовать правила без необходимости выполнять какие-либо действия.из ReleaseHold
процесса.
In[1]:= {a, b, c} = {1, 2, 3};
Unevaluated
также может быть полезен при создании списка, который вы хотите:
In[2]:= x = Thread[HoldPattern /@ Unevaluated[{a, b, c}] -> Range[3]]
Out[2]= {HoldPattern[a] -> 1, HoldPattern[b] -> 2, HoldPattern[c] -> 3}
Теперь вы можете делать то, что вы хотите, с заменой правил,Это немного вовлечено, но это то, что я делаю снова и снова.Вы можете заметить, что этот список правил имеет почти точно форму списка OwnValues
или DownValues
, поэтому возможность манипулировать им очень полезна.Трюк использует HoldPattern
и Verbatim
в согласовании:
In[3]:= f[rules_] :=
Replace[rules,
HoldPattern[Verbatim[HoldPattern][s_Symbol] -> rhs_] :>
With[{string = ToString[Unevaluated[s]]},
string -> rhs], {1}]
Спецификация уровня на Replace
только для того, чтобы убедиться, что ничего неожиданного не произойдет, если rhs
само правило или список правил.
In[4]:= f[x] // InputForm
Out[4]= {"a" -> 1, "b" -> 2, "c" -> 3}