检查是否定义了符号

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