我不确定我是否遇到了某种种族状况,但我正在拼凑一些测试代码,以便在Clojure中使用传统的面向对象的范例进行测试,并且遇到了一些有趣的行为。检查以下代码:
(def registrar (ref #{}))
(defrecord Person [first-name last-name])
(def rick (->Person "Rick" "James"))
(def charlie (->Person "Charlie" "Murphy"))
(dosync
(alter registrar conj rick)
(alter registrar conj charlie))
(defn print-record
[record]
(println (format "%s %s", (:first-name record), (:last-name record))))
(defn print-registrar
"Prints a report of the registrar to stdout"
[registrar]
(println "Registrar's Report\n------------------")
(map print-record registrar))
(let [registrar (deref registrar)]
(print-registrar registrar))当我在REPL中运行代码时,一切都很好:print-registrar成功地将记录从注册员传递到print-record,并按预期的方式打印它们:
Registrar's Report
------------------
Rick James
Charlie Murphy
(nil nil)但是,当我试图从命令行运行代码时,我会得到以下内容:
Registrar's Report
------------------这是因为dosync是异步调用的还是什么的?当我在调用map之前转储注册员的内容时,我看到了我对它的期望,所以我有点困惑。
发布于 2015-12-30 00:54:06
将map和副作用混为一谈通常不是一个好主意,因为map很懒,因此除非有东西穿过序列并强制产生副作用,否则副作用不会发生(在本例中,repl为您做了这件事)。
我认为run!应该是这里的替补,因为print-record没有返回任何有用的东西。
https://stackoverflow.com/questions/34521047
复制相似问题