Syntax-Case Macros
==================
`(require 'syntax-case)'
- Function: macro:expand expression
- Function: syncase:expand expression
Returns scheme code with the macros and derived expression types of
EXPRESSION expanded to primitive expression types.
- Function: macro:eval expression
- Function: syncase:eval expression
`macro:eval' returns the value of EXPRESSION in the current top
level environment. EXPRESSION can contain macro definitions.
Side effects of EXPRESSION will affect the top level environment.
- Procedure: macro:load filename
- Procedure: syncase:load filename
FILENAME should be a string. If filename names an existing file,
the `macro:load' procedure reads Scheme source code expressions and
definitions from the file and evaluates them sequentially. These
source code expressions and definitions may contain macro
definitions. The `macro:load' procedure does not affect the
values returned by `current-input-port' and `current-output-port'.
This is version 2.1 of `syntax-case', the low-level macro facility
proposed and implemented by Robert Hieb and R. Kent Dybvig.
This version is further adapted by Harald Hanche-Olsen <hanche @
imf.unit.no> to make it compatible with, and easily usable with, SLIB.
Mainly, these adaptations consisted of:
* Removing white space from `expand.pp' to save space in the
distribution. This file is not meant for human readers anyway...
* Removed a couple of Chez scheme dependencies.
* Renamed global variables used to minimize the possibility of name
conflicts.
* Adding an SLIB-specific initialization file.
* Removing a couple extra files, most notably the documentation (but
see below).
If you wish, you can see exactly what changes were done by reading the
shell script in the file `syncase.sh'.
The two PostScript files were omitted in order to not burden the SLIB
distribution with them. If you do intend to use `syntax-case',
however, you should get these files and print them out on a PostScript
printer. They are available with the original `syntax-case'
distribution by anonymous FTP in
`cs.indiana.edu:/pub/scheme/syntax-case'.
In order to use syntax-case from an interactive top level, execute:
(require 'syntax-case)
(require 'repl)
(repl:top-level macro:eval)
See the section Repl (Note:Repl) for more information.
To check operation of syntax-case get
`cs.indiana.edu:/pub/scheme/syntax-case', and type
(require 'syntax-case)
(syncase:sanity-check)
Beware that `syntax-case' takes a long time to load - about 20s on a
SPARCstation SLC (with SCM) and about 90s on a Macintosh SE/30 (with
Gambit).
Notes
-----
All R4RS syntactic forms are defined, including `delay'. Along with
`delay' are simple definitions for `make-promise' (into which `delay'
expressions expand) and `force'.
`syntax-rules' and `with-syntax' (described in `TR356') are defined.
`syntax-case' is actually defined as a macro that expands into calls
to the procedure `syntax-dispatch' and the core form `syntax-lambda';
do not redefine these names.
Several other top-level bindings not documented in TR356 are created:
* the "hooks" in `hooks.ss'
* the `build-' procedures in `output.ss'
* `expand-syntax' (the expander)
The syntax of define has been extended to allow `(define ID)', which
assigns ID to some unspecified value.
We have attempted to maintain R4RS compatibility where possible. The
incompatibilities should be confined to `hooks.ss'. Please let us know
if there is some incompatibility that is not flagged as such.
Send bug reports, comments, suggestions, and questions to Kent Dybvig
(dyb @ iuvax.cs.indiana.edu).
Note from maintainer
--------------------
Included with the `syntax-case' files was `structure.scm' which
defines a macro `define-structure'. There is no documentation for this
macro and it is not used by any code in SLIB.