私はClojureと関数型プログラミングにはかなり新しく、次の問題に苦しんでいます。一連のトークン(文字列)にユニークで安定したインデックスを割り当てたいと思います。挿入よりも多くのルックアップが存在するため、ハッシュマップが移動する方法のように見えます。Clojureでインデックス付きのステートフルルックアップテーブルを保持する慣習的な方法
私は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)))
ようなものになるだろう。しかし、これはので、非常にidomaticではないようです
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;
}
}
の線に沿って何かを書いただろうJavaでは
基本的に副作用があり、隠すことさえありません。
したがって、状態を保持するために2つの原子を持たないとどうしますか?原子内
お互いに依存する2つのアトムを変更するこのようなコードを望むことは決してありません。原子は独立した状態です。お互いに依存する複数のものを変更する必要がある場合は、refsとdosyncを使用する必要があります。 Ankurの答えを考えれば特に重要ではありませんが、心に留めておいてください。 – Rayne