Wolfram mathematica Mathematica:将参数的默认值设置为非恒定值?

Wolfram mathematica Mathematica:将参数的默认值设置为非恒定值?,wolfram-mathematica,default-value,Wolfram Mathematica,Default Value,我可以将函数参数的默认值设置为 这不是常数吗?例如: tod := Mod[AbsoluteTime[], 86400] f[x_:tod] := x 在上面的例子中,“tod”在我每次计算它时都会改变,但“f[]”会改变 不“f”收益率: 显示默认值是在我创建函数时硬编码的 这里有解决办法吗 如果函数保持其参数,它似乎可以工作: tod := Mod[AbsoluteTime[], 86400] SetAttributes[f, HoldAll]; f[x_: tod] := x

我可以将函数参数的默认值设置为 这不是常数吗?例如:

tod := Mod[AbsoluteTime[], 86400] 
f[x_:tod] := x    
在上面的例子中,“tod”在我每次计算它时都会改变,但“f[]”会改变 不“f”收益率:

显示默认值是在我创建函数时硬编码的


这里有解决办法吗

如果函数保持其参数,它似乎可以工作:

tod := Mod[AbsoluteTime[], 86400]
SetAttributes[f, HoldAll];
f[x_: tod] := x
在[23]:=f[]

Out[23]=47628.994048

在[24]:=f[]

Out[24]=47629.048193

或者,您可以使用如下构造,而不是默认值:

g[] := g[Mod[AbsoluteTime[], 86400]]
g[x_] := x
在[27]:=g[]

Out[27]=47706.496195

在[28]:=g[]

Out[28]=47707.842012我建议:

f[] := f[Mod[AbsoluteTime[], 86400]]
f[x_] := x
或等效地,这是:

f[x_:Null] := With[{x0 = If[x===Null, Mod[AbsoluteTime[], 86400], x]},
  x0]

@布雷特:看起来您的解决方案可以修改,以消除保留属性的必要性。重要的是,当定义f时,系统不知道tod是什么。因此,我们可以在f之后定义tod,也可以使用Block[{tod},f[x_:tod]:=x]谢谢!霍德尔正是我需要的。实际上,我已经考虑过你的第二种方法,但我希望找到一种不涉及修改原始函数的解决方案。Leonid,你是对的——颠倒这两个语句就是我想要的。然而,我很确定这是一个错误。因为这两个语句都是“:”(而不是“=”),它们的赋值顺序应该无关紧要。@barrycarter:忘了提到另一个微妙的点:如果我们不知道SetDelayed的策略,上面的行为可能仍然看起来很奇怪,也就是说,在像f[g[x,y]]这样的赋值中:=rhs,f和x,y都会被计算,而g[x,y]则不会。这在很多情况下都是合理的,比如i=1;q[i]=2;(我在这里评估),但在上述情况下,它会咬我们。这是一个设计决策,不能从Mathematica的“评估第一原则”中得出。如果SetDelayed没有评估更深层次的子部分,那么对于这种特殊情况,我们就不会有任何问题(但对于其他情况,可能会有更严重的问题)@Leonid:重新排序定义将有效,只要代码只评估一次,因此比我希望使用的更脆弱。当然,我经常使用Workbench,每当我保存更改时,它都会重新加载代码,所以我对这类事情有点敏感。在代码确实需要按特定顺序的情况下,我使用ClearAll从干净状态开始。
f[x_:Null] := With[{x0 = If[x===Null, Mod[AbsoluteTime[], 86400], x]},
  x0]