这是我目前解决问题的方案,但正如问题中提到的那样,它并不严格寻找无模式
DownValues
,也不太优雅。
请存储
f
的
DownValues
。
In[6]:= dv = DownValues[f]
Out[6]= {HoldPattern[f[1]] :> 3, HoldPattern[f[x_]] :> (f[x] = x + a)}
在Block
中查找需要清除的DownValues
以避免立即求值。
In[7]:= dv2clear = Block[{f},
Hold@Evaluate@Cases[dv,
HoldPattern[f[args__ /; Apply[And, NumericQ /@ Flatten[{args}]]]], {3}]]
Out[7]= Hold[{f[1]}]
将Unset
应用于保持的列表中的目标DownValues
,然后释放。
In[8]:= Map[Unset, dv2clear, {2}]
ReleaseHold@%
Out[8]= Hold[{(f[1]) =.}]
这个很好用
In[10]:= DownValues[f]
Out[10]= {HoldPattern[f[x_]] :> (f[x] = x + a)}
可以这样包装起来:
ClearCache[f_] := Module[{dv, dv2clear},
(* Cache downvalues for use inside block *)
dv = DownValues[f];
(* Find the downvalues to clear in Block to avoid immediate evaluation *)
dv2clear = Block[{f},Hold@Evaluate@Cases[dv,HoldPattern[
f[args__ /; Apply[And, NumericQ /@ Flatten[{args}]]]], {3}]];
(* Apply Unset to the terms inside the held list and then release *)
ReleaseHold@Map[Unset, dv2clear, {2}];]