使用`With`和`Rules`列表 - 但不影响`With`的正常行为

Sim*_*mon 6 wolfram-mathematica

说我有一个清单 Rules

rules = {a -> b, c -> d};
Run Code Online (Sandbox Code Playgroud)

我在整个笔记本中使用它.然后,在某一点上,在表达式中进行任何其他评估之前,希望应用规则是有意义.通常,如果你想要这样的东西,你会使用

In[2]:= With[{a=b,c=d}, expr[a,b,c,d]]
Out[2]= expr[b, b, d, d]
Run Code Online (Sandbox Code Playgroud)

我怎样才能把rules它插入到第一个参数中With


编辑

无论一些解决方案未能尽我一直在寻找-但我应该强调了这一点多一点.见上面的粗体部分.

例如,让我们来看看

rules = {a -> {1, 2}, c -> 1};
Run Code Online (Sandbox Code Playgroud)

如果我使用这些vaules With,我会得到

In[10]:= With[{a={1,2},c=1}, Head/@{a,c}]
Out[10]= {List,Integer}
Run Code Online (Sandbox Code Playgroud)

某些版本的WithRules收益率

In[11]:= WithRules[rules, Head/@{a,c}]
Out[11]= {Symbol, Symbol}
Run Code Online (Sandbox Code Playgroud)

(实际上,我没有注意到Andrew的答案有属性HoldRest- 所以它就像我想要的那样.)

And*_*lan 11

您想使用Hold来构建With语句.这是一种方式; 可能有一个更简单的:

In[1]:= SetAttributes[WithRules, HoldRest]

In[2]:= WithRules[rules_, expr_] := 
 With @@ Append[Apply[Set, Hold@rules, {2}], Unevaluated[expr]]
Run Code Online (Sandbox Code Playgroud)

测试出来:

In[3]:= f[args___] := Print[{args}]

In[4]:= rules = {a -> b, c -> d};

In[5]:= WithRules[rules, f[a, c]]

During evaluation of In[5]:= {b,d}
Run Code Online (Sandbox Code Playgroud)

(我使用Print,以便任何涉及我过早意外评估expr的错误都会变得明显.)