RSS Feed

Lisp Project of the Day

cl-utilities

You can support this project by donating at:

Donate using PatreonDonate using Liberapay

Or see the list of project sponsors.

cl-utilitiesutils

Documentation😀
Docstrings😀
Tests 😀
Examples🥺
RepositoryActivity🥺
CI 🥺

This is a yet another utilities library. It is used by only a single poftheday's dependency - xml-emitter, reviewed on 10 May.

Amount of tools in this toolbox is not very large and mostly covered by more popular libs.

For example, it has a macro for item collection. For example, this macro can be useful to collect hash key value pairs into an alist. But this facility is also available from UIOP:

POFTHEDAY> (let ((the-hash #h(:foo "bar"
                              :blah "minor")))
             (cl-utilities:collecting
               (maphash
                (lambda (key value)
                  (cl-utilities:collect
                      (cons key value)))
                the-hash)))
((:FOO . "bar") (:BLAH . "minor"))

;; Here is the similar code using UIOP
POFTHEDAY> (let ((the-hash #h(:foo "bar"
                              :blah "minor")))
             (uiop:while-collecting (collect)
               (maphash
                (lambda (key value)
                  (collect (cons key value)))
                the-hash)))
((:FOO . "bar") (:BLAH . "minor"))

But UIOP is more powerful allows you to collect many types of items simultaneously. For example, we might want to collect keys and values into the separate lists:

POFTHEDAY> (let ((the-hash #h(:foo "bar"
                              :blah "minor")))
             (uiop:while-collecting (collect-key collect-value)
               (maphash
                (lambda (key value)
                  (collect-key key)
                  (collect-value value))
                the-hash)))
(:FOO :BLAH)
("bar" "minor")

An interesting feature is a function read-delimited. It can be useful to read chars from the stream into a limited buffer:

POFTHEDAY> (with-input-from-string (stream "The string
with multiple
lines.")
             (let ((buffer (str:repeat 10 " ")))
               (loop for num-chars = (cl-utilities:read-delimited
                                      buffer
                                      stream)
                     while (not (zerop num-chars))
                     do (format t "~A chars were read~%"
                                num-chars)
                        (format t "Buffer: ~A~2%"
                                (str:substring 0 num-chars
                                               buffer)))))
10 chars were read
Buffer: The string

10 chars were read
Buffer: with multi

2 chars were read
Buffer: le

6 chars were read
Buffer: lines.

Probably this facility is also covered by more popular utility library?


Brought to you by 40Ants under Creative Commons License