\documentstyle[astyped]{article}
% @(#)reader.st 1.3 88/06/30
\title{{\tt read-st}}
\author{John D. Ramsdell}
\date{
88/06/30
}

\begin{document}

\maketitle

\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;.
(define (read-st . rest)                ; Returns what \verb;read; returns.
 (let ((port (if (pair? rest)          ; \verb;read-st; arguments are
                 (car rest)            ; the same as \verb;read;'s.
                 (current-input-port))))
   (letrec                             ; Lines of a Scheme\TeX{} file
       (((text-mode-and-saw-newline)   ; beginning with ``{\tt(}'',
         (let ((ch (peek-char port)))  ; start a code section.
           (cond ((eof-object? ch) ch)
                 ((char=? ch #\()      ; If code section, then use
                  (got-code (read port))) ; \verb;read; to get code,
                 (else                 ; else skip this line as
                  (text-mode-within-a-line))))) ; it is a comment.
        ((text-mode-within-a-line)
         (let ((ch (read-char port)))
           (cond ((eof-object? ch) ch)
                 ((char=? ch #\newline)
                  (text-mode-and-saw-newline))
                 (else (text-mode-within-a-line)))))
        ((got-code code)               ; Ignore the remainder of the
         (let ((ch (read-char port)))  ; last code line and return
           (cond ((eof-object? ch) code) ;  the results of \verb;read;.
                 ((char=? ch #\newline)
                  code)
                 (else (got-code code))))))
     (text-mode-and-saw-newline)       ; Start by looking
     )))                               ; for a code line.
\end{document}