2016-11-11 5 views
1

Я пытаюсь реализовать обедая философ пример в Clojure По некоторым причинам моя программа всегда умирает с исключением говоряClojure: энный не поддерживается на этом типе: «

» булевой java.lang.UnsupportedOperationException : энный не поддерживается на этом типа: Boolean»

Я не могу понять это сообщение об ошибке, так как я уже пытался получить булевы значения из списка, который работал отлично с п-й

Я предполагаю, что ошибка происходит в , если оператор в функции философ-нить

Консольные распечаток:

  • 3 думает
  • 1 думает
  • 4 думает
  • 0 является мышление
  • 2 думает
  • 0 после сна
  • 0 после того, как думают
  • 0 своп
  • 0 ест
  • 3 после сна
  • 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)))) 

ответ

5

Вы пропустили некоторые скобки здесь:

(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])) 
Смежные вопросы