(module srfi-105 () (import scheme chicken.read-syntax chicken.port chicken.base chicken.io chicken.irregex chicken.string chicken.condition srfi-13) (include "srfi-105-core.scm") (define (read-delimited stop-char port) (define %read ##sys#read) (fluid-let ((##sys#read (lambda (port hook) (fluid-let ((##sys#default-read-info-hook hook)) (let* ((prefix (%read port hook))) (cond ((eof-object? prefix) prefix) ((and (pair? prefix) (eqv? (car prefix) 'quote)) `(quote ,(neoteric-process-tail port (cadr prefix)))) (else (neoteric-process-tail port prefix)))))))) (let* ((c (peek-char port))) (cond ((eof-object? c) (error "unterminated list")) ((char-whitespace? c) (read-token char-whitespace? port) (read-delimited stop-char port)) ((char=? c stop-char) (read-char port) '()) ((or (eq? c #\)) (eq? c #\]) (eq? c #\})) (read-char port) (error "list-terminator mismatch" c stop-char)) (#t (let ((datum (read port))) (cons datum (read-delimited stop-char port)))))))) (define (neoteric-process-tail port prefix) (let* ((c (peek-char port))) (cond ((eof-object? c) prefix) ((char=? c #\( ) ; Implement f(x) (read-char port) (neoteric-process-tail port (cons prefix (read-delimited #\) port)))) ((char=? c #\[ ) ; Implement f[x] (read-char port) (neoteric-process-tail port (cons '$bracket-apply$ (cons prefix (read-delimited #\] port))))) ((char=? c #\{ ) ; Implement f{x} (read-char port) (neoteric-process-tail port (let ((tail (process-curly (read-delimited #\} port)))) (if (eqv? tail '()) (list prefix) ; Map f{} to (f), not (f ()). (list prefix tail))))) (else prefix)))) (set-read-syntax! #\{ (lambda (p) (process-curly (read-delimited #\} p)))))