Это похоже на keys()
в Perl, Python и других языках, которые имеют встроенную поддержку хэшей (словари). Как показывает ваш пример, Mathematica поддерживает хеши без какого-либо специального синтаксиса. Просто скажите a[1] = 2
и у вас есть хеш. [1]
Чтобы получить ключи хеша, я рекомендую добавить это в вашу init.m или вашу личную библиотеку утилит:
keys[f_] := DownValues[f][[All,1,1,1]] (* Keys of a hash/dictionary. *)
(Или следующая чистая версия функции предположительно немного быстрее:
keys = DownValues[#][[All,1,1,1]]&; (* Keys of a hash/dictionary. *)
)
В любом случае, keys[a]
теперь возвращает то, что вы хотите. (Вы можете получить значения хеша с помощью a /@ keys[a]
.) Если вы хотите разрешить хэши с более высокой арностью, например a[1,2]=5; a[3,4]=6
, тогда вы можете использовать это:
SetAttributes[removeHead, {HoldAll}];
removeHead[h_[args___]] := {args}
keys[f_] := removeHead @@@ DownValues[f][[All,1]]
Что возвращает {{1,2}, {3,4}}
. (В этом случае вы можете получить значения хеша с помощью a @@@ keys[a]
.)
Обратите внимание, что DownValues
по умолчанию сортирует ключи, что, вероятно, не очень хорошая идея, так как в лучшем случае это занимает дополнительное время. Если вы хотите отсортировать ключи, просто наберите Sort@keys[f]
. Поэтому я бы порекомендовал эту версию:
keys = DownValues[#,Sort->False][[All,1,1,1]]&;
Интересно, что в документации DownValues
нет упоминания о опции Sort
. Я узнал об этом из старого поста Даниэля Лихтблау из Wolfram Research. (Я подтвердил, что он все еще работает в текущей версии (7.0) Mathematica.)
<Ч />
Сноска:
[1] Что действительно удобно, так это то, что вы можете смешивать и сопоставлять это с определениями функций. Как:
fib[0] = 1;
fib[1] = 1;
fib[n_] := fib[n-1] + fib[n-2]
Затем вы можете добавить памятку, изменив эту последнюю строку на
fib[n_] := fib[n] = fib[n-1] + fib[n-2]
, который говорит, что нужно кэшировать ответ для всех последующих вызовов.