• re: How to split a string (or arbitrary sequence) at each occurrence of a value.

    From B. Pym@Nobody447095@here-nor-there.org to comp.lang.lisp,comp.lang.scheme on Sat Jul 5 03:40:19 2025
    From Newsgroup: comp.lang.scheme

    Erik Haugan wrote:

    * Daniel Pittman <dan...@rimspace.net>

    What is the best, easiest, fastest, etc, way to split a string into substrings based on a character position.


    (defun string-split (string &optional (delimiter #\Space))
    (with-input-from-string (*standard-input* string)
    (let ((*standard-output* (make-string-output-stream)))
    (loop for char = (read-char nil nil nil)
    if (or (null char)
    (char= char delimiter))
    collect (get-output-stream-string *standard-output*)
    else
    do (write-char char)
    while char))))

    Gauche Scheme

    ;; Preserves empty strings.
    (define (split-on-char text :optional (delimiter #\space))
    (let ((result '()) (tmp '()))
    (string-for-each
    (lambda (c)
    (if (char=? c delimiter)
    (begin
    (push! result tmp)
    (set! tmp '()))
    (push! tmp c)))
    text)
    (when (or (pair? result) (pair? tmp)) (push! result tmp))
    (reverse
    (map
    (lambda(xs) (list->string (reverse xs)))
    result))))


    (split-on-char "foo;bar" #\;)
    ===>
    ("foo" "bar")

    (split-on-char ";foo;;bar;" #\;)
    ===>
    ("" "foo" "" "bar" "")
    --- Synchronet 3.21a-Linux NewsLink 1.2