(module reader mzscheme
(provide readtable)
(require (lib "readerr.ss" "syntax"))
(define (read-!r6rs ch port src line col pos)
(for-each
(λ (c len)
(let ((ch (read-char port)))
(cond ((eof-object? ch)
(raise-read-eof-error
"unexpected end-of-file in #!r6rs"
src line col pos len))
((not (char=? ch c))
(raise-read-error
(format "expected a #!r6rs-lexeme, found: #!~a~a" (substring "r6rs" 0 len) ch)
src line col pos (+ 2 len))))))
'(#\r #\6 #\r #\s)
'( 0 1 2 3))
(make-special-comment '!r6rs))
(define (read-vu8 ch port src line col pos)
(for-each
(λ (c len)
(let ((ch (read-char port)))
(cond ((eof-object? ch)
(raise-read-eof-error
"unexpected end-of-file in #!r6rs"
src line col pos len))
((not (char=? ch c))
(raise-read-error
(format "expected a #vu8, found: #v~a~a" (substring "u8" 0 len) ch)
src line col pos (+ 2 len))))))
'(#\u #\8)
'( 0 1))
(let ((elems (read port)))
(cond ((eof-object? elems)
(raise-read-eof-error
"unexpected end-of-file in #vu8(---)"
src line col pos 0))
((and (list? elems)
(andmap
(λ (n)
(and (integer? n)
(>= n 0)
(<= n 255)))
elems))
(raise-read-error
(format "#vu8~a syntax is well-formed, but unsupported at this time." elems)
src line col pos 1))
(else
(raise-read-error
(format "expected #vu8(<u8> ...), found: #vu8~a" elems)
src line col pos 1)))))
(define (read-vertical-bar ch port src line col pos)
(raise-read-error
"Vertical bar is not an initial character."
src line col pos 1))
(define readtable
(make-readtable #f
#\! 'dispatch-macro read-!r6rs
#\v 'dispatch-macro read-vu8
#\| 'non-terminating-macro read-vertical-bar
#\{ #\{ #f))
)