=== Go-like channels for atomically passing information between threads, and some other stuff. === (channel:make-channel) ; make new channel (channel:make-channel 2) ; make new channel with max size of 2 (untested) (channel:-> chan item) ; send item to channel (channel:<- chan) ; receive from channel (values item is-not-closed), blocks until there is one (channel:release chan) ; close channel (channel:closed chan) ; is channel closed (channel:¬closed chan) ; (not (closed chan)) --- Signalling --- (dispatcher:make-dispatcher) ; make dispatcher (dispatcher:hook disp name lambda) ; add hook (dispatcher:sig name (optional value)) ; signal name in parallel (dispatcher:sig-serial name (optional value)) ; signal name in serial --- Atomic operations --- (box:make &optional value) ; make a box with default value (box:<- box) ; get value atomically (box:-> box value) ; set value atomically (box:<-! box) ; get value without lock (box:->! box vlaue) ; set value without lock (setf (box:@ box) value) ; set value atomically (box:--> box &body things) ; do (progn ,@things) with lock held then set value to box (box:<-- box &body things) ; do (progn ,@things) with lock held. return value of box. ; these two macros flet functions (box:<-) and (box:-> thing) to get&set from box while lock is held.