racket/collects/eopl/eopl.scrbl

236 lines
8.4 KiB
Racket

#lang scribble/doc
@(require scribble/manual
scribble/struct
scheme/list
(for-label eopl/eopl
scheme/contract
(only-in scheme printf pretty-print delay force)))
@(define-syntax-rule (def-mz id)
(begin
(require (for-label mzscheme))
(define id (scheme provide))))
@(def-mz mzscheme-provide)
@(define-syntax-rule (reprovide id ...)
(*threecolumns (list (scheme id) ... 'nbsp 'nbsp)))
@(define (*threecolumns l)
(let* ([len (length l)]
[third (quotient len 3)]
[a (take l third)]
[b (take (list-tail l third) third)]
[c (list-tail l (* 2 third))]
[spacer (hspace 2)]
[to-flow (compose make-flow list make-paragraph list)])
(make-table #f
(map (lambda (a b c)
(list (to-flow spacer)
(to-flow a)
(to-flow spacer)
(to-flow b)
(to-flow spacer)
(to-flow c)))
a b c))))
@title{@italic{Essentials of Programming Languages} Language}
The @italic{Essentials of Programming Languages} language in DrScheme
provides a subset of functions and syntactic forms of
@schememodname[mzscheme]---mostly the ones that correspond to
@scheme[r5rs] forms. See below for a complete list. The
language is intended for use with the textbook @cite["EoPL"].
@defmodule[eopl/eopl]
The following bindings are re-@scheme[provide]d from
@schememodname[mzscheme]:
@reprovide[
make-parameter
parameterize
print-struct
unquote unquote-splicing
quote quasiquote if
lambda letrec define-syntax delay let let* let-syntax letrec-syntax
and or cond case do
begin set!
#%module-begin
#%app #%datum #%top #%top-interaction
#%require #%provide #%expression
syntax-rules ...
cons car cdr pair? map for-each
caar cadr cdar cddr
caaar caadr cadar caddr cdaar cdadr cddar cdddr
caaaar caaadr caadar caaddr cadaar cadadr caddar cadddr
cdaaar cdaadr cdadar cdaddr cddaar cddadr cdddar cddddr
= < > <= >= max min + - * /
abs gcd lcm exp log sin cos tan not eq?
make-string
symbol->string string->symbol make-rectangular
exact->inexact inexact->exact number->string string->number
rationalize output-port? current-input-port current-output-port current-error-port
open-input-file open-output-file close-input-port close-output-port
with-output-to-file transcript-on transcript-off flush-output
string-length string-ci<=? string-ci>=? string-append
string-fill!
string->list list->string
vector-length vector-fill!
vector->list list->vector
char-alphabetic? char-numeric? char-whitespace?
char-upper-case? char-lower-case? char->integer integer->char char-downcase
call-with-output-file call-with-input-file with-input-from-file
apply symbol?
null?
list? list length append reverse list-tail
list-ref memq memv member assq assv assoc
procedure?
number? complex? real? rational? integer? exact? inexact? zero?
positive? negative? odd? even?
quotient remainder modulo floor ceiling truncate round
numerator denominator asin acos atan sqrt
expt make-polar real-part imag-part angle magnitude input-port?
read read-char peek-char eof-object?
char-ready?
write display
newline write-char load
string? string string-ref string-set! string=? substring string-copy
string-ci=? string<? string>? string<=? string>=? string-ci<? string-ci>?
vector? make-vector vector vector-ref vector-set!
char? char=? char<? char>? char<=? char>=?
char-ci=? char-ci<? char-ci>? char-ci<=? char-ci>=?
char-upcase boolean? eqv? equal?
force
call-with-values values dynamic-wind
eval]
@defform[(define-datatype id predicate-id
(variant-id (field-id predicate-expr) ...)
...)]{
Defines the datatype @scheme[id] and a function
@scheme[predicate-id] that returns @scheme[#t] for instances of the
datatype, and @scheme[#f] for any other value.
Each @scheme[variant-id] is defined as a constructor function that
creates an instance of the datatype; the constructor takes as many
arguments as the variant's @scheme[field-id]s, and each argument is
checked by applying the function produced by the variant's
@scheme[predicate-expr].
In DrScheme v209 and older, when constructor-based printing was
used, variant instances were printed with a @scheme[make-] prefix
before the variant name. Thus, for compatibility, in addition to
@scheme[variant-id], @scheme[make-variant-id] is also defined for
each @scheme[variant-id] (to the same constructor as
@scheme[variant-id]).}
@defform*[#:literals (else)
[(cases datatype-id expr
(variant-id (field-id ...) result-expr ...)
...)
(cases datatype-id expr
(variant-id (field-id ...) result-expr ...)
...
(else result-expr ...))]]{
Branches on the datatype instance produced by @scheme[expr], which
must be an instance of the specified @scheme[datatype-id] that is
defined with @scheme[define-datatype].}
@deftogether[(
@defidform[sllgen:make-string-scanner]
@defidform[sllgen:make-string-parser]
@defidform[sllgen:make-stream-parser]
@defidform[sllgen:make-define-datatypes]
@defidform[sllgen:show-define-datatypes]
@defidform[sllgen:list-define-datatypes])]{
Defined in the textbook's Appendix B @cite["EoPL"]. However, the
DrScheme versions are syntactic forms, instead of procedures, and
the arguments must be either quoted literal tables or identifiers
that are defined (at the top level) to quoted literal tables.}
@defthing[sllgen:make-rep-loop procedure?]{
Defined in the @italic{EoPL} textbook's Appendix B @cite["EoPL"]
(and still a function).}
@defthing[eopl:error procedure?]{
As in the book.}
@deftogether[(
@defproc[(eopl:printf (form string?) (v any/c) ...) void?]
@defproc[(eopl:pretty-print (v any/c) (port output-port? (current-output-port))) void?])]{
Same as @schememodname[scheme/base]'s @scheme[printf] and @scheme[pretty-print].}
@deftogether[(
@defproc[((list-of (pred (any/c . -> . any)) ...+) (x any/c)) boolean?]
@defproc[(always? (x any/c)) boolean?]
@defproc[(maybe (pred (any/c . -> . boolean?))) boolean?])]{
As in the book @cite["EoPL"].}
@defthing[empty empty?]{
The empty list.}
@defform[(time expr)]{
Evaluates @scheme[expr], and prints timing information before returning the
result.}
@defproc[(collect-garbage) void?]{
Performs a garbage collection (useful for repeatable timings).}
@deftogether[(
@defform[(trace id ...)]
@defform[(untrace id ...)])]{
For debugging: @scheme[trace] redefines each @scheme[id] at the top
level (bound to a procedure) so that it prints arguments on entry
and results on exit. The @scheme[untrace] form reverses the action
of @scheme[trace] for the given @scheme[id]s.
Tracing a function causes tail-calls in the original function to
become non-tail calls.}
@defform[(provide provide-spec ...)]{
Useful only with a module that uses @schememodname[eopl/eopl] as a
language: exports identifiers from the module. See @mzscheme-provide
from @schememodname[mzscheme] for more information.}
@defthing[eopl:error-stop (-> any/c)]{
Defined only in the top-level namespace (i.e., not in a module);
mutate this variable to install an exception-handling
thunk. Typically, the handler thunk escapes through a continuation.
The @schememodname[eopl/eopl] library sets this variable to
@scheme[#f] in the current namespace when it executes.}
@defproc[(install-eopl-exception-handler) void?]{
Sets an exception handler to one that checks
@scheme[eopl:error-stop].
The @schememodname[eopl/eopl] library calls this function when it
executes.}
@(bibliography
(bib-entry #:key "EoPL"
#:title @elem{@italic{Essentials of Programming Languages}, Third Edition}
#:location "MIT Press"
#:date "2008"
#:url "http://www.eopl3.com/")
)