Advertisement
Guest User

Untitled

a guest
Oct 1st, 2014
239
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. (ns meta-clojure.core
  2.   (:require [meta-clojure.stm.v0-native :as mc])
  3.   (:require [clojure.string :as str])
  4.   (:require [clojure.walk :as walk])
  5.   (:require [clojure.core :as clj])
  6.   (:use     [clojure.pprint :only (pp pprint)])
  7.   (:import [java.util.concurrent LinkedBlockingQueue])
  8.   (:gen-class))
  9.  
  10. (def queue (ref '()))
  11.  
  12. (defn contains-element [elements collection]
  13.   (some (zipmap elements (repeat true)) collection))
  14.  
  15. (defn has-element
  16.   [col e]
  17.   (some #(= e %) col))
  18.  
  19. (defn find-first
  20.          [f coll]
  21.          (first (filter f coll)))
  22.  
  23. ; This function is blocking, which is what I want.
  24. ; However, it spins and thus used a LOT of cpu,
  25. ; whit is *not* what I want..
  26. (defn get-either
  27.   [getthese queue]
  28.   (dosync
  29.     (let [match   (first (filter #(has-element getthese %) @queue))
  30.           newlist (filter #(not= match %)  @queue)]
  31.  
  32.       (if (not (nil? match))
  33.         (do (ref-set queue newlist)
  34.             match)
  35.         (recur)))))
  36.  
  37. (defn somethread
  38.   [iwantthese]
  39.   (let [element (get-either iwantthese queue)
  40.         wanted  (filter #(not= % element) iwantthese)]
  41.     (println (str "I got " element))
  42.     (Thread/sleep 500)
  43.     (recur wanted)))
  44.  
  45. (defn test
  46.   []
  47.   (.start (Thread. (fn [] (somethread '(3 4 5)))))
  48.  
  49.   (dosync (alter queue #(cons 1 %)))
  50.   (println "Main: added 1")
  51.   (Thread/sleep 1000)
  52.  
  53.   (dosync (alter queue #(cons 2 %)))
  54.   (println "Main: added 2")
  55.   (Thread/sleep 1000)
  56.  
  57.   (dosync (alter queue #(cons 3 %)))
  58.   (println "Main: added 3")
  59.   (Thread/sleep 1000)
  60.  
  61.   (dosync (alter queue #(cons 4 %)))
  62.   (println "Main: added 4")
  63.   (Thread/sleep 1000)
  64.  
  65.   (dosync (alter queue #(cons 5 %)))
  66.   (println "Main: added 5")        
  67.   )
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement