Mathematica: установить значение по умолчанию для аргумента непостоянным?

Могу ли я установить значение по умолчанию для аргумента функции как нечто что не константа? Пример:

tod := Mod[AbsoluteTime[], 86400] 
f[x_:tod] := x    

В приведенном выше случае "tod" изменяется каждый раз, когда я его оцениваю, но "f []" делает не. "? f" дает:

f[x_:42054.435657`11.376386798562935] := x 

показывающее значение по умолчанию, было жестко запрограммировано, когда я создал функцию.

Есть ли способ обхода?

Ответ 1

Кажется, что работает, если функция содержит свои аргументы:

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

В [23]: = f []

Out [23] = 47628.994048

В [24]: = f []

Выход [24] = 47629.048193

Или вместо значения по умолчанию вы можете использовать следующую конструкцию:

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

В [27]: = g []

Out [27] = 47706.496195

В [28]: = g []

Out [28] = 47707.842012

Ответ 2

Я рекомендую это:

f[] := f[Mod[AbsoluteTime[], 86400]]
f[x_] := x

Или, что эквивалентно, это:

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