Yar*_*tov 18 wolfram-mathematica
有没有一种简单的方法来检查是否有x的定义?我需要一个带有某种形式的函数f
,f[_]
或者如果有它的定义则f[_][_]
返回True
要真正具体,我使用f [x] = b和g [x] [y] = z等构造存储东西,我需要检查f [x]是否对某些列表中的每个x都有定义,如果g [x] [y]在某些值集中对每个x,y都有一个定义
Leo*_*rin 22
实际上,ValueQ函数并不是无辜的,因为它泄漏了对具有副作用的代码的评估.例子:
ClearAll[f, g];
f[x_] := Print[x];
g[x_][0] := Print[x];
{ValueQ[f[1]],ValueQ[g[2][0]]}
Run Code Online (Sandbox Code Playgroud)
如果删除ValueQ的ReadProtected属性并查看代码,您将看到原因 - 代码非常简单,只为OwnValues做了不错的工作.这是一个更复杂的版本,我开发以避免这个问题(你可以测试,至少对于上面的例子,它不会泄漏评估):
ClearAll[symbolicHead];
SetAttributes[symbolicHead, HoldAllComplete];
symbolicHead[f_Symbol[___]] := f;
symbolicHead[f_[___]] := symbolicHead[f];
symbolicHead[f_] := Head[Unevaluated[f]];
ClearAll[partialEval];
SetAttributes[partialEval, HoldAllComplete];
partialEval[a_Symbol] /; OwnValues[a] =!= {} :=
Unevaluated[partialEval[a]] /. OwnValues[a];
partialEval[a : f_Symbol[___]] /; DownValues[f] =!= {} :=
With[{dv = DownValues[f]},
With[{eval = Hold[partialEval[a]] /. dv},
ReleaseHold[eval] /;
(First[Extract[eval, {{1, 1}}, HoldComplete]] =!=
HoldComplete[a])]];
partialEval[a_] :=
With[{sub = SubValues[Evaluate[symbolicHead[a]]]},
With[{eval = Hold[partialEval[a]] /. sub},
ReleaseHold[eval] /;
(First[Extract[eval, {{1, 1}}, HoldComplete]] =!=
HoldComplete[a])]];
ClearAll[valueQ];
SetAttributes[valueQ, HoldAllComplete];
valueQ[expr_] := partialEval[expr] =!= Unevaluated[partialEval[expr]];
Run Code Online (Sandbox Code Playgroud)
这也不完整,因为它没有考虑UpValues,NValues和FormatValues,但这似乎足以满足您的需求,而且,这三个额外案例的规则也可能与上面相同的行添加.
dbj*_*ohn 16
如果我理解正确,我认为这个功能ValueQ
正是你要找的.如果定义了变量或函数,它将返回true,如果尚未定义,则返回false.
更多信息,请访问http://reference.wolfram.com/mathematica/ref/ValueQ.html
归档时间: |
|
查看次数: |
7774 次 |
最近记录: |