re-char char str ret) (let ((end (or (string-index str char) (string-length str)))) (ret (substring str 0 end) (substring str end)))) (define (split-discarding-char char str ret) (let ((end (string-index str char))) (if (not end) (ret str "") (ret (substring str 0 end) (substring str (1+ end)))))) (define (split-after-char-last char str ret) (let ((end (cond ((string-rindex str char) => 1+) (else 0)))) (ret (substring str 0 end) (substring str end)))) (define (split-before-char-last char str ret) (let ((end (or (string-rindex str char) 0))) (ret (substring str 0 end) (substring str end)))) (define (split-discarding-char-last char str ret) (let ((end (string-rindex str char))) (if (not end) (ret str "") (ret (substring str 0 end) (substring str (1+ end)))))) (define (split-before-predicate pred str ret) (let loop ((n 0)) (cond ((= n (string-length str)) (ret str "")) ((not (pred (string-ref str n))) (loop (1+ n))) (else (ret (substring str 0 n) (substring str n)))))) (define (split-after-predicate pred str ret) (let loop ((n 0)) (cond ((= n (string-length str)) (ret str "")) ((not (pred (string-ref str n))) (loop (1+ n))) (else (ret (substring str 0 (1+ n)) (substring str (1+ n))))))) (define (split-discarding-predicate pred str ret) (let loop ((n 0)) (cond ((= n (string-length str)) (ret str "")) ((not (pred (string-ref str n))) (loop (1+ n))) (else (ret (substring str 0 n) (substring str (1+ n))))))) (define (separate-fields-discarding-char ch str ret) (let loop ((fields '()) (str str)) (cond ((string-rindex str ch) => (lambda (w) (loop (cons (substring str (+ 1 w)) fields) (substring str 0 w)))) (else (apply ret str fields))))) (define (separate-fields-after-char ch str ret) (reverse (let loop ((fields '()) (str str)) (cond ((string-index str ch) => (lambda (w) (loop (cons (substring str 0 (+ 1 w)) fields) (substring str (+ 1 w))))) (else (apply ret str fields)))))) (define (separate-fields-before-char ch str ret) (let loop ((fields '()) (str str)) (cond ((string-rindex str ch) => (lambda (w) (loop (cons (substring str w) fields) (substring str 0 w)))) (else (apply ret str fields)))))