\verb;read-st; converts Scheme\TeX{} representations of Scheme objects
into the objects themselves much as \verb;read; does. It uses the
non-standard, but generally available routine \verb;peek-char;.
\begin{astyped}
(define (read-st . rest) \notastyped{; Returns what \verb;read; returns.}
(let ((port (if (pair? rest) \notastyped{; \verb;read-st; arguments are}
(car rest) \notastyped{; the same as \verb;read;'s.}
(current-input-port))))
(letrec \notastyped{; Lines of a Scheme\TeX{} file}
(((text-mode-and-saw-newline) \notastyped{; beginning with ``{\tt(}'', }
(let ((ch (peek-char port))) \notastyped{; start a code section.}
(cond ((eof-object? ch) ch)
((char=? ch \verb-#-\verb-\-() \notastyped{; If code section, then use}
(got-code (read port))) \notastyped{; \verb;read; to get code,}
(else \notastyped{; else skip this line as}
(text-mode-within-a-line))))) \notastyped{; it is a comment.}
((text-mode-within-a-line)
(let ((ch (read-char port)))
(cond ((eof-object? ch) ch)
((char=? ch \verb-#-\verb-\-newline)
(text-mode-and-saw-newline))
(else (text-mode-within-a-line)))))
((got-code code) \notastyped{; Ignore the remainder of the }
(let ((ch (read-char port))) \notastyped{; last code line and return}
(cond ((eof-object? ch) code) \notastyped{; the results of \verb;read;.}
((char=? ch \verb-#-\verb-\-newline)
code)
(else (got-code code))))))
(text-mode-and-saw-newline) \notastyped{; Start by looking }
))) \notastyped{; for a code line.}
\end{astyped}
\end{document}