Chez concurrency pt.2: clojure.core.async on real-thread blocking channels
No mature Chez fibers library exists and this is a threaded Chez build, so a go block is an OS thread and a channel is a mutex+condition blocking queue: <! / >! are the blocking <!! / >!! and work anywhere (no CPS transform), like the Janet stackful-fiber model but with real parallelism and a shared heap. host/chez/async.ss provides chan (unbuffered rendezvous / fixed / dropping / sliding), <! >! <!! >!! close! alts! timeout put! take! buffer ctors, channel transducers, and go-spawn, all def-var!'d into clojure.core.async; go/go-loop/ thread are macros (mark-macro!) expanding to go-spawn, mirroring src/jolt/ async.janet. Binding conveyance rides the thread-parameter binding stack from pt.1. alts! polls with a 1ms backoff (no cross-channel wait-set yet) and is take-only, matching the Janet impl. (require '[clojure.core.async ...]) resolves it with no file load — the vars are resident and require just registers the :as/:refer. cli-test covers go/buffered-drain/nested-<!/alts!/transducer/timeout/binding- conveyance (43/43). core.async isn't in the conformance corpus (feature-gated :async/core-async), so coverage is the Chez cli-test plus the existing Janet core-async-spec. Seed unchanged (no .clj touched). Prelude corpus 2534->2559, zero-Janet 2569, 0 new divergences on either; Janet gate + JVM cert green. jolt-byjr
This commit is contained in:
parent
ec30c9e405
commit
48ed72974f
4 changed files with 233 additions and 2 deletions
|
|
@ -68,7 +68,15 @@
|
|||
["(let [a (atom 0)] (dorun (pmap (fn [_] (swap! a inc)) [1 2 3 4])) @a)" "4"]
|
||||
# promise blocks until delivered (JVM), unlike the Janet atom-shim.
|
||||
["(let [p (promise)] (deliver p 7) @p)" "7"]
|
||||
["(let [p (promise)] (future (deliver p :hi)) @p)" ":hi"]])
|
||||
["(let [p (promise)] (future (deliver p :hi)) @p)" ":hi"]
|
||||
# jolt-byjr: clojure.core.async on real-thread blocking channels.
|
||||
["(require (quote [clojure.core.async :refer [chan go <! >! <!!]])) (def c (chan)) (go (>! c (+ 40 2))) (<!! c)" "42"]
|
||||
["(require (quote [clojure.core.async :refer [chan go go-loop <! >! <!! close!]])) (def c (chan 5)) (go (>! c 1) (>! c 2) (>! c 3) (close! c)) (<!! (go-loop [o []] (let [v (<! c)] (if (nil? v) o (recur (conj o v))))))" "[1 2 3]"]
|
||||
["(require (quote [clojure.core.async :refer [chan go <! >! <!!]])) (def x (chan)) (def y (chan)) (go (>! x 10)) (go (>! y 32)) (<!! (go (+ (<! x) (<! y))))" "42"]
|
||||
["(require (quote [clojure.core.async :refer [chan go <! >! <!! alts!]])) (def x (chan)) (def y (chan)) (go (>! y :v)) (<!! (go (let [[v ch] (alts! [x y])] (and (= v :v) (= ch y)))))" "true"]
|
||||
["(require (quote [clojure.core.async :refer [chan go go-loop <! >! <!! close!]])) (def c (chan 10 (map inc))) (go (>! c 1) (>! c 2) (>! c 3) (close! c)) (<!! (go-loop [o []] (let [v (<! c)] (if (nil? v) o (recur (conj o v))))))" "[2 3 4]"]
|
||||
["(require (quote [clojure.core.async :refer [timeout <!!]])) (<!! (timeout 10)) :done" ":done"]
|
||||
["(require (quote [clojure.core.async :refer [chan go <! >! <!!]])) (def ^:dynamic *x* 0) (<!! (binding [*x* 7] (go (<! (clojure.core.async/timeout 5)) *x*)))" "7"]])
|
||||
|
||||
(each [src want] cases
|
||||
(def [code out err] (joltc src))
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue