some progress porting the docs to scribble

svn: r10987
This commit is contained in:
Robby Findler 2008-07-30 19:06:34 +00:00
parent c2c7777c37
commit 9ee96143a4

View File

@ -5,7 +5,7 @@
(for-label scheme/base
scheme/contract
redex))
@(declare-exporting redex)
@title{@bold{PLT Redex}: an embedded DSL for debugging operational semantics}
This collection provides these files:
@ -75,28 +75,29 @@ this tool:
The _reduction-semantics.ss_ library defines a pattern
language, used in various ways:
pattern = any
| number
| string
| variable
| (variable-except <symbol> ...)
| (variable-prefix <symbol>)
| variable-not-otherwise-mentioned
| hole
| (hole <symbol-or-false>)
| <symbol>
| (name <symbol> <pattern>)
| (in-hole <pattern> <pattern>)
| (in-named-hole <symbol> <pattern> <pattern>)
| (hide-hole <pattern>)
| (side-condition <pattern> <guard>)
| (cross <symbol>)
| (<pattern-sequence> ...)
| <scheme-constant>
pattern-sequence = pattern
| ... ;; literal ellipsis
| ..._<id>
@(schemegrammar* #:literals (any number string variable variable-except variable-prefix variable-not-otherwise-mentioned hole name in-hole in-named-hole side-condition cross)
[pattern any
number
string
variable
(variable-except symbol ...)
(variable-prefix symbol)
variable-not-otherwise-mentioned
hole
(hole symbol-or-false)
symbol
(name symbol pattern)
(in-hole pattern pattern)
(in-named-hole symbol pattern pattern)
(hide-hole pattern)
(side-condition pattern guard)
(cross symbol)
(pattern-sequence ...)
scheme-constant]
[pattern-sequence
pattern
... ;; literal ellipsis
..._id])
The patterns match sexpressions. The _any_ pattern matches
any sepxression. The _number_ pattern matches any
@ -272,9 +273,10 @@ two matches occur, one where x is bound to '() and y is
bound to '(a a) and one where x is bound to '(a a) and y is
bound to '().
> (define-language <lang-name> (non-terminal-spec pattern ...) ...) SYNTAX
non-terminal-spec = symbol
| (symbol ...)
@defform/subs[(define-language lang-name
(non-terminal-spec pattern ...)
...)
([non-terminal-spec symbol (symbol ...)])]{
This form defines the grammar of a language. It allows the
definition of recursive patterns, much like a BNF, but for
@ -291,6 +293,7 @@ productions.
As a simple example of a grammar, this is the lambda
calculus:
@schemeblock[
(define-language lc-lang
(e (e e ...)
x
@ -299,28 +302,34 @@ calculus:
hole)
(v (lambda (x ...) e))
(x variable-not-otherwise-mentioned))
]
with non-terminals e for the expression language, x for
variables, c for the evaluation contexts and v for values.
with non-terminals @scheme[e] for the expression language, @scheme[x] for
variables, @scheme[c] for the evaluation contexts and @scheme[v] for values.
}
> (define-extended-language <language> <language> (non-terminal pattern ...) ...)
@defform[(define-extended-language language language
(non-terminal pattern ...)
...)]{
This form extends a language with some new, replaced, or
extended non-terminals. For example, this language:
@schemeblock[
(define-extended-language lc-num-lang
lc-lang
(e .... ;;; extend the previous `e' non-terminal
(e .... (code:comment "extend the previous `e' non-terminal")
+
number)
(v ....
+
number)
(x (variable-except lambda +)))
]
extends lc-lang with two new alternatives for both the `e'
and `v' nonterminal, replaces the `x' non-terminal with a
new one, and carries the `c' non-terminal forward.
extends lc-lang with two new alternatives for both the @scheme[e]
and @scheme[v] nonterminal, replaces the @scheme[x] non-terminal with a
new one, and carries the @scheme[c] non-terminal forward.
The four-period ellipses indicates that the new language's
non-terminal has all of the alternatives from the original
@ -335,18 +344,23 @@ non-terminals to the language.
If a language is has a group of multiple non-terminals
defined together, extending any one of those non-terminals
extends all of them.
}
> language-nts :: (compiled-lang? . -> . (listof symbol?))
@defproc[(language-nts [lang compiled-lang?]) (listof symbol?)]{
Returns the list of non-terminals (as symbols) that are
defined by this language.
}
> compiled-lang? :: (any? . -> . boolean?)
@defproc[(compiled-lang? [l any/c]) boolean?]{
Returns #t if its argument was produced by `language', #f
otherwise.
}
> (term-let ([tl-pat expr] ...) body) SYNTAX
@defform/subs[(term-let ([tl-pat expr] ...) body)
([tl-pat identifier (tl-pat-ele ...)]
[tl-pat-ele tl-pat (code:line tl-pat ellipses)])]{
Matches each given id pattern to the value yielded by
evaluating the corresponding expr and binds each variable in
@ -356,11 +370,6 @@ syntactic form.
Identifier-patterns are terms in the following grammar:
tl-pat ::= identifier
| (tl-pat-ele ...)
tl-pat-ele ::= tl-pat
| tl-pat ellipses
where ellipses is the literal symbol consisting of three
dots (and the ... indicates repetition as usual). If tl-pat
is an identifier, it matches any value and binds it to the
@ -371,8 +380,9 @@ corresponding list element. There may be a single ellipsis
in any list pattern; if one is present, the pattern before
the ellipses may match multiple adjacent elements in the
list value (possibly none).
}
> (term s-expr) SYNTAX
@defform[(term s-expr)]{
This form is used for construction of new s-expressions in
the right-hand sides of reductions. It behaves similarly to
@ -384,17 +394,21 @@ same manner as syntax-case patterns).
For example,
@schemeblock[
(term-let ([body '(+ x 1)]
[(expr ...) '(+ - (values * /))]
[((id ...) ...) '((a) (b) (c d))])
(term (let-values ([(id ...) expr] ...) body)))
]
evaluates to
@schemeblock[
'(let-values ([(a) +]
[(b) -]
[(c d) (values * /)])
(+ x 1))
]
It is an error for a term variable to appear in an
expression with an ellipsis-depth different from the depth
@ -404,26 +418,26 @@ different lengths to appear together inside an ellipsis.
The special forms recognized by term are:
(in-hole a b)
@itemize{
@item{@scheme[(in-hole a b)]
This is the dual to the pattern `in-hole' -- it accepts
a context and an expression and uses `plug' to combine
them.
(in-named-hole name a b)
}@item{@scheme[(in-named-hole name a b)]
Like in-hole, but substitutes into a hole with a particular name.
hole
}@item{@scheme[hole]
This produces a hole.
(hole name)
}@item{@scheme[(hole name)]
This produces a hole with the name `name'. To produce an unnamed
hole, use #f as the name.
}}}
> (term-match <language> [<pattern> <expression] ...) SYNTAX
@defform[(term-match language [pattern expression] ...)]{
This produces a procedure that accepts term (or quoted)
expressions and checks them against each pattern. The
@ -431,48 +445,48 @@ function returns a list of the values of the expression
where the pattern matches. If one of the patterns matches
multiple times, the expression is evaluated multiple times,
once with the bindings in the pattern for each match.
}
> (term-match/single <language> [<pattern> <expression] ...) SYNTAX
@defform[(term-match/single language [pattern expression] ...)]{
This produces a procedure that accepts term (or quoted)
expressions and checks them against each pattern. The
function returns the expression behind the first sucessful
match. If that pattern produces multiple matches, an error
is signaled. If no patterns match, an error is signaled.
}
> (reduction-relation <language> <reduction-case> ...) SYNTAX
@defform/subs[#:literals (--> fresh side-condition where)
(reduction-relation language reduction-case ...)
((reduction-case (--> pattern exp extras ...))
(extras name
(fresh <fresh-clause> ...)
(side-condition <guard> ...)
(where <tl-pat> e))
(fresh-clause var ((var1 ...) (var2 ...))))]{
<reduction-case> = (--> <lhs-pattern> <rhs-exp> <extras> ...)
<extras> =
<name>
| (fresh <fresh-clause> ...)
| (side-condition <guard> ...)
| (where <tl-pat> e)
<fresh-clause> =
var
| ((var1 ...) (var2 ...))
Defines a reduction relation casewise, one case for each of
the clauses beginning with -->. Each of the <lhs-pattern>s
refers to the <language>, and binds variables in the
<rhs-exp>. The <rhs-exp> behave like the argument to `term'.
Defines a reduction relation casewise, one case for each of the
clauses beginning with @scheme[-->]. Each of the @scheme[pattern]s
refers to the @scheme[language], and binds variables in the
@scheme[exp]. The @scheme[exp] behave like the argument to
@scheme[term].
Following the lhs & rhs specs can be the name of the
reduction rule, declarations of some fresh variables, and/or
some side-conditions. The <name> can either be a literal
some side-conditions. The name can either be a literal
name (identifier), or a literal string.
The fresh variables clause generates variables that do not
occur in the term being matched. If the <fresh-clause> is a
occur in the term being matched. If the @scheme[fresh-clause] is a
variable, that variable is used both as a binding in the
rhs-exp and as the prefix for the freshly generated
variable.
The second case of a <fresh-clause> is used when you want to
The second case of a @scheme[fresh-clause] is used when you want to
generate a sequence of variables. In that case, the ellipses
are literal ellipses; that is, you must actually write
ellipses in your rule. The variable var1 is like the
variable in first case of a <fresh-clause>, namely it is
variable in first case of a @scheme[fresh-clause], namely it is
used to determine the prefix of the generated variables and
it is bound in the right-hand side of the reduction rule,
but unlike the single-variable fresh clause, it is bound to
@ -484,13 +498,14 @@ The side-conditions are expected to all hold, and have the
format of the second argument to the side-condition pattern,
described above.
Each where clauses binds a variable and the side-conditions
(and where clauses) that follow the where declaration are in
Each @scheme[where] clauses binds a variable and the side-conditions
(and @scheme[where] clauses) that follow the where declaration are in
scope of the where declaration. The bindings are the same as
bindings in a term-let expression.
bindings in a @scheme[term-let] expression.
As an example, this
@schemeblock[
(reduction-relation
lc-lang
(--> (in-hole c_1 ((lambda (variable_i ...) e_body) v_i ...))
@ -499,15 +514,18 @@ As an example, this
(term (v_i ...))
(term (variable_i ...))))
beta-v))
]
defines a reduction relation for the lambda-calculus above.
}
> (reduction-relation
<language>
(<arrow-var> <lhs-pattern> <rhs-exp>) ...
with
[(<arrow> <lhs-pattern> <rhs-exp>)
(<arrow-var> <var> <var>)] ...)
@defform/none[#:literals (with reduction-relation)
(reduction-relation
language
(arrow-var pattern exp) ...
with
[(arrow pattern exp)
(arrow-var var var)] ...)]{
Defines a reduction relation with shortcuts. As above, the
first section defines clauses of the reduction relation, but
@ -525,6 +543,7 @@ terms of the main --> relation.
For example, this
@schemeblock[
(reduction-relation
lc-num-lang
(==> ((lambda (variable_i ...) e_body) v_i ...)
@ -538,12 +557,14 @@ For example, this
with
[(--> (in-hole c_1 a) (in-hole c_1 b))
(==> a b)])
]
defines reductions for the lambda calculus with numbers,
where the ==> relation is defined by reducing in the context
c.
where the @tt{==>} relation is defined by reducing in the context
@tt{c}.
}
> (extend-reduction-relation <reduction-relation> <language> <more> ...)
@defform[(extend-reduction-relation reduction-relation language more ...)]{
This form extends the reduction relation in its first
argument with the rules specified in <more>. They should
@ -557,18 +578,20 @@ rule is removed.
In addition to adding the rules specified to the existing
relation, this form also reinterprets the rules in the
original reduction, using the new language.
> union-reduction-relations :: (reduction-relation? ... -> reduction-relation?)
}
@defproc[(union-reduction-relations [r reduction-relation?] ...) reduction-relation?]{
Combines all of the argument reduction relations into a
single reduction relation that steps when any of the
arguments would have stepped.
}
> reduction-relation->rule-names ::
(reduction-relation? . -> . (listof (union false/c symbol?)))
@defproc[(reduction-relation->rule-names [r reduction-relation?])
(listof (union false/c symbol?))]{
Returns the names of all of the reduction relation's clauses
(or false if there is no name for a given clause).
}
> (compatible-closure <reduction-relation> <lang> <non-terminal>) SYNTAX