To jak keys()
w Perlu i Pythonie i innych języków, które mają wbudowane wsparcie dla skrótów (aka słowników). Jak ilustruje Twój przykład, Mathematica obsługuje skróty bez specjalnej składni. Po prostu powiedz a[1] = 2
, a otrzymasz hasz. [1] Aby otrzymać klucze mieszania, polecam dodanie tego do swojej init.m lub osobistej użyteczności Biblioteka:
keys[f_] := DownValues[f][[All,1,1,1]] (* Keys of a hash/dictionary. *)
(lub po czysta wersja funkcja jest podobno nieco szybciej:
keys = DownValues[#][[All,1,1,1]]&; (* Keys of a hash/dictionary. *)
)
Tak czy inaczej, keys[a]
teraz zwraca to, co chcesz. (Można uzyskać wartości hash z a /@ keys[a]
). Jeśli chcesz zezwolić na wyższe mieszań arity, jak a[1,2]=5; a[3,4]=6
następnie można użyć to:
SetAttributes[removeHead, {HoldAll}];
removeHead[h_[args___]] := {args}
keys[f_] := removeHead @@@ DownValues[f][[All,1]]
Które zwraca {{1,2}, {3,4}}
. (W takim przypadku można uzyskać wartości mieszania za pomocą a @@@ keys[a]
.)
Należy pamiętać, że domyślnie sortuje klucze, co prawdopodobnie nie jest dobrym pomysłem, ponieważ w najlepszym przypadku zajmuje to więcej czasu. Jeśli chcesz posortowane klucze, możesz po prostu zrobić [email protected][f]
. Więc chciałbym faktycznie polecam tej wersji:
keys = DownValues[#,Sort->False][[All,1,1,1]]&;
Co ciekawe, nie ma wzmianki o opcji w DownValues
dokumentację, Sort
. Dowiedziałem się o tym ze starego postu Daniela Lichtblau z Wolfram Research. (I potwierdził, że nadal działa w obecnej wersji (7.0) z Mathematica.)
Przypisy:
[1] Co jest naprawdę poręczny, że można łączyć ze sobą, które z definicji funkcji. Jak:
fib[0] = 1;
fib[1] = 1;
fib[n_] := fib[n-1] + fib[n-2]
Następnie można dodać memoization zmieniając że ostatni wiersz
fib[n_] := fib[n] = fib[n-1] + fib[n-2]
który mówi buforować odpowiedź dla wszystkich kolejnych połączeń.
Tak, próbowałem zrobić coś podobnego z notacją [[]], ale wyłączyłem blokadę i dostałem rhs. Ale działa to świetnie! –
Wygląda jak DownValues [a] [[Wszystko, 1, 1, 1]] działa również, przynajmniej w tym prostym przykładzie. –