Strings and Unicode in Depth
SRFI-13 (classic) / SRFI-130 (cursor-based) / SRFI-152 (minimal)
string-index, string-contains, string-join, string-tokenize, string-trim, string-pad
Regular expressions with an s-expression syntax ((regexp-search '(+ digit) "ab12"))
Guile (ice-9 regex), CHICKEN (chicken irregex) / irregex Immutable texts (O(1) indexing)
(import (scheme char))
(string-length "λx.x") ; 4 (characters, not bytes)
(string-upcase "straße") ; "STRASSE" (full case mapping in many implementations)
(string-foldcase "ΣΑΣ") ; case folding for comparison
(string-ci=? "Hello" "HELLO") ; #t
(char-upcase #\ß) ; #\ß (char-level mapping is 1:1)
(string->utf8 "€") ; #u8(226 130 172)
;; Splitting a string (portable helper)
(define (string-split str ch)
(let loop ((chars (string->list str)) (cur '()) (acc '()))
(cond ((null? chars) (reverse (cons (list->string (reverse cur)) acc)))
((char=? (car chars) ch) (loop (cdr chars) '() (cons (list->string (reverse cur)) acc)))
(else (loop (cdr chars) (cons (car chars) cur) acc)))))
(string-split "a,b,,c" #\,) ; ("a" "b" "" "c")
(define (string-join lst sep)
(if (null? lst)
""
(fold-left* (lambda (acc s) (string-append acc sep s)) (car lst) (cdr lst))))
(string-join '("a" "b" "c") ", ") ; "a, b, c"