私はClojureと関数型プログラミング全般にかなり慣れていないので、次の問題に苦労しています。一連のトークン(文字列)に一意で安定したインデックスを割り当てたいのですが。挿入よりもはるかに多くのルックアップがあるので、ハッシュマップが進むべき道のようでした。
Javaでは、私は次のように何かを書いていただろう
int last = 0;
HashMap<String, Integer> lut = new HashMap<String, Integer>();
function Integer getIndex(String token) {
Integer index = lut.get(token);
if(index == null)
last++;
lut.put(token, last);
return last;
else {
return index;
}
}
Clojureの音訳バージョンは次のようになります
(def last-index (atom 0))
(def lookup-table (atom {}))
(defn get-index [token]
(if (nil? (get @lookup-table token))
(do
(swap! last-index inc)
(swap! lookup-table assoc token @last-index)
@last-index)
(get @lookup-table token)))
しかし、これは基本的に副作用であり、それを隠すことさえないので、あまり理想的ではないようです。
では、状態を維持するための2つの原子がなくても、これをどのように行うのでしょうか。