nearly done

svn: r11090
This commit is contained in:
Robby Findler 2008-08-05 20:11:23 +00:00
parent 8007e07cfe
commit 47a2d5871f

View File

@ -7,6 +7,7 @@
scheme/gui
scheme/pretty
scheme/contract
(only-in slideshow/pict text)
redex))
@(define-syntax (defpattech stx)
@ -378,8 +379,8 @@ bound to @scheme['()].
}
}
@defform*[[(redex-match lang pattern any)
(redex-match lang pattern)]]{
@defform*[[(redex-match lang #, @|ttpattern| any)
(redex-match lang #, @|ttpattern|)]]{
If @scheme[redex-match] receives three arguments, it
matches the pattern (in the language) against its third
@ -683,20 +684,19 @@ all non-GUI portions of Redex) and also exported by
@defform/subs[#:literals (--> fresh side-condition where)
(reduction-relation language reduction-case ...)
((reduction-case (--> #, @|ttpattern| exp extras ...))
((reduction-case (--> #, @|ttpattern| #, @|tttterm| extras ...))
(extras name
(fresh <fresh-clause> ...)
(side-condition <guard> ...)
(where <tl-pat> e))
(fresh fresh-clause ...)
(side-condition scheme-expression ...)
(where tl-pat scheme-expression))
(fresh-clause var ((var1 ...) (var2 ...))))]{
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].
@|tttterm|.
Following the lhs & rhs specs can be the name of the
Following the @|pattern| and @|tterm| 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
name (identifier), or a literal string.
@ -747,9 +747,9 @@ defines a reduction relation for the lambda-calculus above.
@defform/none[#:literals (with reduction-relation)
(reduction-relation
language
(arrow-var pattern exp) ...
(arrow-var #, @|ttpattern| #, @|tttterm|) ...
with
[(arrow pattern exp)
[(arrow #, @|ttpattern| #, @|tttterm|)
(arrow-var var var)] ...)]{
Defines a reduction relation with shortcuts. As above, the
@ -762,11 +762,11 @@ Each of the clauses after the `with' define new relations
in terms of other definitions after the `with' clause or in
terms of the main --> relation.
[ NOTE: `fresh' is always fresh with respect to the entire
term, not just with respect to the part that matches the
right-hand-side of the newly defined arrow. ]
@scheme[fresh] is always fresh with respect to the entire
term, not just with respect to the part that matches the
right-hand-side of the newly defined arrow.
For example, this
As an example, this
@schemeblock[
(reduction-relation
@ -794,7 +794,7 @@ where the @tt{==>} relation is defined by reducing in the context
This form extends the reduction relation in its first
argument with the rules specified in <more>. They should
have the same shape as the the rules (including the `with'
clause) in an ordinary reduction-relation.
clause) in an ordinary @scheme[reduction-relation].
If the original reduction-relation has a rule with the same
name as one of the rules specified in the extension, the old
@ -804,7 +804,8 @@ 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.
}
@defproc[(union-reduction-relations [r 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
@ -887,10 +888,10 @@ all non-GUI portions of Redex) and also exported by
@defform/subs[#:literals (: ->)
(define-metafunction language-exp
contract
[(name pattern ...) exp (side-condition exp) ...]
[(name #, @|ttpattern| ...) #, @|tttterm| (side-condition scheme-expression) ...]
...)
([contract (code:line)
(code:line id : pattern ... -> pattern)])]{
(code:line id : #, @|ttpattern| ... -> #, @|ttpattern|)])]{
The @scheme[define-metafunction] form builds a function on
sexpressions according to the pattern and right-hand-side
@ -959,7 +960,7 @@ match.
@defform[(define-metafunction/extension extending-name language-exp
contract
[(name pattern ...) rhs-expression (side-condition <exp>) ...]
[(name #, @|ttpattern| ...) #, @|tttterm| (side-condition scheme-expression) ...]
...)]{
This defines a metafunction as an extension of an existing
@ -968,7 +969,7 @@ patterns were in this definitions, with the name of the
function fixed up to be @scheme[extending-name].
}
@defform[(in-domain? (metafunction-name term ...))]{
@defform[(in-domain? (metafunction-name #, @|tttterm| ...))]{
Returns @scheme[#t] if the inputs specified to @scheme[metafunction-name] are
legtimate inputs according to @scheme[metafunction-name]'s contract,
and @scheme[#f] otherwise.
@ -1082,10 +1083,6 @@ width at most given by the number (its third argument). The
final argument is the text where the port is connected --
characters written to the port go to the end of the editor.
The default value of @scheme[pp], provided as
@scheme[default-pretty-printer], uses MzLib's
@scheme[pretty-print] function.
The @scheme[colors] argument, if provided, specifies a list of
reduction-name/color-string pairs. The traces gui will color
arrows drawn because of the given reduction name with the
@ -1203,6 +1200,13 @@ the stepper and traces.
These four parameters control the color of the edges in the graph.
}
@defproc[(default-pretty-printer [v any] [port output-port] [width number] [text (is-a?/c text%)]) void?]{
This is the default value of @scheme[pp] used by @scheme[traces] and
@scheme[stepper] and it uses
@scheme[pretty-print].
}
@section{Typesetting}
@defmodule[redex/pict]
@ -1229,24 +1233,26 @@ contains this header:
@schememod[
scheme/gui
(require texpict/mrpict)
(dc-for-text-size (make-object bitmap-dc% (make-object bitmap% 1 1)))
(dc-for-text-size
(make-object bitmap-dc%
(make-object bitmap% 1 1)))
]
Be sure to remove the call to dc-for-text-size before you
generate .ps files, otherwise the font spacing will be wrong
in the .ps file.
> language->pict ::
(->* (compiled-lang?
(or/c false/c (cons/c symbol? (listof symbol?))))
((or/c false/c (cons/c symbol? (listof symbol?))))
pict?)
@subsection{Pict & PostScript Generators}
@deftogether[[
@defproc[(language->pict (lang compiled-lang?)
(nts (or/c false/c (cons/c symbol? (listof symbol?))) #f))
pict?]{}
@defproc[(language->ps (lang compiled-lang?)
(filename (or/c path? string?))
(nts (or/c false/c (cons/c symbol? (listof symbol?))) #f))
void?]{}]]{
> language->ps ::
(->* (compiled-lang?
(or/c path? string?))
((or/c false/c (cons/c symbol? (listof symbol?))))
void?)
These two functions turn a languages into picts. The first
argument is the language, and the second is a list of
@ -1254,10 +1260,11 @@ non-terminals that should appear in the pict. It may only
contain symbols that are in the language's set of
non-terminals.
For language->ps, the path argument is a filename for the
For @scheme[language->ps], the path argument is a filename for the
PostScript file.
}
> extend-language-show-union : (parameter/c boolean?)
@defparam[extend-language-show-union show? boolean?]{
If this is #t, then a language constructed with
extend-language is shown as if the language had been
@ -1265,40 +1272,46 @@ constructed directly with `language'. If it is #f, then only
the last extension to the language is shown (with
four-period ellipses, just like in the concrete syntax).
Defaultly #f.
Defaultly @scheme[#f].
Note that the #t variant can look a little bit strange if
.... are used and the original version of the language has
multi-line right-hand sides.
}
> reduction-relation->pict ::
(opt-> (reduction-relation?)
((or/c false/c (listof (union string? symbol?))))
pict?)
> reduction-relation->ps ::
(opt-> (reduction-relation?
(union string? path?))
((or/c false/c (listof (union string? symbol?))))
void?)
@deftogether[[
@defproc[(reduction-relation->pict
(r reduction-relation?)
(rules (or/c false/c (listof (union string? symbol?))) #f))
pict?]{}
@defproc[(reduction-relation->ps
(r reduction-relation?)
(file (or/c string? path?))
(rules (or/c false/c (listof (union string? symbol?))) #f))
pict?]{}]]{
These two functions turn reduction relations into picts.
The optional lists determine which reduction rules are shown
in the pict.
}
> (metafunction->pict metafunction-name) -> pict
> (metafunction->ps metafunction-name (union path? string?)) -> void
@deftogether[[
@defform[(metafunction->pict metafunction-name)]{}
@defform[(metafunction->ps metafunction-name filename)]{}]]{
These two syntactic forms turn metafunctions into picts
These two syntactic forms turn metafunctions into picts. The second
accepts a string or a path for @scheme[filename] and saves the
PostScript in that file.
}
There are also customization parameters:
@subsection{Customization}
> rule-pict-style ::
(parameter/c (symbols 'vertical
@defparam[rule-pict-style style
(symbols 'vertical
'compact-vertical
'vertical-overlapping-side-conditions
'horizontal))
'horizontal)]{
This parameter controls the style used for the reduction
relation. It can be either horizontal, where the left and
@ -1308,33 +1321,37 @@ reduction rule are above each other. The vertical mode also
has a variant where the side-conditions don't contribute to
the width of the pict, but are just overlaid on the second
line of each rule.
}
> arrow-space :: (parameter/c natural-number/c)
@defparam[arrow-space space natural-number/c]{
This parameter controls the amount of extra horizontal space
around the reduction relation arrow. Defaults to 0.
}
> horizontal-label-space :: (parameter/c natural-number/c)
@defparam[horizontal-label-space space natural-number/c]{
This parameter controls the amount of extra space before the
label on each rule, but only in horizontal mode. Defaults to
0.
}
> metafunction-pict-style ::
(parameter/c (symbols 'left-right 'up-down))
@defparam[metafunction-pict-style style (parameter/c (symbols 'left-right 'up-down))]{
This parameter controls the style used for typesetting
metafunctions. The 'left-right style means that the
results of calling the metafunction are displayed to the
right of the arguments and the 'up-down style means that
the results are displayed below the arguments.
}
> label-style :: (parameter/c text-style/c)
> literal-style :: (parameter/c text-style/c)
> metafunction-style :: (parameter/c text-style/c)
> non-terminal-style :: (parameter/c text-style/c)
> non-terminal-subscript-style :: (parameter/c text-style/c)
> default-style :: (parameter/c text-style/c)
@deftogether[[
@defparam[label-style style text-style/c]{}
@defparam[literal-style style text-style/c]{}
@defparam[metafunction-style style text-style/c]{}
@defparam[non-terminal-style style text-style/c]{}
@defparam[non-terminal-subscript-style style text-style/c]{}
@defparam[default-style style text-style/c]{}]]{
These parameters determine the font used for various text in
the picts. See `text' in the texpict collection for
@ -1356,46 +1373,51 @@ The default-style is used for parenthesis, the dot in dotted
lists, spaces, the separator words in the grammar, the
"where" and "fresh" in side-conditions, and other places
where the other parameters aren't used.
}
> label-font-size :: (parameter/c (and/c (between/c 1 255) integer?))
> metafunction-font-size :: (parameter/c (and/c (between/c 1 255) integer?))
> default-font-size :: (parameter/c (and/c (between/c 1 255) integer?))
@deftogether[[
@defparam[label-font-size size (and/c (between/c 1 255) integer?)]{}
@defparam[metafunction-font-size size (and/c (between/c 1 255) integer?)]{}
@defparam[default-font-size size (and/c (between/c 1 255) integer?)]{}]]{
These parameters control the various font sizes. The
default-font-size is used for all of the font sizes except
labels and metafunctions.
}
> reduction-relation-rule-separation ::
(parameter/c (and/c integer? positive? exact?))
@defparam[reduction-relation-rule-separation sep (parameter/c (and/c integer? positive? exact?))]{
Controls the amount of space between clauses in a reduction
relation. Defaults to 4.
}
> curly-quotes-for-strings :: (parameter/c boolean?)
@defparam[curly-quotes-for-strings on? boolean?]{
Controls if the open and close quotes for strings are turned
into “ and ” or are left as merely ".
Defaults to #t.
}
> current-text :: (parameter/c (-> string? text-style/c number? pict?))
@defparam[current-text proc (-> string? text-style/c number? pict?)]{
This parameter's function is called whenever Redex typesets
some part of a grammar, reduction relation, or
metafunction. It defaults to mrpict.ss's `text' function.
metafunction. It defaults to slideshow's @scheme[text] function.
}
> set-arrow-pict! :: (-> symbol? (-> pict?) void?)
@defparam[set-arrow-pict! proc (-> symbol? (-> pict?) void?)]{
This functions sets the pict for a given reduction-relation
symbol. When typesetting a reduction relation that uses the
symbol, the thunk will be invoked to get a pict to render
it. The thunk may be invoked multiple times when rendering a
single reduction relation.
}
============================================================
@subsection{Pink & LW}
_Removing the pink background from PLT Redex rendered picts and ps files_
_Rewriting patterns during typesetting for PLT Redex_
@deftech{Removing the pink background from PLT Redex rendered picts and ps files}
When reduction rules, a metafunction, or a grammar contains
unquoted Scheme code or side-conditions, they are rendered
@ -1408,35 +1430,37 @@ implementation of those operations.
To replace the pink code, use:
> (with-unquote-rewriter proc expression)
@defform[(with-unquote-rewriter proc expression)]{
It installs `proc' the current unqoute rewriter and
It installs @scheme[proc] the current unqoute rewriter and
evaluates expression. If that expression computes any picts,
the unquote rewriter specified is used to remap them.
The 'proc' should be a function of one argument. It receives
The @scheme[proc] should be a function of one argument. It receives
a lw struct as an argument and should return
another lw that contains a rewritten version of the
code.
}
> (with-atomic-rewriter name-symbol string-or-thunk-returning-pict expression)
@defform[(with-atomic-rewriter name-symbol string-or-thunk-returning-pict expression)]{
This extends the current set of atomic-rewriters with one
new one that rewrites the value of name-symbol to
string-or-pict-returning-thunk (applied, in the case of a
thunk), during the evaluation of expression.
name-symbol is expected to evaluate to a symbol. The value
@scheme[name-symbol] is expected to evaluate to a symbol. The value
of string-or-thunk-returning-pict is used whever the symbol
appears in a pattern.
}
> (with-compound-rewriter name-symbol proc expression)
@defform[(with-compound-rewriter name-symbol proc expression)]{
This extends the current set of compound-rewriters with one
new one that rewrites the value of name-symbol via proc,
during the evaluation of expression.
name-symbol is expected to evaluate to a symbol. The value
@scheme[name-symbol] is expected to evaluate to a symbol. The value
of proc is called with a (listof lw) -- see below
for details on the shape of lw, and is expected to
return a new (listof (union lw string pict)),
@ -1452,15 +1476,20 @@ lw structs for each of the non-lws in the
list (see the description of lw below for an
explanation of logical-space):
0: If there are two adjacent lws, then the logical
space between them is filled with whitespace.
@itemize{
@item{
If there are two adjacent lws, then the logical
space between them is filled with whitespace.}
1: If there is a pair of lws with just a single
@item{
If there is a pair of lws with just a single
non-lw between them, a lw will be
created (containing the non-lw) that uses all
of the available logical space between the lws.
}
2: If there are two adjacent non-lws between two
@item{
If there are two adjacent non-lws between two
lws, the first non-lw is rendered
right after the first lw with a logical space
of zero, and the second is rendered right before the
@ -1468,11 +1497,9 @@ explanation of logical-space):
the logical space between the two lws is
absorbed by a new lw that renders using no
actual space in the typeset version.
}}
}
============================================================
The lw data structure corresponds represents a
pattern or a Scheme expression that is to be typeset.
A _lw_ is a struct:
(build-lw element posnum posnum posnum posnum)
@ -1489,6 +1516,9 @@ An _element_ is either:
pict
(listof lw)
The lw data structure corresponds represents a
pattern or a Scheme expression that is to be typeset.
Each sub-expression corresponds to its own lw, and
the element indicates what kind of subexpression it is. If
the element is a list, then the lw corresponds to a
@ -1500,29 +1530,35 @@ be a lw in the third-to-last position for the dot.
For example, this expression:
(a)
@schemeblock[(a)]
becomes this lw (assuming the above expression
appears as the first thing in the file):
@schemeblock[
(build-lw (list (build-lw "(" 0 0 0 1)
(build-lw 'a 0 0 1 1)
(build-lw ")" 0 0 2 1))
0 0 0 3)
]
If there is some whitespace in the sequence, like this one:
@schemeblock[
(a b)
]
then there is no lw that corresponds to that
whitespace; instead there is a logical gap between the
lws.
@schemeblock[
(build-lw (list (build-lw "(" 0 0 0 1)
(build-lw 'a 0 0 1 1)
(build-lw 'b 0 0 3 1)
(build-lw ")" 0 0 4 1))
0 0 0 5)
]
In general, identifiers are represented with symbols and
parenthesis are represented with strings and picts can be
@ -1549,8 +1585,10 @@ the logical space (ie, the line/column &
line-span/column-span) fields of the lws. As an
example, if this is the original pattern:
@schemeblock[
(all good boys
deserve fudge)
]
then the leftmost edges of the words "good" and "deserve"
will be lined up underneath each other, but the relative
@ -1561,135 +1599,27 @@ appropriate font.
There are two helper functions that make building
lws easier:
> just-before :: (-> (or/c pict? string? symbol?)
lw?
lw?)
> just-after :: (-> (or/c pict? string? symbol?)
lw?
lw?)
@deftogether[[
@defproc[(just-before [stuff (or/c pict? string? symbol?)]
[lw lw?])
lw?]{}
@defproc[(just-after [stuff (or/c pict? string? symbol?)]
[lw lw?])
lw?]{}]]{
These functions build new lws whose contents are
the first argument, and whose line and column are based on
the second argument, making the new loc wrapper be either
just before or just after that argument. The line-span and
column-span of the new lw is always zero.
}
> (to-lw arg) SYNTAX
@defform[(to-lw arg)]{
This form turns its argument into lw structs that
contain all of the spacing information just as it would appear
when being used to typeset.
======================================================================
The _iswim.ss_ module in the "examples" sub-collection defines a
grammar and reductions from "Programming Languages and Lambda Calculi"
by Felleisen and Flatt.
Example S-expression forms of ISWIM expressions:
Book S-expr
---- ------
(lambda x . x) ("lam" x x)
(+ '1` '2`) ("+" 1 2)
((lambda y y) '7`) (("lam" y y) 7)
CK machine:
Book S-expr
---- ------
<(lambda x . x), mt> (("lam" x x) : "mt")
CEK machine:
Book S-expr
---- ------
<<(lambda x . x), ((("lam" x x)
{<X,<5,{}>>}>, : ((X (5 : ()))))
mt> : "mt")
The full grammar:
(language (M (M M)
(o1 M)
(o2 M M)
V)
(V X
("lam" variable M)
b)
(X variable)
(b number)
(o1 "add1" "sub1" "iszero")
(o2 "+" "-" "*" "^")
(on o1 o2)
;; Evaluation contexts:
(E hole
(E M)
(V E)
(o1 E)
(o2 E M)
(o2 V E))
;; Continuations (CK machine):
(k "mt"
("fun" V k)
("arg" M k)
("narg" (V ... on) (M ...) k))
;; Environments and closures (CEK):
(env ((X = vcl) ...))
(cl (M : env))
(vcl (V- : env))
;; Values that are not variables:
(V- ("lam" variable M)
b)
;; Continuations with closures (CEK);
(k- "mt"
("fun" vcl k-)
("arg" cl k-)
("narg" (vcl ... on) (cl ...) k-)))
The following are provided by "iswim.ss":
Grammar and substitution:
> iswim-grammar :: compiled-lang?
> M? :: (any? . -> . boolean?)
> V? :: (any? . -> . boolean?)
> o1? :: (any? . -> . boolean?)
> o2? :: (any? . -> . boolean?)
> on? :: (any? . -> . boolean?)
> k? :: (any? . -> . boolean?)
> env? :: (any? . -> . boolean?)
> cl? :: (any? . -> . boolean?)
> vcl? :: (any? . -> . boolean?)
> k-? :: (any? . -> . boolean?)
> iswim-subst :: (M? symbol? M? . -> . M?)
> empty-env :: env?
> env-extend :: (env? symbol? vcl? . -> . env?)
> env-lookup :: (env? symbol? . -> . (union false? vcl?))
Reductions:
> beta_v :: reduction-relation?
> delta :: reduction-relation?
> ->v :: reduction-relation?
> :->v :: reduction-relation?
Abbreviations:
> if0 :: (M? M? M? . -> . M?)
> true :: M?
> false :: M?
> mkpair :: M?
> fst :: M?
> snd :: M?
> Y_v :: M?
> sum :: M?
Helpers:
> delta*1 :: (o1? V? . -> . (union false? V?))
delta as a function for unary operations.
> delta*2 :: (o2? V? V? . -> . (union false? V?))
delta as a function for binary operations.
> delta*n :: (on? (listof V?) . -> . (union false? V?))
delta as a function for any operation.
}
@index-section[]