From e0c6872cf40896c7be36b11dcc744620f10adf1d Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Mon, 2 Sep 2019 13:46:59 +0900 Subject: Initial commit --- support/schemetex/reader.st | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 support/schemetex/reader.st (limited to 'support/schemetex/reader.st') diff --git a/support/schemetex/reader.st b/support/schemetex/reader.st new file mode 100644 index 0000000000..f6db9762ec --- /dev/null +++ b/support/schemetex/reader.st @@ -0,0 +1,43 @@ +\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} + -- cgit v1.2.3