Range Over Channels in Lisp
(defpackage :range-over-channels
(:use :cl))
(in-package :range-over-channels)
(defun main ()
;; We'll iterate over 2 values in the `queue` channel.
(let ((queue (make-channel :buffer-size 2)))
(send queue "one")
(send queue "two")
(close-channel queue)
;; This `loop` iterates over each element as it's
;; received from `queue`. Because we closed the
;; channel above, the iteration terminates after
;; receiving the 2 elements.
(loop for elem = (recv queue)
while elem
do (format t "~A~%" elem))))
In a previous example, we saw how iteration works over basic data structures. We can also use similar syntax to iterate over values received from a channel.
This example demonstrates how to use channels and iterate over their contents in Common Lisp. However, it’s important to note that Common Lisp doesn’t have built-in support for channels or concurrent programming constructs like Go does. The code above uses hypothetical functions make-channel
, send
, recv
, and close-channel
which would need to be implemented separately, possibly using a library that provides concurrency primitives.
Here’s how the program works:
- We create a buffered channel
queue
with a capacity of 2. - We send two strings, “one” and “two”, to the channel.
- We close the channel to signal that no more values will be sent.
- We use a
loop
construct to iterate over the channel’s contents. Therecv
function (which would need to be implemented) retrieves values from the channel. The loop continues as long asrecv
returns a non-nil value, which it would do until the channel is empty and closed. - Each received value is printed to the console.
To run this program, you would need to have the necessary channel implementation and then load and execute the main
function:
CL-USER> (range-over-channels:main)
one
two
NIL
This example also shows that it’s possible to close a non-empty channel but still have the remaining values be received. In the Lisp implementation, this behavior would need to be explicitly implemented in the channel functions.