これは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]]&;
興味深いことに、ドキュメントにはSort
オプションについての言及がありませんDownValues
。これについては、Wolfram Research の Daniel Lichtblau の古い投稿から知りました。(現バージョン(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]
これは、後続のすべての呼び出しの回答をキャッシュすることを示しています。