(define-module (c line-fold) :use-module (srfi srfi-1) :use-module (srfi srfi-71) :export (fold-lines)) (define (line-continued? line) (and (not (string-null? line)) (char=? #\\ (string-ref line (1- (string-length line)))))) (define (strip-backslash line) (string-drop-right line 1)) (define (fold-lines string) (with-output-to-string (lambda () (let loop ((lines (string-split string #\newline))) (cond ((null? lines) 'NOOP) ((null? (cdr lines)) ;; TODO error message if last character is a backslash (display (car lines)) (newline)) (else (let ((to-merge remaining (span line-continued? lines))) (for-each display (map strip-backslash to-merge)) (display (car remaining)) (newline) (for-each (lambda _ (newline)) (iota (length to-merge))) (loop (cdr remaining)))))))))