Подтвердить что ты не робот

Список всех глобальных переменных

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

Names["Global`*"]

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

Select[Names["Global`*"], [email protected][#]=!=Symbol && [email protected][#]=!=Function&]

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

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

4b9b3361

Ответ 1

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

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)[___]}]
  ]

Это определение может быть легко расширено для проверки других функциональноподобных форм, таких как функции интерполяции, автозагруженные символы и т.д.

Ответ 2

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