summaryrefslogtreecommitdiff
path: root/support/schemetex/reader.st
blob: f6db9762ecfc2c9375aa441a50f9167a918ee751 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
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}