• Connecting stream filters in CL

    From luxhalitus@luxhalitus@null.invalid to comp.lang.lisp on Wed Nov 5 10:18:44 2025
    From Newsgroup: comp.lang.lisp

    I'm currently prototyping a system of multiple interconnected string
    filters and am wondering what the best practices are regarding the
    Common Lisp streams API.

    If i had a filter function like:

    | (defun number-lines (in out)
    | (handler-case
    | (loop with line = ""
    | and number = 1
    | do (setf line (read-line in))
    | (format out "~D: ~A" number line)
    | (incf number))
    | (end-of-file (e))))

    how would i go about chaining two calls together?

    A macro that takes advantage of the string stream types immediately
    comes to mind:

    | (defmacro pipe ((writing &body in) (reading &body out))
    | `(let ((,reading
    | (make-string-input-stream
    | (let ((,writing (make-string-output-stream)))
    | ,@in
    | (get-output-stream-string ,writing)))))
    | ,@out))

    You could also write wrappers around C pipe(2) or mkfifo. None of these
    seem like such a good fit for Common Lisp streams though, considering
    their implementation should already come with some kind of buffering
    built in. Allegro CL exposes a make-pipe-streams and a make-function-input-stream function, but no such luck in SBCL it seems.

    Any quicklisp packages featuring this exact functionality or
    alternatives i'm missing?
    --

    ( (

    --- Synchronet 3.21a-Linux NewsLink 1.2