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的错误都会变得明显.)
| 归档时间: |
|
| 查看次数: |
297 次 |
| 最近记录: |