列出所有全局变量

时间:2011-07-18 00:03:32

标签: wolfram-mathematica global-variables

作为noted elsewhere,您可以列出所有用户定义的符号:

Names["Global`*"]

但是我想找到我的全局变量(我正在进行一些毛茸茸的调试),而不是我的函数定义。这样的事情很接近:

Select[Names["Global`*"], Head@Symbol[#]=!=Symbol && Head@Symbol[#]=!=Function&]

但是错过了价值是符号的变量(也许我有x = Pi)。

我可能会把这个东西击败,但也许有更清洁,更直接的方式?

2 个答案:

答案 0 :(得分:15)

如果我们将任何具有自己值的符号视为“变量”,那么这将起到作用:

ClearAll[variableQ]
variableQ[name_String] := {} =!= ToExpression[name, InputForm, OwnValues]

Select[Names["Global`*"], variableQ]

请注意,此技术将在读保护符号上失败,并且会错误识别某些形式的自动加载函数。

修改1

正如@Szabolcs指出的那样,如果使用variableQ,可以简化ValueQ的定义:

variableQ[name_String] := ToExpression[name, InputForm, ValueQ]

修改2

正如@dreeves指出的那样,可能需要过滤出值为函数的表观变量,例如: f = (#+1)&

variableQ[name_String] :=
  MatchQ[
    ToExpression[name, InputForm, OwnValues]
  , Except[{} | {_ :> (Function|CompiledFunction)[___]}]
  ]

这个定义可以很容易地扩展,以检查其他类似函数的形式,如插值函数,自动加载的符号等。

答案 1 :(得分:1)

有人可能会认为某个变量是Global`符号,但未通过FunctionQ