对我来说,g /: f[g[x_]] := h[x]只是冗长等同于f[g[x_]] := h[x].你能提出一个你必须使用的例子/:吗?
在最近的SO问题中,提供了三个不同的答案,每个答案使用不同的方法来防止Equal[]表达的评估.他们是
Defer[]Unevaluated[]HoldForm[]有时我仍然无法在这些选项之间进行选择(并且根据前面提到的问题的答案判断,对于其他人来说,选择并不总是清楚的).有人能否就这三种方法的使用写清楚的说明?
还有其他三个包装
Hold[],
HoldPattern[],
HoldComplete[],和各种Attributes的功能
HoldAll,HoldFirst,HoldRest和数字版本,NHold*即也可以讨论,如果你想!
我只是注意到这基本上是旧问题的重复(我已经投了很多,只是忘了...).在1999年Mathematica开发者大会上,这个讲话被接受的答案Defer与之相关,因为它是"6中的新人".Defer与其他评估控制机制相比,它与前端的联系更紧密.它用于创建未评估的输出,如果提供和Input表达式,将对其进行评估.引用文档中心:
Defer [expr]返回一个保持不变的对象,直到它作为Mathematica输入显式提供,并使用Shift + Enter,就地评估等进行评估.
对于已经分配了与名称"a"关联的DownValues的情况,是否有可接受的方法来阻止将OwnValues分配为相同的名称?(我最初在玩某人试图实现数据字典的时候遇到过这个问题.)
这就是我要避免的意思:
Remove[a];
a[1] := somethingDelayed
a[2] = somethingImmediate;
DownValues[a]
a[1]
a[2]
Run Code Online (Sandbox Code Playgroud)
返回...
{HoldPattern[a[1]] :> somethingDelayed,
HoldPattern[a[2]] :> somethingImmediate}
somethingDelayed
somethingImmediate
Run Code Online (Sandbox Code Playgroud)
现在,如果我们要评估:
a = somethingThatScrewsUpHeads;
(* OwnValues[a] above stored in OwnValues *)
a[1]
a[2]
Run Code Online (Sandbox Code Playgroud)
我们得到......
somethingThatScrewsUpHeads[1]
somethingThatScrewsUpHeads[2]
Run Code Online (Sandbox Code Playgroud)
是否有一种简单/灵活的方法来防止DownValues中任何名称的OwnValues?(Lemme猜测......这是可能的,但会有性能受损吗?)