Clojure:n在此类型上不受支持:Boolean;

Clojure:n在此类型上不受支持:Boolean;,clojure,clojure-java-interop,Clojure,Clojure Java Interop,我试图在clojure中实现用餐哲学家示例。 由于某些原因,我的程序总是在一个例外情况下终止 “java.lang.UnsupportedOperationException:此服务器不支持第n个 类型:布尔“ 我无法理解这个错误消息,因为我已经尝试从一个列表中获取布尔值,该列表可以很好地处理nth 我猜错误发生在函数哲学家线程的if语句中 控制台打印: 三是思考 1是思考 4是思考 0在思考 2是思考 睡后0 0在思考之后 0交换 0正在吃东西 3.睡后 三思而后行 代码: (ns din

我试图在clojure中实现用餐哲学家示例。 由于某些原因,我的程序总是在一个例外情况下终止

“java.lang.UnsupportedOperationException:此服务器不支持第n个 类型:布尔“

我无法理解这个错误消息,因为我已经尝试从一个列表中获取布尔值,该列表可以很好地处理nth

我猜错误发生在函数哲学家线程的if语句中

控制台打印:

  • 三是思考
  • 1是思考
  • 4是思考
  • 0在思考
  • 2是思考
  • 睡后0
  • 0在思考之后
  • 0交换
  • 0正在吃东西
  • 3.睡后
  • 三思而后行
代码:

(ns dining-philosphers.core
  (:gen-class))

(defn think [n] 
  (println (str n " is thinking"))
  (Thread/sleep (rand 1000))
  (println (str n " after sleep"))
)

(defn eat [n] 
  (println (str n " is eating"))
  (Thread/sleep (rand 1000))
)

(def isEating (atom '(false false false false false)))


(defn philosopher-thread [n] 
  (Thread. #( 
    (while true (do  
      (think n) 
      (println (str n " after think"))
      (if (or  (nth @isEating (mod (- n 1) 5))  (nth @isEating  (mod (+ n 1) 5)))
        (println "is waiting for neighbour")
        (
          do 
          (println (str n " swap"))
          (swap! isEating (fn [l] assoc l n true)) 
          (eat n)
          (swap! isEating (fn [l] assoc l n true))
        )
      )
     )
    ) 
  )

  )
)

(defn -main [& args] 
  (let [threads (map philosopher-thread (range 5))] 
    (doseq [thread threads] (.start thread))
    (doseq [thread threads] (.join thread))))

您在这里遗漏了一些参数:

(swap! isEating (fn [l] assoc l n true)) 
应该是

(swap! isEating (fn [l] (assoc l n true))) 
第一个将依次计算
assoc
l
n
true
,并返回最后一个表达式的值(
true

仍然存在一个问题,即不能将
assoc
关联到列表中。我建议改为使用向量:

(def isEating (atom [false false false false false]))

您在这里遗漏了一些参数:

(swap! isEating (fn [l] assoc l n true)) 
应该是

(swap! isEating (fn [l] (assoc l n true))) 
第一个将依次计算
assoc
l
n
true
,并返回最后一个表达式的值(
true

仍然存在一个问题,即不能将
assoc
关联到列表中。我建议改为使用向量:

(def isEating (atom [false false false false false]))