Список всех глобальных переменных - PullRequest
12 голосов
/ 18 июля 2011

Как указано в другом месте , вы можете перечислить все пользовательские символы с помощью этого:

Names["Global`*"]

Но я бы хотел найти только мои глобальные переменные (я всередина некоторой волосатой отладки), не мои определения функций.Что-то вроде этого близко:

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

Но это пропускает переменные, значение которых является символом (возможно, у меня есть x = Pi).

Возможно, я мог бы превратить эту вещь в представление, но, возможно, естьчище, прямее?

Ответы [ 2 ]

15 голосов
/ 18 июля 2011

Если мы рассмотрим любой символ с собственным значением как «переменную», то это поможет:

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 голос
/ 18 августа 2011

Можно рассматривать переменную как символ Global`, который не передает FunctionQ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...