Pipe dreams aren’t necessarily made of promises
Because of the spinning nature of atoms, it’s kind of a hack (a fun hack but still a hack) to build queues on it. Here is the same pipe function built on Java queues:
(defn pipe [] (let [q (java.util.concurrent.LinkedBlockingQueue.) EOQ (Object.) NIL (Object.) s (fn s [] (lazy-seq (let [x (.take q)] (when-not (= EOQ x) (cons (when-not (= NIL x) x) (s))))))] [(s) (fn ([] (.put q EOQ)) ([x] (.put q (or x NIL))))]))
[...] follow-up: pipe dreams aren’t necessarily made of promises [...]
Thanks again Christophe.
why did you decide to return a vector instead of a list?
Nice. It took me a moment to understand the purpose of the NIL object, until I found that LinkedBlockingQueue.put won’t accept a null pointer.
J’y comprends toujours rien… mais la “spinning nature of atoms” ? Clojure sert à programmer des ordinateurs quantiques ?
@Olivier: un atome Clojure est une référence mutable synchrone non coordonnée (ne participe pas à une transaction) qui est basée sur une opération CAS. Le CAS pouvant échouer, la fonction de mise à jour peut être appliquée plusieurs fois : c’est ça la spinning nature of atoms ! Et oui en écrivant ceci je trouvais ça quantiquement drôle.
@William: In Clojure vectors are preferred over lists in such cases.