feat: 9.5.9
This commit is contained in:
parent
cb1753732b
commit
35f43a7909
1084 changed files with 558985 additions and 0 deletions
32
stex/doc/Makefile
Normal file
32
stex/doc/Makefile
Normal file
|
@ -0,0 +1,32 @@
|
|||
# define default document pathname here
|
||||
# override on command line with 'make x=newdoc'
|
||||
x = stex
|
||||
|
||||
# define latex processor: latex or pdflatex
|
||||
latex = pdflatex
|
||||
|
||||
# define stex macro files here
|
||||
stexmacrofiles =
|
||||
|
||||
# list bibliography files here
|
||||
bib =
|
||||
|
||||
# define index if an index is to be generated
|
||||
# index=yes
|
||||
|
||||
include ~/stex/Mf-stex
|
||||
|
||||
# define or override suffixes here
|
||||
|
||||
# define any additional targets here
|
||||
|
||||
# define any dependencies here
|
||||
|
||||
# define cleanup targets here:
|
||||
|
||||
$(x).clean:
|
||||
-rm -f $x.rawsst
|
||||
|
||||
$(x).reallyclean:
|
||||
|
||||
$(x).reallyreallyclean:
|
35
stex/doc/stex.css
Normal file
35
stex/doc/stex.css
Normal file
|
@ -0,0 +1,35 @@
|
|||
BODY {background-color: #FFFFFF}
|
||||
|
||||
a:link, a:active, a:visited { color:#6d380b; text-decoration:underline }
|
||||
a:hover { color:white; text-decoration:underline; background:#6d380b }
|
||||
|
||||
a.plain:link, a.plain:active, a.plain:visited { color:#6d380b; text-decoration:none }
|
||||
a.plain:hover { color:white; text-decoration:none; background:#6d380b }
|
||||
|
||||
a.toc:link, a.toc:active, a.toc:visited {font-family: sans-serif; color:#6d380b; text-decoration:none}
|
||||
a.toc:hover {font-family: sans-serif; color:white; text-decoration:none; background:#6d380b}
|
||||
|
||||
a.image:link, a.image:active, a.image:visited, a.image:hover {
|
||||
color: #6d380b;
|
||||
background: #FFFFFF;
|
||||
}
|
||||
|
||||
ul.tocchapter { list-style: none; }
|
||||
ul.tocsection { list-style: circle; color: #923a3a }
|
||||
|
||||
hr.copyright { width: 50% }
|
||||
|
||||
input.default { background: #ffffff; color: #000000; vertical-align: middle}
|
||||
|
||||
h1, h2, h3, h4 {font-family: sans-serif; color: #6d380b}
|
||||
h1 {font-size: 2em}
|
||||
h2 {margin-top: 30px; font-size: 1.5em}
|
||||
h3 {margin-top: 30px; font-size: 1.17em}
|
||||
h1, h2, h3, h4 {font-weight: bold}
|
||||
|
||||
.title { font-family: sans-serif; font-weight: bold; font-size: 2.5em; color: #6d380b; white-space: nowrap}
|
||||
|
||||
.formdef { color: #6d380b }
|
||||
|
||||
table.indent {margin-left: 20px}
|
||||
|
967
stex/doc/stex.html
Normal file
967
stex/doc/stex.html
Normal file
|
@ -0,0 +1,967 @@
|
|||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
|
||||
"http://www.w3.org/TR/html4/loose.dtd"><!-- DO NOT EDIT THIS FILE-->
|
||||
<!-- Edit the .tex version instead-->
|
||||
|
||||
<html>
|
||||
<head>
|
||||
<title>Introduction to stex</title>
|
||||
<link href="stex.css" rel="stylesheet" type="text/css">
|
||||
</head>
|
||||
<body>
|
||||
|
||||
|
||||
|
||||
|
||||
<h1>Introduction to stex</h1>
|
||||
<h2>R. Kent Dybvig and Oscar Waddell</h2>
|
||||
<h3>April 2016</h3>
|
||||
|
||||
|
||||
<p>
|
||||
|
||||
<table cellpadding=0 cellspacing=0>
|
||||
|
||||
|
||||
|
||||
<tr><td align="right"><b>1. </b><td><b><a class=plain href="./stex.html#g0">Overview</a></b></td></tr>
|
||||
|
||||
|
||||
|
||||
<tr><td align="right"><b>2. </b><td><b><a class=plain href="./stex.html#g1">Installation</a></b></td></tr>
|
||||
|
||||
|
||||
|
||||
<tr><td align="right"><b>3. </b><td><b><a class=plain href="./stex.html#g2">Usage notes</a></b></td></tr>
|
||||
|
||||
|
||||
|
||||
<tr><td align="right"><b>4. </b><td><b><a class=plain href="./stex.html#g3">Basic stex commands</a></b></td></tr>
|
||||
|
||||
|
||||
<tr><td></td><td><table cellpadding=0 cellspacing=0>
|
||||
<tr><td><b>4.1. </b></td><td><b><a class=plain href="./stex.html#g4">Inline code</a></b></td></tr>
|
||||
|
||||
|
||||
|
||||
<tr><td><b>4.2. </b></td><td><b><a class=plain href="./stex.html#g5">Code displays</a></b></td></tr>
|
||||
|
||||
|
||||
|
||||
<tr><td><b>4.3. </b></td><td><b><a class=plain href="./stex.html#g6">Variables</a></b></td></tr>
|
||||
|
||||
|
||||
|
||||
<tr><td><b>4.4. </b></td><td><b><a class=plain href="./stex.html#g7">Raw text in code</a></b></td></tr>
|
||||
|
||||
|
||||
|
||||
<tr><td><b>4.5. </b></td><td><b><a class=plain href="./stex.html#g8">Generated output</a></b></td></tr>
|
||||
|
||||
|
||||
|
||||
<tr><td><b>4.6. </b></td><td><b><a class=plain href="./stex.html#g9">Verbatim Scheme displays</a></b></td></tr>
|
||||
|
||||
|
||||
</table></td></tr>
|
||||
<tr><td align="right"><b>5. </b><td><b><a class=plain href="./stex.html#g10">Scheme transcripts</a></b></td></tr>
|
||||
|
||||
|
||||
<tr><td></td><td><table cellpadding=0 cellspacing=0>
|
||||
<tr><td><b>5.1. </b></td><td><b><a class=plain href="./stex.html#g11">Automatic transcript generation</a></b></td></tr>
|
||||
|
||||
|
||||
|
||||
<tr><td><b>5.2. </b></td><td><b><a class=plain href="./stex.html#g12">Loading initialization code</a></b></td></tr>
|
||||
|
||||
|
||||
</table></td></tr>
|
||||
<tr><td align="right"><b>6. </b><td><b><a class=plain href="./stex.html#g13">html-prep support for the <tt>tabular</tt> environment</a></b></td></tr>
|
||||
|
||||
|
||||
|
||||
|
||||
</table>
|
||||
|
||||
|
||||
<p>
|
||||
|
||||
|
||||
<p>
|
||||
|
||||
<a name="g0"></a>
|
||||
|
||||
|
||||
<h3><a name="./stex:h0"></a>1. Overview</h3>
|
||||
|
||||
|
||||
|
||||
|
||||
<p>
|
||||
The <i>stex</i> package consists of two main programs and some supporting
|
||||
items, such as make files, make-file templates, class files, and style
|
||||
files.
|
||||
The two main programs are <b>scheme-prep</b> and <b>html-prep</b>.
|
||||
<b>scheme-prep</b> performs a conversion from "stex"-formatted files
|
||||
into latex-formatted files, while <b>html-prep</b> converts (some)
|
||||
latex-formatted files into html-formatted files.
|
||||
|
||||
<p>
|
||||
An stex file is really just a latex file extended with a handful of
|
||||
commands for including Scheme code (or pretty much any other kind of code,
|
||||
as long as you don't plan to use the Scheme-specific transcript support)
|
||||
in a document, plus a couple of additional features rather arbitrarily
|
||||
thrown in.
|
||||
|
||||
<p>
|
||||
The subset of latex-formatted files <b>html-prep</b> is capable of
|
||||
handling is rather small but has nevertheless been useful for our
|
||||
purposes, which include producing html versions of a couple of books
|
||||
(<i>The Scheme Programming Language</i>, Editions 2-4 and the Chez Scheme
|
||||
User's Guides for Versions 6-9), the scheme.com web site, class websites,
|
||||
class assignments, and various other documents.
|
||||
|
||||
<p>
|
||||
|
||||
<a name="g1"></a>
|
||||
|
||||
|
||||
<h3><a name="./stex:h1"></a>2. Installation</h3>
|
||||
|
||||
|
||||
|
||||
|
||||
<p>
|
||||
A prerequisite to building and using stex is to have Chez Scheme or
|
||||
Petite Chez Scheme installed on your system.
|
||||
You'll also need pdflatex, dvips, ghostscript, and netbpm.
|
||||
We've run stex under Linux and OS X but have not tried to run it under
|
||||
Windows.
|
||||
|
||||
<p>
|
||||
The simplest way to install stex for your personal use is to clone the
|
||||
stex directory into your home directory, cd into the stex directory,
|
||||
and run make:
|
||||
|
||||
<p>
|
||||
|
||||
<p><tt>make BIN=<i>bindir</i></tt>
|
||||
<p>where <tt><i>bindir</i></tt> is the directory where make will find the scheme or
|
||||
petite executables.
|
||||
|
||||
<p>
|
||||
This will create a subdirectory, named for the installed Chez Scheme
|
||||
machine type, containing binary versions of the programs.
|
||||
|
||||
<p>
|
||||
You can also use "make install" to make stex available for other users.
|
||||
|
||||
<p>
|
||||
|
||||
<p><tt>sudo make install BIN=<i>bindir</i> LIB=<i>libdir</i></tt>
|
||||
<p>where <tt><i>bindir</i></tt> is as described above, and <tt><i>libdir</i></tt> is the
|
||||
directory where the stex library directory should be installed.
|
||||
|
||||
<p>
|
||||
|
||||
<a name="g2"></a>
|
||||
|
||||
|
||||
<h3><a name="./stex:h2"></a>3. Usage notes</h3>
|
||||
|
||||
|
||||
|
||||
|
||||
<p>
|
||||
The simplest way to get started with stex is to get this document to
|
||||
build (in the doc directory) and create your own document by cloning
|
||||
this document's source file (stex.stex) and make file (Makefile).
|
||||
If you've installed stex in your home directory, you should be able to
|
||||
build this document by running "make" without arguments in the doc
|
||||
directory.
|
||||
If you've installed stex elsewhere, you'll first have to modify the
|
||||
include for Mf-stex to reflect its installed location.
|
||||
|
||||
<p>
|
||||
Makefile is where you declare your stex sources and various other things,
|
||||
like bibtex and graphics files.
|
||||
If you don't have anything much more complicated than this document,
|
||||
you might just need to change the line that declares the main stex entry
|
||||
point, i.e., the line that reads <tt>x = stex</tt>, to reflect the name
|
||||
of your document.
|
||||
|
||||
<p>
|
||||
The make is orchestrated by Mf-stex, which knows how to run
|
||||
<b>scheme-prep</b>, <b>html-prep</b>, <b>pdflatex</b> (multiple
|
||||
times), and various other commands to produce both pdf and html versions
|
||||
of the stex document.
|
||||
|
||||
<p>
|
||||
You can also consult the more elaborate stex source and make files for the
|
||||
Chez Scheme User's Guide in the csug directory of a Chez Scheme release.
|
||||
|
||||
<p>
|
||||
|
||||
<a name="g3"></a>
|
||||
|
||||
|
||||
<h3><a name="./stex:h3"></a>4. Basic stex commands</h3>
|
||||
|
||||
|
||||
|
||||
|
||||
<p>
|
||||
|
||||
<a name="g4"></a>
|
||||
|
||||
|
||||
<h4><a name="./stex:h4"></a>4.1. Inline code</h4>
|
||||
|
||||
|
||||
|
||||
|
||||
<p>
|
||||
An stex document includes inline Scheme (or other) code via the
|
||||
<tt>\scheme</tt> command, e.g.:
|
||||
|
||||
<p>
|
||||
<blockquote>
|
||||
<pre>
|
||||
When called with two arguments, \scheme{cons} creates a pair of the two
|
||||
arguments, e.g., \scheme{(cons 3 4)} produces \scheme{(3 . 4)}.
|
||||
</pre>
|
||||
|
||||
|
||||
<p>
|
||||
</blockquote>
|
||||
|
||||
<p>
|
||||
produces:
|
||||
|
||||
<p>
|
||||
<blockquote>
|
||||
When called with two arguments, <tt>cons</tt> creates a pair of the two
|
||||
arguments, e.g., <tt>(cons 3 4)</tt> produces <tt>(3 . 4)</tt>.
|
||||
</blockquote>
|
||||
|
||||
<p>
|
||||
|
||||
<a name="g5"></a>
|
||||
|
||||
|
||||
<h4><a name="./stex:h5"></a>4.2. Code displays</h4>
|
||||
|
||||
|
||||
|
||||
|
||||
<p>
|
||||
An stex document includes out-of-line Scheme (or other) code via
|
||||
<tt>\schemedisplay</tt> and <tt>\endschemedisplay</tt>, e.g.:
|
||||
|
||||
<p>
|
||||
<blockquote>
|
||||
<pre>
|
||||
\schemedisplay
|
||||
(define fact
|
||||
(lambda (x)
|
||||
"a light year is a measure of distance"))
|
||||
|
||||
(define fib
|
||||
(lambda (x)
|
||||
"a light year is a measure of time"))
|
||||
\endschemedisplay
|
||||
</pre>
|
||||
|
||||
|
||||
<p>
|
||||
</blockquote>
|
||||
|
||||
<p>
|
||||
produces:
|
||||
|
||||
<p>
|
||||
<blockquote>
|
||||
|
||||
<p><tt>(define fact<br>
|
||||
|
||||
(lambda (x)<br>
|
||||
|
||||
"a light year is a measure of distance"))
|
||||
<br>
|
||||
<br>
|
||||
(define fib<br>
|
||||
|
||||
(lambda (x)<br>
|
||||
|
||||
"a light year is a measure of time"))</tt>
|
||||
<p></blockquote>
|
||||
|
||||
<p>
|
||||
Within a Scheme display, <tt>;=></tt> is converted into a double right arrow
|
||||
(<img src="math/stex/0.gif" alt="<graphic>">), <tt>;-></tt> into a single right arrow (<img src="math/stex/1.gif" alt="<graphic>">), and
|
||||
<tt>;==</tt> into a phantom of the same size.
|
||||
This is useful for showing what a piece of code translates or evaluates to,
|
||||
e.g.:
|
||||
|
||||
<p>
|
||||
<blockquote>
|
||||
<pre>
|
||||
A \scheme{let} expression expands into a call to a \scheme{lambda}
|
||||
expression, e.g.:
|
||||
\schemedisplay
|
||||
(let ([a 17]) ;-> ((lambda (a) (+ a a))
|
||||
(+ a a)) ;== 17)
|
||||
\endschemedisplay
|
||||
|
||||
A \scheme{let} expression first evaluates the right-hand-side
|
||||
expression, then evaluates the body in an environment that binds
|
||||
the left-hand-side variable to the resulting value, e.g.:
|
||||
\schemedisplay
|
||||
(let ([a 17]) ;=> 17
|
||||
(+ a a))
|
||||
\endschemedisplay
|
||||
</pre>
|
||||
|
||||
|
||||
<p>
|
||||
</blockquote>
|
||||
|
||||
<p>
|
||||
produces
|
||||
|
||||
<p>
|
||||
<blockquote>
|
||||
A <tt>let</tt> expression expands into a call to a <tt>lambda</tt>
|
||||
expression, e.g.:
|
||||
|
||||
<p><tt>(let ([a 17]) <img src="math/stex/1.gif" alt="<graphic>"> ((lambda (a) (+ a a))<br>
|
||||
|
||||
(+ a a)) <img src="gifs/ghostRightarrow.gif"> 17)</tt>
|
||||
<p>A <tt>let</tt> expression first evaluates the right-hand-side
|
||||
expression, then evaluates the body in an environment that binds
|
||||
the left-hand-side variable to the resulting value, e.g.:
|
||||
|
||||
<p><tt>(let ([a 17]) <img src="math/stex/0.gif" alt="<graphic>"> 17<br>
|
||||
|
||||
(+ a a))</tt>
|
||||
<p></blockquote>
|
||||
|
||||
<p>
|
||||
|
||||
<a name="g6"></a>
|
||||
|
||||
|
||||
<h4><a name="./stex:h6"></a>4.3. Variables</h4>
|
||||
|
||||
|
||||
|
||||
|
||||
<p>
|
||||
Code can include emphasized variables via the <tt>\var</tt> command, e.g.:
|
||||
|
||||
<p>
|
||||
<blockquote>
|
||||
<pre>
|
||||
\scheme{(let ([\var{x} \var{e}]) \var{body})} binds the variable \var{x} to
|
||||
the value of \var{e} in \var{body}.
|
||||
</pre>
|
||||
|
||||
|
||||
<p>
|
||||
</blockquote>
|
||||
|
||||
<p>
|
||||
produces:
|
||||
|
||||
<p>
|
||||
<blockquote>
|
||||
<tt>(let ([<i>x</i> <i>e</i>]) <i>body</i>)</tt> binds the variable <tt><i>x</i></tt> to
|
||||
the value of <tt><i>e</i></tt> in <tt><i>body</i></tt>.
|
||||
</blockquote>
|
||||
|
||||
<p>
|
||||
If the text within a <tt>\var</tt> form contains an underscore, the
|
||||
following character or bracketed subform is converted into a subscript,
|
||||
e.g., <tt>\var{abc_3}</tt>
|
||||
produces <tt><i>abc<sub>3</sub></i></tt>, and <tt>\var{7e5_16}</tt>
|
||||
produces <tt><i>7e5<sub>16</sub></i></tt>.
|
||||
|
||||
<p>
|
||||
<tt>\var</tt> forms may appear within a <tt>\scheme</tt> form, within a Scheme display
|
||||
formed by <tt>\schemedisplay</tt> and <tt>\endschemedisplay</tt> commands,
|
||||
or by itself outside of either.
|
||||
|
||||
<p>
|
||||
|
||||
<a name="g7"></a>
|
||||
|
||||
|
||||
<h4><a name="./stex:h7"></a>4.4. Raw text in code</h4>
|
||||
|
||||
|
||||
|
||||
|
||||
<p>
|
||||
Raw text can be included in code via the <tt>\raw</tt> command.
|
||||
For example:
|
||||
|
||||
<p>
|
||||
<blockquote>
|
||||
<pre>
|
||||
\schemedisplay
|
||||
(sqrt \raw{$x$}) \is \raw{$\sqrt{x}$}.
|
||||
\endschemedisplay
|
||||
</pre>
|
||||
|
||||
|
||||
<p>
|
||||
</blockquote>
|
||||
|
||||
<p>
|
||||
produces:
|
||||
|
||||
<p>
|
||||
<blockquote>
|
||||
|
||||
<p><tt>(sqrt <i>x</i>) <img src="math/stex/0.gif" alt="<graphic>"> <img src="math/stex/2.gif" alt="<graphic>">.</tt>
|
||||
<p></blockquote>
|
||||
|
||||
<p>
|
||||
|
||||
<a name="g8"></a>
|
||||
|
||||
|
||||
<h4><a name="./stex:h8"></a>4.5. Generated output</h4>
|
||||
|
||||
|
||||
|
||||
|
||||
<p>
|
||||
Output generated by a Scheme program can be inserted into the output via
|
||||
<tt>\generated</tt> and <tt>\endgenerated</tt> commands, e.g.:
|
||||
|
||||
<p>
|
||||
<blockquote>
|
||||
<pre>
|
||||
\generated
|
||||
(let ()
|
||||
(define fibs
|
||||
(lambda (x y n)
|
||||
(if (= n 0)
|
||||
'()
|
||||
(cons x (fibs y (+ x y) (- n 1))))))
|
||||
(let ([n 5])
|
||||
(printf "first ~r primes: ~{~s~^, ~}\n" n (fibs 0 1 n))))
|
||||
\endgenerated
|
||||
</pre>
|
||||
|
||||
|
||||
<p>
|
||||
</blockquote>
|
||||
|
||||
<p>
|
||||
produces:
|
||||
|
||||
<p>
|
||||
<blockquote>
|
||||
first five primes: 0, 1, 1, 2, 3
|
||||
|
||||
<p>
|
||||
</blockquote>
|
||||
|
||||
<p>
|
||||
|
||||
<a name="g9"></a>
|
||||
|
||||
|
||||
<h4><a name="./stex:h9"></a>4.6. Verbatim Scheme displays</h4>
|
||||
|
||||
|
||||
|
||||
|
||||
<p>
|
||||
When special features, like <tt>\var</tt> forms, need to be
|
||||
suppressed within a Scheme display, a document can use
|
||||
<tt>\schemeverbatim</tt> and <tt>\endschemeverbatim</tt> instead of
|
||||
<tt>\schemedisplay</tt> and <tt>\endschemedisplay</tt>.
|
||||
This document makes extensive use of this feature.
|
||||
|
||||
<p>
|
||||
|
||||
<a name="g10"></a>
|
||||
|
||||
|
||||
<h3><a name="./stex:h10"></a>5. Scheme transcripts</h3>
|
||||
|
||||
|
||||
|
||||
|
||||
<p>
|
||||
|
||||
<a name="g11"></a>
|
||||
|
||||
|
||||
<h4><a name="./stex:h11"></a>5.1. Automatic transcript generation</h4>
|
||||
|
||||
|
||||
|
||||
|
||||
<p>
|
||||
The <b>scheme-prep</b> package supports a
|
||||
<tt>\transcript</tt> command for automatically generating Scheme transcripts
|
||||
from input supplied in the document source.
|
||||
All text from the <tt>\transcript</tt> marker up to and including the
|
||||
<tt>\endtranscript</tt> marker is replaced with a transcript generated
|
||||
by supplying the intervening text as the input to a Scheme café (REPL).
|
||||
If the Scheme transcript needs to contain the sequence
|
||||
<tt>\endtranscript</tt>, a different terminator may be specified as an
|
||||
optional argument to <tt>\transcript</tt>.
|
||||
The terminator must be a backslash followed by one or more alphabetic
|
||||
characters, and is specified without the backslash in the optional argument.
|
||||
|
||||
<p>
|
||||
Three pairs of commands may be redefined to customize the typesetting
|
||||
of different elements within generated transcripts.
|
||||
To modify the typesetting of error messages, redefine <tt>\transerr</tt>
|
||||
and <tt>\endtranserr</tt>.
|
||||
To modify the typesetting of user input read from the current input port
|
||||
of the café, redefine <tt>\transin</tt> and <tt>\endtransin</tt>.
|
||||
To modify the typesetting of program output written to the current
|
||||
output port of new café, redefine <tt>\transout</tt> and
|
||||
<tt>\endtransout</tt>.
|
||||
|
||||
<p>
|
||||
For example, the following:
|
||||
|
||||
<p>
|
||||
<blockquote>
|
||||
<pre>
|
||||
\transcript
|
||||
(define f
|
||||
(lambda (x) ; indentation and comments are
|
||||
(if (zero? x) ; preserved in the transcript
|
||||
1
|
||||
(* x (f (- x 1))))))
|
||||
(values f (f 0) (f 5) (f 20))
|
||||
(trace f)
|
||||
(f 4)
|
||||
\endtranscript
|
||||
</pre>
|
||||
|
||||
|
||||
<p>
|
||||
</blockquote>
|
||||
|
||||
<p>
|
||||
produces:
|
||||
|
||||
<p>
|
||||
<blockquote>
|
||||
|
||||
<p><tt>> (define f<br>
|
||||
|
||||
(lambda (x) ; indentation and comments are<br>
|
||||
|
||||
(if (zero? x) ; preserved in the transcript<br>
|
||||
|
||||
1<br>
|
||||
|
||||
(* x (f (- x 1))))))<br>
|
||||
|
||||
> (values f (f 0) (f 5) (f 20))<br>
|
||||
|
||||
#<procedure f><br>
|
||||
|
||||
1<br>
|
||||
|
||||
120<br>
|
||||
|
||||
2432902008176640000<br>
|
||||
|
||||
> (trace f)<br>
|
||||
|
||||
(f)<br>
|
||||
|
||||
> (f 4)<br>
|
||||
|
||||
<font color="#0000ff">|(f 4)<br>
|
||||
|
||||
| (f 3)<br>
|
||||
|
||||
| |(f 2)<br>
|
||||
|
||||
| | (f 1)<br>
|
||||
|
||||
| | |(f 0)<br>
|
||||
|
||||
| | |1<br>
|
||||
|
||||
| | 1<br>
|
||||
|
||||
| |2<br>
|
||||
|
||||
| 6<br>
|
||||
|
||||
|24<br>
|
||||
|
||||
</font>24</tt>
|
||||
<p></blockquote>
|
||||
|
||||
<p>
|
||||
The following example shows how to specify a different transcript
|
||||
terminator and shows the default formatting imposed by <tt>\transerr</tt>,
|
||||
<tt>\transin</tt>, and <tt>\transout</tt>.
|
||||
|
||||
<p>
|
||||
<blockquote>
|
||||
<pre>
|
||||
\transcript[\stopthistranscript]
|
||||
#e4.5
|
||||
(begin (display "Enter a character: ") (read-char))
|
||||
(begin (display "Enter a character: ") (read-char))Z
|
||||
(begin (clear-input-port) (display "Enter a character: ") (read-char))
|
||||
Z
|
||||
(list (read-char) (read-char) (read-char))abc def
|
||||
(define silly-repl
|
||||
(lambda (prompt)
|
||||
(display prompt)
|
||||
(let ([x (read)])
|
||||
(unless (eof-object? x)
|
||||
(let ([result (eval x)])
|
||||
(unless (eq? result (void))
|
||||
(pretty-print result))
|
||||
(silly-repl prompt))))))
|
||||
(silly-repl "Enter a Scheme expression: ")
|
||||
(list 1
|
||||
2
|
||||
3)
|
||||
(silly-repl "Now what? ")
|
||||
(define interview
|
||||
(lambda ()
|
||||
(let* ([fname (begin (display "First name: ") (read))]
|
||||
[lname (begin (display "Last name: ") (read))])
|
||||
(printf "Hello ~a ~a!~%" fname lname))))
|
||||
(interview)
|
||||
john
|
||||
doe
|
||||
#!eof
|
||||
(printf "good to be back~%")
|
||||
#!eof
|
||||
\stopthistranscript
|
||||
</pre>
|
||||
|
||||
|
||||
<p>
|
||||
</blockquote>
|
||||
|
||||
<p>
|
||||
produces:
|
||||
|
||||
<p>
|
||||
<blockquote>
|
||||
|
||||
<p><tt>> #e4.5<br>
|
||||
|
||||
9/2<br>
|
||||
|
||||
> (begin (display "Enter a character: ") (read-char))<font color="#ff0000"><br>
|
||||
|
||||
</font><font color="#0000ff">Enter a character: </font>#\newline<br>
|
||||
|
||||
> (begin (display "Enter a character: ") (read-char))<font color="#ff0000">Z</font><br>
|
||||
|
||||
<font color="#0000ff">Enter a character: </font>#\Z<br>
|
||||
|
||||
> (begin (clear-input-port) (display "Enter a character: ") (read-char))<br>
|
||||
|
||||
<font color="#0000ff">Enter a character: </font><font color="#ff0000">Z</font><br>
|
||||
|
||||
#\Z<br>
|
||||
|
||||
> (list (read-char) (read-char) (read-char))<font color="#ff0000">abc</font> def<br>
|
||||
|
||||
(#\b #\c #\a)<br>
|
||||
|
||||
> <br>
|
||||
|
||||
Exception: variable def is not bound<br>
|
||||
|
||||
Type (debug) to enter the debugger.<br>
|
||||
|
||||
> (define silly-repl<br>
|
||||
|
||||
(lambda (prompt)<br>
|
||||
|
||||
(display prompt)<br>
|
||||
|
||||
(let ([x (read)])<br>
|
||||
|
||||
(unless (eof-object? x)<br>
|
||||
|
||||
(let ([result (eval x)])<br>
|
||||
|
||||
(unless (eq? result (void))<br>
|
||||
|
||||
(pretty-print result))<br>
|
||||
|
||||
(silly-repl prompt))))))<br>
|
||||
|
||||
> (silly-repl "Enter a Scheme expression: ")<font color="#ff0000"><br>
|
||||
|
||||
</font><font color="#0000ff">Enter a Scheme expression: </font><font color="#ff0000">(list 1<br>
|
||||
|
||||
</font> <font color="#ff0000"> 2<br>
|
||||
|
||||
</font> <font color="#ff0000"> 3)<br>
|
||||
|
||||
</font><font color="#0000ff">(1 2 3)<br>
|
||||
|
||||
Enter a Scheme expression: </font><font color="#ff0000">(silly-repl "Now what? ")<br>
|
||||
|
||||
</font><font color="#0000ff">Now what? </font><font color="#ff0000">(define interview<br>
|
||||
|
||||
</font> <font color="#ff0000"> (lambda ()<br>
|
||||
|
||||
</font> <font color="#ff0000"> (let* ([fname (begin (display "First name: ") (read))]<br>
|
||||
|
||||
</font> <font color="#ff0000"> [lname (begin (display "Last name: ") (read))])<br>
|
||||
|
||||
</font> <font color="#ff0000"> (printf "Hello ~a ~a!~%" fname lname))))<br>
|
||||
|
||||
</font><font color="#0000ff">Now what? </font><font color="#ff0000">(interview)<br>
|
||||
|
||||
</font><font color="#0000ff">First name: </font><font color="#ff0000">john<br>
|
||||
|
||||
</font><font color="#0000ff">Last name: </font><font color="#ff0000"> doe<br>
|
||||
|
||||
</font><font color="#0000ff">Hello john doe!<br>
|
||||
|
||||
Now what? </font><font color="#ff0000">#!eof<br>
|
||||
|
||||
</font><font color="#0000ff">Enter a Scheme expression: </font><font color="#ff0000">(printf "good to be back~%")<br>
|
||||
|
||||
</font><font color="#0000ff">good to be back<br>
|
||||
|
||||
Enter a Scheme expression: </font><font color="#ff0000">#!eof</font></tt>
|
||||
<p></blockquote>
|
||||
|
||||
<p>
|
||||
Transcripts do not include a trailing prompt by design.
|
||||
This is done in such a way that an explicitly displayed string that
|
||||
happens to look like the prompt is not suppressed.
|
||||
For example:
|
||||
|
||||
<p>
|
||||
<blockquote>
|
||||
<pre>
|
||||
\transcript
|
||||
(begin (display "> \n") (exit))
|
||||
\endtranscript
|
||||
</pre>
|
||||
|
||||
|
||||
<p>
|
||||
</blockquote>
|
||||
|
||||
<p>
|
||||
should leave the apparent prompt alone since it is generated as program
|
||||
output.
|
||||
|
||||
<p>
|
||||
<blockquote>
|
||||
|
||||
<p><tt>> (begin (display "> \n") (exit))<br>
|
||||
|
||||
<font color="#0000ff">> <br>
|
||||
|
||||
</font></tt>
|
||||
<p></blockquote>
|
||||
|
||||
<p>
|
||||
Prompt suppression works even with
|
||||
changes to <tt>waiter-prompt-string</tt>.
|
||||
For example:
|
||||
|
||||
<p>
|
||||
<blockquote>
|
||||
<pre>
|
||||
\transcript
|
||||
(waiter-prompt-string "antelope? ")
|
||||
"no thanks"
|
||||
\endtranscript
|
||||
</pre>
|
||||
|
||||
|
||||
<p>
|
||||
</blockquote>
|
||||
|
||||
<p>
|
||||
produces no trailing "antelope? " prompt:
|
||||
|
||||
<p>
|
||||
<blockquote>
|
||||
|
||||
<p><tt>> (waiter-prompt-string "antelope? ")<br>
|
||||
|
||||
antelope? "no thanks"<br>
|
||||
|
||||
"no thanks"</tt>
|
||||
<p></blockquote>
|
||||
|
||||
<p>
|
||||
|
||||
<a name="g12"></a>
|
||||
|
||||
|
||||
<h4><a name="./stex:h12"></a>5.2. Loading initialization code</h4>
|
||||
|
||||
|
||||
|
||||
|
||||
<p>
|
||||
The <tt>stex</tt> commands <tt>\schemeinit</tt> and <tt>\endschemeinit</tt>
|
||||
are used to bracket Scheme expressions that should be evaluated without
|
||||
generating a transcript of the results.
|
||||
This is useful, for example, when writing the description of a programming
|
||||
assignment. The solutions can be loaded via <tt>\schemeinit</tt> and a
|
||||
transcript showing how the solutions behave can be generated using the
|
||||
<tt>\transcript</tt> command.
|
||||
|
||||
<p>
|
||||
For example, the following text:
|
||||
|
||||
<p>
|
||||
<blockquote>
|
||||
<pre>
|
||||
\schemeinit
|
||||
(waiter-prompt-string ">") ; restore the original prompt setting so we
|
||||
; don't get "antelope?" as the prompt
|
||||
(define compute-length
|
||||
(lambda (x)
|
||||
(cond
|
||||
[(list? x) (length x)]
|
||||
[(vector? x) (vector-length x)]
|
||||
[(string? x) (string-length x)]
|
||||
[else (errorf 'compute-length "cannot handle ~s" ls)])))
|
||||
\endschemeinit
|
||||
\emph{The \scheme{compute-length} procedure behaves as follows:}
|
||||
\transcript
|
||||
(compute-length '())
|
||||
(compute-length '(a b c))
|
||||
(compute-length "abcd")
|
||||
(compute-length (vector 1 2 3 4 5 6))
|
||||
(compute-length compute-length)
|
||||
\endtranscript
|
||||
</pre>
|
||||
|
||||
|
||||
<p>
|
||||
</blockquote>
|
||||
|
||||
<p>
|
||||
produces the output shown below.
|
||||
|
||||
<p>
|
||||
<blockquote>
|
||||
|
||||
<p>
|
||||
<i>The <tt>compute-length</tt> procedure behaves as follows:</i>
|
||||
|
||||
<p><tt>> (compute-length '())<br>
|
||||
|
||||
0<br>
|
||||
|
||||
> (compute-length '(a b c))<br>
|
||||
|
||||
3<br>
|
||||
|
||||
> (compute-length "abcd")<br>
|
||||
|
||||
4<br>
|
||||
|
||||
> (compute-length (vector 1 2 3 4 5 6))<br>
|
||||
|
||||
6<br>
|
||||
|
||||
> (compute-length compute-length)
|
||||
<br>
|
||||
<br>
|
||||
Exception in compute-length: cannot handle #<procedure compute-length><br>
|
||||
|
||||
Type (debug) to enter the debugger.</tt>
|
||||
<p></blockquote>
|
||||
|
||||
<p>
|
||||
the last line of input intentionally causes an error, which is
|
||||
displayed just as it would be displayed in a café.
|
||||
|
||||
<p>
|
||||
|
||||
<a name="g13"></a>
|
||||
|
||||
|
||||
<h3><a name="./stex:h13"></a>6. html-prep support for the <tt>tabular</tt> environment</h3>
|
||||
|
||||
|
||||
|
||||
|
||||
<p>
|
||||
Support for tables comes with a few caveats:
|
||||
|
||||
<p>
|
||||
<ol>
|
||||
<a name="g14"></a><li><tt>@{}</tt> directives within <tt>tabular</tt>
|
||||
column specifiers are flat-out ignored for the time being.
|
||||
<a name="g15"></a><li><tt>|</tt> directives within <tt>tabular</tt>
|
||||
column specifiers are essentially ignored. Their only effect is
|
||||
to globally enable borders for the entire HTML table.
|
||||
<a name="g16"></a><li><tt>\hrule</tt> and <tt>\cline</tt> are not yet implemented.
|
||||
<a name="g17"></a><li>no warranty is expressed or implied.
|
||||
</ol>
|
||||
<p>
|
||||
|
||||
<p>
|
||||
The following code:
|
||||
|
||||
<p>
|
||||
<blockquote>
|
||||
<pre>
|
||||
\begin{tabular}{rcl|r}
|
||||
y &=& f(x) & without loss of generality \\
|
||||
z & \multicolumn{2}{r}{whee} & this is fun? \\
|
||||
\multicolumn{4}{c}{
|
||||
\begin{tabular}{cc}
|
||||
1 & 2 \\
|
||||
3 & 4
|
||||
\end{tabular}
|
||||
} \\
|
||||
a & b & c & d \\
|
||||
12345 & z & \multicolumn{2}{l}{\scheme{(define~x~"foo")}}
|
||||
\end{tabular}
|
||||
</pre>
|
||||
|
||||
</blockquote>
|
||||
|
||||
<p>
|
||||
generates this table:
|
||||
|
||||
<p>
|
||||
<blockquote>
|
||||
<TABLE border="1"><TR><TD nowrap align="right">
|
||||
y </TD><TD nowrap align="center">=</TD><TD nowrap align="left"> f(x) </TD><TD nowrap align="right"> without loss of generality </TD></TR><TR><TD nowrap align="right">
|
||||
z </TD><TD nowrap colspan="2" align="right"> whee </TD><TD nowrap align="left"> this is fun? </TD></TR><TR><TD nowrap colspan="4" align="center">
|
||||
|
||||
<TABLE><TR><TD nowrap align="center">
|
||||
1 </TD><TD nowrap align="center"> 2 </TD></TR><TR><TD nowrap align="center">
|
||||
3 </TD><TD nowrap align="center"> 4
|
||||
</TD></TR></TABLE>
|
||||
</TD></TR><TR><TD nowrap align="right">
|
||||
a </TD><TD nowrap align="center"> b </TD><TD nowrap align="left"> c </TD><TD nowrap align="right"> d </TD></TR><TR><TD nowrap align="right">
|
||||
12345 </TD><TD nowrap align="center"> z </TD><TD nowrap colspan="2" align="left"> <tt>(define x "foo")</tt>
|
||||
</TD></TR></TABLE>
|
||||
</blockquote>
|
||||
|
||||
<p>
|
||||
|
||||
|
||||
© 1998-2016 R. Kent Dybvig and Oscar Waddell</body>
|
||||
</html>
|
BIN
stex/doc/stex.pdf
Normal file
BIN
stex/doc/stex.pdf
Normal file
Binary file not shown.
603
stex/doc/stex.stex
Normal file
603
stex/doc/stex.stex
Normal file
|
@ -0,0 +1,603 @@
|
|||
\documentclass{monograph}
|
||||
|
||||
\usepackage{scheme}
|
||||
|
||||
\iflatex
|
||||
\usepackage{fullpage}
|
||||
\pagestyle{plain}
|
||||
\fi
|
||||
|
||||
\ifhtml
|
||||
\documenttitle[stex.css]{Introduction to stex}
|
||||
\fi
|
||||
|
||||
\begin{document}
|
||||
\title{Introduction to stex}
|
||||
\author{R. Kent Dybvig and Oscar Waddell}
|
||||
\date{April 2016}
|
||||
\maketitle
|
||||
\def\copyrightnotice{\copyright~1998--2016 R. Kent Dybvig and Oscar Waddell}
|
||||
|
||||
\ifhtml
|
||||
\tableofcontents
|
||||
\fi
|
||||
|
||||
\iflatex
|
||||
% block paragraphs
|
||||
\setlength\parskip{4pt plus 1pt}
|
||||
\setlength\parindent{0pt}
|
||||
\renewenvironment{quotation}
|
||||
{\list{}{\listparindent 1.5em%
|
||||
\itemindent 0pt%
|
||||
\rightmargin \leftmargin
|
||||
\parsep 0pt plus 1pt}%
|
||||
\item\relax}
|
||||
{\endlist}
|
||||
\fi
|
||||
|
||||
\section{Overview}
|
||||
|
||||
The \emph{stex} package consists of two main programs and some supporting
|
||||
items, such as make files, make-file templates, class files, and style
|
||||
files.
|
||||
The two main programs are \textbf{scheme-prep} and \textbf{html-prep}.
|
||||
\textbf{scheme-prep} performs a conversion from ``stex''-formatted files
|
||||
into latex-formatted files, while \textbf{html-prep} converts (some)
|
||||
latex-formatted files into html-formatted files.
|
||||
|
||||
An stex file is really just a latex file extended with a handful of
|
||||
commands for including Scheme code (or pretty much any other kind of code,
|
||||
as long as you don't plan to use the Scheme-specific transcript support)
|
||||
in a document, plus a couple of additional features rather arbitrarily
|
||||
thrown in.
|
||||
|
||||
The subset of latex-formatted files \textbf{html-prep} is capable of
|
||||
handling is rather small but has nevertheless been useful for our
|
||||
purposes, which include producing html versions of a couple of books
|
||||
(\emph{The Scheme Programming Language}, Editions 2--4 and the Chez Scheme
|
||||
User's Guides for Versions 6--9), the scheme.com web site, class websites,
|
||||
class assignments, and various other documents.
|
||||
|
||||
\section{Installation}
|
||||
|
||||
A prerequisite to building and using stex is to have Chez Scheme or
|
||||
Petite Chez Scheme installed on your system.
|
||||
You'll also need pdflatex, dvips, ghostscript, and netbpm.
|
||||
We've run stex under Linux and OS X but have not tried to run it under
|
||||
Windows.
|
||||
|
||||
The simplest way to install stex for your personal use is to clone the
|
||||
stex directory into your home directory, cd into the stex directory,
|
||||
and run make:
|
||||
|
||||
\schemedisplay
|
||||
make BIN=\var{bindir}
|
||||
\endschemedisplay
|
||||
|
||||
where \var{bindir} is the directory where make will find the scheme or
|
||||
petite executables.
|
||||
|
||||
This will create a subdirectory, named for the installed Chez Scheme
|
||||
machine type, containing binary versions of the programs.
|
||||
|
||||
You can also use ``make install'' to make stex available for other users.
|
||||
|
||||
\schemedisplay
|
||||
sudo make install BIN=\var{bindir} LIB=\var{libdir}
|
||||
\endschemedisplay
|
||||
|
||||
where \var{bindir} is as described above, and \var{libdir} is the
|
||||
directory where the stex library directory should be installed.
|
||||
|
||||
\section{Usage notes}
|
||||
|
||||
The simplest way to get started with stex is to get this document to
|
||||
build (in the doc directory) and create your own document by cloning
|
||||
this document's source file (stex.stex) and make file (Makefile).
|
||||
If you've installed stex in your home directory, you should be able to
|
||||
build this document by running ``make'' without arguments in the doc
|
||||
directory.
|
||||
If you've installed stex elsewhere, you'll first have to modify the
|
||||
include for Mf-stex to reflect its installed location.
|
||||
|
||||
Makefile is where you declare your stex sources and various other things,
|
||||
like bibtex and graphics files.
|
||||
If you don't have anything much more complicated than this document,
|
||||
you might just need to change the line that declares the main stex entry
|
||||
point, i.e., the line that reads \scheme{x = stex}, to reflect the name
|
||||
of your document.
|
||||
|
||||
The make is orchestrated by Mf-stex, which knows how to run
|
||||
\textbf{scheme-prep}, \textbf{html-prep}, \textbf{pdflatex} (multiple
|
||||
times), and various other commands to produce both pdf and html versions
|
||||
of the stex document.
|
||||
|
||||
You can also consult the more elaborate stex source and make files for the
|
||||
Chez Scheme User's Guide in the csug directory of a Chez Scheme release.
|
||||
|
||||
\section{Basic stex commands}
|
||||
|
||||
\subsection{Inline code}
|
||||
|
||||
An stex document includes inline Scheme (or other) code via the
|
||||
\scheme{\scheme} command, e.g.:
|
||||
|
||||
\begin{quotation}
|
||||
\schemeverbatim
|
||||
When called with two arguments, \scheme{cons} creates a pair of the two
|
||||
arguments, e.g., \scheme{(cons 3 4)} produces \scheme{(3 . 4)}.
|
||||
\endschemeverbatim
|
||||
\end{quotation}
|
||||
|
||||
produces:
|
||||
|
||||
\begin{quotation}
|
||||
When called with two arguments, \scheme{cons} creates a pair of the two
|
||||
arguments, e.g., \scheme{(cons 3 4)} produces \scheme{(3 . 4)}.
|
||||
\end{quotation}
|
||||
|
||||
\subsection{Code displays}
|
||||
|
||||
An stex document includes out-of-line Scheme (or other) code via
|
||||
\scheme{\schemedisplay} and \scheme{\endschemedisplay}, e.g.:
|
||||
|
||||
\begin{quotation}
|
||||
\schemeverbatim
|
||||
\schemedisplay
|
||||
(define fact
|
||||
(lambda (x)
|
||||
"a light year is a measure of distance"))
|
||||
|
||||
(define fib
|
||||
(lambda (x)
|
||||
"a light year is a measure of time"))
|
||||
\endschemedisplay
|
||||
\endschemeverbatim
|
||||
\end{quotation}
|
||||
|
||||
produces:
|
||||
|
||||
\begin{quotation}
|
||||
\schemedisplay
|
||||
(define fact
|
||||
(lambda (x)
|
||||
"a light year is a measure of distance"))
|
||||
|
||||
(define fib
|
||||
(lambda (x)
|
||||
"a light year is a measure of time"))
|
||||
\endschemedisplay
|
||||
\end{quotation}
|
||||
|
||||
Within a Scheme display, \scheme{;=>} is converted into a double right arrow
|
||||
($\Rightarrow$), \scheme{;->} into a single right arrow ($\rightarrow$), and
|
||||
\scheme{;==} into a phantom of the same size.
|
||||
This is useful for showing what a piece of code translates or evaluates to,
|
||||
e.g.:
|
||||
|
||||
\begin{quotation}
|
||||
\schemeverbatim
|
||||
A \scheme{let} expression expands into a call to a \scheme{lambda}
|
||||
expression, e.g.:
|
||||
\schemedisplay
|
||||
(let ([a 17]) ;-> ((lambda (a) (+ a a))
|
||||
(+ a a)) ;== 17)
|
||||
\endschemedisplay
|
||||
|
||||
A \scheme{let} expression first evaluates the right-hand-side
|
||||
expression, then evaluates the body in an environment that binds
|
||||
the left-hand-side variable to the resulting value, e.g.:
|
||||
\schemedisplay
|
||||
(let ([a 17]) ;=> 17
|
||||
(+ a a))
|
||||
\endschemedisplay
|
||||
\endschemeverbatim
|
||||
\end{quotation}
|
||||
|
||||
produces
|
||||
|
||||
\begin{quotation}
|
||||
A \scheme{let} expression expands into a call to a \scheme{lambda}
|
||||
expression, e.g.:
|
||||
\schemedisplay
|
||||
(let ([a 17]) ;-> ((lambda (a) (+ a a))
|
||||
(+ a a)) ;== 17)
|
||||
\endschemedisplay
|
||||
|
||||
A \scheme{let} expression first evaluates the right-hand-side
|
||||
expression, then evaluates the body in an environment that binds
|
||||
the left-hand-side variable to the resulting value, e.g.:
|
||||
\schemedisplay
|
||||
(let ([a 17]) ;=> 17
|
||||
(+ a a))
|
||||
\endschemedisplay
|
||||
\end{quotation}
|
||||
|
||||
\subsection{Variables}
|
||||
|
||||
Code can include emphasized variables via the \scheme{\raw{{\schbackslash}var}} command, e.g.:
|
||||
|
||||
\begin{quotation}
|
||||
\schemeverbatim
|
||||
\scheme{(let ([\var{x} \var{e}]) \var{body})} binds the variable \var{x} to
|
||||
the value of \var{e} in \var{body}.
|
||||
\endschemeverbatim
|
||||
\end{quotation}
|
||||
|
||||
produces:
|
||||
|
||||
\begin{quotation}
|
||||
\scheme{(let ([\var{x} \var{e}]) \var{body})} binds the variable \var{x} to
|
||||
the value of \var{e} in \var{body}.
|
||||
\end{quotation}
|
||||
|
||||
If the text within a \scheme{\raw{{\schbackslash}var}} form contains an underscore, the
|
||||
following character or bracketed subform is converted into a subscript,
|
||||
e.g., \scheme{\raw{{\schbackslash}var{\schlbrace}abc\_3{\schrbrace}}}
|
||||
produces \var{abc_3}, and \scheme{\raw{{\schbackslash}var{\schlbrace}7e5\_{16}{\schrbrace}}}
|
||||
produces \var{7e5_{16}}.
|
||||
|
||||
\scheme{\raw{{\schbackslash}var}} forms may appear within a \scheme{\scheme} form, within a Scheme display
|
||||
formed by \scheme{\schemedisplay} and \scheme{\endschemedisplay} commands,
|
||||
or by itself outside of either.
|
||||
|
||||
\subsection{Raw text in code}
|
||||
|
||||
Raw text can be included in code via the \scheme{\raw{{\schbackslash}raw}} command.
|
||||
For example:
|
||||
|
||||
\begin{quotation}
|
||||
\schemeverbatim
|
||||
\schemedisplay
|
||||
(sqrt \raw{$x$}) \is \raw{$\sqrt{x}$}.
|
||||
\endschemedisplay
|
||||
\endschemeverbatim
|
||||
\end{quotation}
|
||||
|
||||
produces:
|
||||
|
||||
\begin{quotation}
|
||||
\schemedisplay
|
||||
(sqrt \raw{$x$}) ;=> \raw{$\sqrt{x}$}.
|
||||
\endschemedisplay
|
||||
\end{quotation}
|
||||
|
||||
\subsection{Generated output}
|
||||
|
||||
Output generated by a Scheme program can be inserted into the output via
|
||||
\scheme{\generated} and \scheme{\endgenerated} commands, e.g.:
|
||||
|
||||
\begin{quotation}
|
||||
\schemeverbatim
|
||||
\generated
|
||||
(let ()
|
||||
(define fibs
|
||||
(lambda (x y n)
|
||||
(if (= n 0)
|
||||
'()
|
||||
(cons x (fibs y (+ x y) (- n 1))))))
|
||||
(let ([n 5])
|
||||
(printf "first ~r primes: ~{~s~^, ~}\n" n (fibs 0 1 n))))
|
||||
\endgenerated
|
||||
\endschemeverbatim
|
||||
\end{quotation}
|
||||
|
||||
produces:
|
||||
|
||||
\begin{quotation}
|
||||
\generated
|
||||
(let ()
|
||||
(define fibs
|
||||
(lambda (x y n)
|
||||
(if (= n 0)
|
||||
'()
|
||||
(cons x (fibs y (+ x y) (- n 1))))))
|
||||
(let ([n 5])
|
||||
(printf "first ~r primes: ~{~s~^, ~}\n" n (fibs 0 1 n))))
|
||||
\endgenerated
|
||||
\end{quotation}
|
||||
|
||||
\subsection{Verbatim Scheme displays}
|
||||
|
||||
When special features, like \scheme{\raw{{\schbackslash}var}} forms, need to be
|
||||
suppressed within a Scheme display, a document can use
|
||||
\scheme{\schemeverbatim} and \scheme{\endschemeverbatim} instead of
|
||||
\scheme{\schemedisplay} and \scheme{\endschemedisplay}.
|
||||
This document makes extensive use of this feature.
|
||||
|
||||
\section{Scheme transcripts}
|
||||
|
||||
\subsection{Automatic transcript generation}
|
||||
|
||||
The \textbf{scheme-prep} package supports a
|
||||
\scheme{\transcript} command for automatically generating Scheme transcripts
|
||||
from input supplied in the document source.
|
||||
All text from the \scheme{\transcript} marker up to and including the
|
||||
\scheme{\endtranscript} marker is replaced with a transcript generated
|
||||
by supplying the intervening text as the input to a Scheme caf\'e (REPL).
|
||||
If the Scheme transcript needs to contain the sequence
|
||||
\scheme{\endtranscript}, a different terminator may be specified as an
|
||||
optional argument to \scheme{\transcript}.
|
||||
The terminator must be a backslash followed by one or more alphabetic
|
||||
characters, and is specified without the backslash in the optional argument.
|
||||
|
||||
Three pairs of commands may be redefined to customize the typesetting
|
||||
of different elements within generated transcripts.
|
||||
To modify the typesetting of error messages, redefine \scheme{\transerr}
|
||||
and \scheme{\endtranserr}.
|
||||
To modify the typesetting of user input read from the current input port
|
||||
of the caf\'e, redefine \scheme{\transin} and \scheme{\endtransin}.
|
||||
To modify the typesetting of program output written to the current
|
||||
output port of new caf\'e, redefine \scheme{\transout} and
|
||||
\scheme{\endtransout}.
|
||||
|
||||
For example, the following:
|
||||
|
||||
\begin{quotation}
|
||||
\schemeverbatim
|
||||
\transcript
|
||||
(define f
|
||||
(lambda (x) ; indentation and comments are
|
||||
(if (zero? x) ; preserved in the transcript
|
||||
1
|
||||
(* x (f (- x 1))))))
|
||||
(values f (f 0) (f 5) (f 20))
|
||||
(trace f)
|
||||
(f 4)
|
||||
\endtranscript
|
||||
\endschemeverbatim
|
||||
\end{quotation}
|
||||
|
||||
produces:
|
||||
|
||||
\begin{quotation}
|
||||
\transcript
|
||||
(define f
|
||||
(lambda (x) ; indentation and comments are
|
||||
(if (zero? x) ; preserved in the transcript
|
||||
1
|
||||
(* x (f (- x 1))))))
|
||||
(values f (f 0) (f 5) (f 20))
|
||||
(trace f)
|
||||
(f 4)
|
||||
\endtranscript
|
||||
\end{quotation}
|
||||
|
||||
The following example shows how to specify a different transcript
|
||||
terminator and shows the default formatting imposed by \scheme{\transerr},
|
||||
\scheme{\transin}, and \scheme{\transout}.
|
||||
|
||||
\begin{quotation}
|
||||
\schemeverbatim
|
||||
\transcript[\stopthistranscript]
|
||||
#e4.5
|
||||
(begin (display "Enter a character: ") (read-char))
|
||||
(begin (display "Enter a character: ") (read-char))Z
|
||||
(begin (clear-input-port) (display "Enter a character: ") (read-char))
|
||||
Z
|
||||
(list (read-char) (read-char) (read-char))abc def
|
||||
(define silly-repl
|
||||
(lambda (prompt)
|
||||
(display prompt)
|
||||
(let ([x (read)])
|
||||
(unless (eof-object? x)
|
||||
(let ([result (eval x)])
|
||||
(unless (eq? result (void))
|
||||
(pretty-print result))
|
||||
(silly-repl prompt))))))
|
||||
(silly-repl "Enter a Scheme expression: ")
|
||||
(list 1
|
||||
2
|
||||
3)
|
||||
(silly-repl "Now what? ")
|
||||
(define interview
|
||||
(lambda ()
|
||||
(let* ([fname (begin (display "First name: ") (read))]
|
||||
[lname (begin (display "Last name: ") (read))])
|
||||
(printf "Hello ~a ~a!~%" fname lname))))
|
||||
(interview)
|
||||
john
|
||||
doe
|
||||
#!eof
|
||||
(printf "good to be back~%")
|
||||
#!eof
|
||||
\stopthistranscript
|
||||
\endschemeverbatim
|
||||
\end{quotation}
|
||||
|
||||
produces:
|
||||
|
||||
\begin{quotation}
|
||||
\transcript[\stopthistranscript]
|
||||
#e4.5
|
||||
(begin (display "Enter a character: ") (read-char))
|
||||
(begin (display "Enter a character: ") (read-char))Z
|
||||
(begin (clear-input-port) (display "Enter a character: ") (read-char))
|
||||
Z
|
||||
(list (read-char) (read-char) (read-char))abc def
|
||||
(define silly-repl
|
||||
(lambda (prompt)
|
||||
(display prompt)
|
||||
(let ([x (read)])
|
||||
(unless (eof-object? x)
|
||||
(let ([result (eval x)])
|
||||
(unless (eq? result (void))
|
||||
(pretty-print result))
|
||||
(silly-repl prompt))))))
|
||||
(silly-repl "Enter a Scheme expression: ")
|
||||
(list 1
|
||||
2
|
||||
3)
|
||||
(silly-repl "Now what? ")
|
||||
(define interview
|
||||
(lambda ()
|
||||
(let* ([fname (begin (display "First name: ") (read))]
|
||||
[lname (begin (display "Last name: ") (read))])
|
||||
(printf "Hello ~a ~a!~%" fname lname))))
|
||||
(interview)
|
||||
john
|
||||
doe
|
||||
#!eof
|
||||
(printf "good to be back~%")
|
||||
#!eof
|
||||
\stopthistranscript
|
||||
\end{quotation}
|
||||
|
||||
Transcripts do not include a trailing prompt by design.
|
||||
This is done in such a way that an explicitly displayed string that
|
||||
happens to look like the prompt is not suppressed.
|
||||
For example:
|
||||
|
||||
\begin{quotation}
|
||||
\schemeverbatim
|
||||
\transcript
|
||||
(begin (display "> \n") (exit))
|
||||
\endtranscript
|
||||
\endschemeverbatim
|
||||
\end{quotation}
|
||||
|
||||
should leave the apparent prompt alone since it is generated as program
|
||||
output.
|
||||
|
||||
\begin{quotation}
|
||||
\transcript
|
||||
(begin (display "> \n") (exit))
|
||||
\endtranscript
|
||||
\end{quotation}
|
||||
|
||||
Prompt suppression works even with
|
||||
changes to \scheme{waiter-prompt-string}.
|
||||
For example:
|
||||
|
||||
\begin{quotation}
|
||||
\schemeverbatim
|
||||
\transcript
|
||||
(waiter-prompt-string "antelope? ")
|
||||
"no thanks"
|
||||
\endtranscript
|
||||
\endschemeverbatim
|
||||
\end{quotation}
|
||||
|
||||
produces no trailing "antelope? " prompt:
|
||||
|
||||
\begin{quotation}
|
||||
\transcript
|
||||
(waiter-prompt-string "antelope? ")
|
||||
"no thanks"
|
||||
\endtranscript
|
||||
\end{quotation}
|
||||
|
||||
\subsection{Loading initialization code}
|
||||
|
||||
The \scheme{stex} commands \scheme{\schemeinit} and \scheme{\endschemeinit}
|
||||
are used to bracket Scheme expressions that should be evaluated without
|
||||
generating a transcript of the results.
|
||||
This is useful, for example, when writing the description of a programming
|
||||
assignment. The solutions can be loaded via \scheme{\schemeinit} and a
|
||||
transcript showing how the solutions behave can be generated using the
|
||||
\scheme{\transcript} command.
|
||||
|
||||
For example, the following text:
|
||||
|
||||
\begin{quotation}
|
||||
\schemeverbatim
|
||||
\schemeinit
|
||||
(waiter-prompt-string ">") ; restore the original prompt setting so we
|
||||
; don't get "antelope?" as the prompt
|
||||
(define compute-length
|
||||
(lambda (x)
|
||||
(cond
|
||||
[(list? x) (length x)]
|
||||
[(vector? x) (vector-length x)]
|
||||
[(string? x) (string-length x)]
|
||||
[else (errorf 'compute-length "cannot handle ~s" ls)])))
|
||||
\endschemeinit
|
||||
\emph{The \scheme{compute-length} procedure behaves as follows:}
|
||||
\transcript
|
||||
(compute-length '())
|
||||
(compute-length '(a b c))
|
||||
(compute-length "abcd")
|
||||
(compute-length (vector 1 2 3 4 5 6))
|
||||
(compute-length compute-length)
|
||||
\endtranscript
|
||||
\endschemeverbatim
|
||||
\end{quotation}
|
||||
|
||||
produces the output shown below.
|
||||
|
||||
\begin{quotation}
|
||||
\schemeinit
|
||||
(waiter-prompt-string ">") ; restore the original prompt setting so we
|
||||
; don't get "antelope?" as the prompt
|
||||
(define compute-length
|
||||
(lambda (x)
|
||||
(cond
|
||||
[(list? x) (length x)]
|
||||
[(vector? x) (vector-length x)]
|
||||
[(string? x) (string-length x)]
|
||||
[else (errorf 'compute-length "cannot handle ~s" x)])))
|
||||
\endschemeinit
|
||||
\emph{The \scheme{compute-length} procedure behaves as follows:}
|
||||
\transcript
|
||||
(compute-length '())
|
||||
(compute-length '(a b c))
|
||||
(compute-length "abcd")
|
||||
(compute-length (vector 1 2 3 4 5 6))
|
||||
(compute-length compute-length)
|
||||
\endtranscript
|
||||
\end{quotation}
|
||||
|
||||
the last line of input intentionally causes an error, which is
|
||||
displayed just as it would be displayed in a caf\'e.
|
||||
|
||||
\section{html-prep support for the \texttt{tabular} environment}
|
||||
|
||||
Support for tables comes with a few caveats:
|
||||
|
||||
\begin{enumerate}
|
||||
\item \scheme{@\schlbrace\schrbrace} directives within \scheme{tabular}
|
||||
column specifiers are flat-out ignored for the time being.
|
||||
\item \scheme{|} directives within \scheme{tabular}
|
||||
column specifiers are essentially ignored. Their only effect is
|
||||
to globally enable borders for the entire HTML table.
|
||||
\item \scheme{\hrule} and \scheme{\cline} are not yet implemented.
|
||||
\item no warranty is expressed or implied.
|
||||
\end{enumerate}
|
||||
|
||||
The following code:
|
||||
|
||||
\begin{quotation}
|
||||
\begin{verbatim}
|
||||
\begin{tabular}{rcl|r}
|
||||
y &=& f(x) & without loss of generality \\
|
||||
z & \multicolumn{2}{r}{whee} & this is fun? \\
|
||||
\multicolumn{4}{c}{
|
||||
\begin{tabular}{cc}
|
||||
1 & 2 \\
|
||||
3 & 4
|
||||
\end{tabular}
|
||||
} \\
|
||||
a & b & c & d \\
|
||||
12345 & z & \multicolumn{2}{l}{\scheme{(define x "foo")}}
|
||||
\end{tabular}
|
||||
\end{verbatim}
|
||||
\end{quotation}
|
||||
|
||||
generates this table:
|
||||
|
||||
\begin{quotation}
|
||||
\begin{tabular}{rcl|r}
|
||||
y &=& f(x) & without loss of generality \\
|
||||
z & \multicolumn{2}{r}{whee} & this is fun? \\
|
||||
\multicolumn{4}{c}{
|
||||
\begin{tabular}{cc}
|
||||
1 & 2 \\
|
||||
3 & 4
|
||||
\end{tabular}
|
||||
} \\
|
||||
a & b & c & d \\
|
||||
12345 & z & \multicolumn{2}{l}{\scheme{(define x "foo")}}
|
||||
\end{tabular}
|
||||
\end{quotation}
|
||||
|
||||
\end{document}
|
Reference in a new issue