【发布时间】:2014-09-27 09:08:05
【问题描述】:
我正在修改 Clojure,目前正在尝试使用 clojure.lang.PersistentQueue 来模拟 Dijkstra 的 Sleeping Barber 问题中的候诊室。
barber.core=> (def q (ref clojure.lang.PersistentQueue))
#'barber.core/q
barber.core=> q
#<Ref@37c3a6f0: clojure.lang.PersistentQueue>
barber.core=> @q
clojure.lang.PersistentQueue
barber.core=> (dosync (alter q concat :customer))
IllegalArgumentException Don't know how to create ISeq from: java.lang.Class clojure.lang.RT.seqFrom (RT.java:505)
barber.core=> (dosync (alter q conj :customer))
IllegalArgumentException Don't know how to create ISeq from: clojure.lang.Keyword clojure.lang.RT.seqFrom (RT.java:505)
barber.core=> (dosync (alter q conj :customer))
(:customer)
如您所见,我发送了两次相同的命令。第一次它抛出异常。然而,第二次似乎工作得很好。我现在可以 conj 和 pop 我的 q 直到 Hickey 的奶牛回家。
这在哪个世界可以接受?我没有看到的幕后发生了什么?
【问题讨论】: