On 12 May 2014 03:41, gamma235 <jesus.diama...@gmail.com> wrote:

>
> (defn log-name [ch] (symbol (str ch '-log)))
>>
>>  ;; Is this efficiently written?
>> (defmacro transparent-chan [ch]
>>   (do
>>     `(def ~ch (chan))
>>     `(def (log-name ~ch) (atom []))
>>     `(println "new transparent channel created!")))
>>
>
This looks like you're replicating the functionality of maps using defs.
Instead, consider something like:

(defn transparent-chan [ch]
  {:channel ch, :buffer (atom [])})

Another improvement you may wish to consider is to use a queue, rather than
a vector. Immutable queues exist in Clojure, but are something of a hidden
feature.

(defn transparent-chan [ch]
  {:channel ch, :buffer (atom clojure.lang.PersistentQueue/EMPTY)})

Queues act more like channels, in that popping a queue strips off the
oldest item, whereas popping a vector strips off the newest.

With this in mind, you could write functions like:

(defn transparent-put [{:keys [channel buffer]} x]
  (go
    (>! channel x)
    (swap! buffer conj x)))

(defn transparent-take [{:keys [channel buffer]} x]
  (go
    (let [x (<! channel)]
      (swap! buffer pop)
      x)))

(defn transparent-buffer [{keys [buffer]}]
  (vec @buffer))

- James

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to