我对 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)))
但这似乎不是很典型,因为它基本上是副作用,甚至没有隐藏它。
那么如果没有两个原子来保持状态,你将如何做到这一点?