Steve Kuo
Steve Kuo

Reputation: 63054

Clojure core.async, channel vs port

In Clojure core.async, are channels and ports the same thing? If not what's the difference? In watching the video Timothy Baldridge - Core.Async, he creates a channel

(def c (chan))

Then later

(<!! c)

c is channel yet the docs for <!! state (emphasis added)

Usage: (<!! port) takes a val from port. Will return nil if closed. Will block if nothing is available.

It's not clear looking at the core.async docs.

Upvotes: 10

Views: 796

Answers (1)

Arthur Ulfeldt
Arthur Ulfeldt

Reputation: 91534

Yes, chans are ports.

port is in the name of the protocol that these implement

(defprotocol ReadPort
  (take! [port fn1-handler] "derefable val if taken, nil if take was enqueued"))

which is used by impl/take in:

(defn <!!
  "takes a val from port. Will return nil if closed. Will block if nothing is available."
  [port]
  (let [p (promise)
        ret (impl/take! port (fn-handler (fn [v] (deliver p v))))]
    (if ret
      @ret
      (deref p))))

and the name port is used very consistently throughout async.clj. Conceptually this is useful because not everything that core.async works on will be a channel. other things can implement ReadPort and WritePort and therefore play nicely with core.async.

Upvotes: 14

Related Questions