我有一個原子fs
,我正在更新遞歸函數freq-seq
這是保存我的計算結果的值。我有另一個功能mine-freq-seqs
開始freq-seq
,當mine-freq-seqs
完成後,我想收到所述原子的最後一個值。所以我想我會做它像這樣在遞歸函數完成後deref一個原子
(ns freq-seq-enum)
(def fs (atom #{}))
(defn locally-frequents
[sdb min-sup]
(let [uniq-sdb (map (comp frequencies set) sdb)
freqs (apply merge-with + uniq-sdb)]
(->> freqs
(filter #(<= min-sup (second %)))
(map #(vector (str (first %)) (second %))))))
(defn project-sdb
[sdb prefix]
(if (empty? prefix) sdb
(into [] (->> sdb
(filter #(re-find (re-pattern (str (last prefix))) %))
(map #(subs % (inc (.indexOf % (str (last prefix))))))
(remove empty?)))))
(defn freq-seq
[sdb prefix prefix-support min-sup frequent-seqs]
(if ((complement empty?) prefix) (swap! fs conj [prefix prefix-support]))
(let [lf (locally-frequents sdb min-sup)]
(if (empty? lf) nil
(for [[item sup] lf] (freq-seq (project-sdb sdb (str prefix item)) (str prefix item) sup min-sup @fs)))))
(defn mine-freq-seqs
[sdb min-sup]
(freq-seq sdb "" 0 min-sup @fs))
運行它首先
(mine-freq-seqs ["CAABC" "ABCB" "CABC" "ABBCA"] 2)
然後DEREF-ING原子 (deref fs)
產量
#{["B" 4]
["BC" 4]
["AB" 4]
["CA" 3]
["CAC" 2]
["AC" 4]
["ABC" 4]
["CAB" 2]
["A" 4]
["CABC" 2]
["ABB" 2]
["CC" 2]
["CB" 3]
["C" 4]
["BB" 2]
["CBC" 2]
["AA" 2]}
然而(doall (mine-freq-seqs ["CAABC" "ABCB" "CABC" "ABBCA"] 2) (deref fs))
只是給#{}
我想要的是讓那麼freq-seq
遞歸完成獲得原子fs
的價值。所以我可以撥打mine-freq-seq
,並在REPL中返回我的結果,而不必在此處手動刪除它。
這不適合我。你能否提供'lfs'函數並添加你的原子初始化?你的功能應該做什麼?你能添加輸入/期望的輸出嗎? – jmargolisvt
請參閱[這裏](https://gist.github.com/themistoklik/4203bb184617c66512b5fdbd49e4d0cc)。它應該提供一個頻繁的序列枚舉。期望的輸出已經實現。當我使用doall時,我得到#{}。當我到達我的家用機器時,我會完全編輯。 – themistoklik
如果您可以使var名稱更具描述性,並且可以簡化爲最小示例,則會更容易理解您嘗試執行的操作。 –