2016-11-11 2 views
1

Je suis en train de mettre en œuvre le dîner exemple philosophe clojure Pour certaines raisons mon programme meurt toujours avec une exception en disantClojure: nième pas pris en charge sur ce type: «

» Boolean java.lang.UnsupportedOperationException : n-ième pas pris en charge sur ce type : Boolean »

Je ne comprends pas ce message d'erreur, car je l'ai déjà essayé d'obtenir des valeurs booléennes à partir d'une liste qui a parfaitement fonctionné avec nième

Je suppose que l'erreur se produit dans la instruction if dans la fonction philosophe-fil

Prints Console:

  • 3 pense
  • 1 est la pensée
  • 4 pense
  • 0 pense
  • 2 est la pensée
  • 0 après le sommeil
  • 0 après pense
  • 0 échange
  • 0 est de manger
  • 3 après le sommeil
  • 3 après pense

code:

(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)))) 

Répondre

5

Vous êtes absent quelques parens ici:

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

devrait être

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

Le premier évaluera assoc, l, n et true dans l'ordre, et retourner la valeur de la dernière expression (true

Il reste un problème, c'est que vous ne pouvez pas assoc sur une liste. Je suggère d'utiliser un vecteur à la place:

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