From 4de2439506e1964a2892186f8ec901c3c0741ac5 Mon Sep 17 00:00:00 2001 From: Robby Findler Date: Fri, 6 Feb 2009 02:18:08 +0000 Subject: [PATCH] added the ability to render multiple metafunctions together to make all the lhss line up in a single column svn: r13459 --- collects/redex/pict.ss | 4 +- collects/redex/private/bitmap-test.ss | 4 + .../redex/private/bmps/metafunction-subst.png | Bin 4359 -> 4724 bytes .../private/bmps/metafunctions-multiple.png | Bin 0 -> 8029 bytes collects/redex/private/pict.ss | 223 ++++++++++-------- collects/redex/redex.scrbl | 25 +- 6 files changed, 153 insertions(+), 103 deletions(-) create mode 100644 collects/redex/private/bmps/metafunctions-multiple.png diff --git a/collects/redex/pict.ss b/collects/redex/pict.ss index 5c98b71643..10cc69a8ea 100644 --- a/collects/redex/pict.ss +++ b/collects/redex/pict.ss @@ -42,7 +42,9 @@ ; syntax (provide metafunction->pict - render-metafunction) + metafunctions->pict + render-metafunction + render-metafunctions) (provide/contract [render-language-nts (parameter/c (or/c false/c (listof (or/c string? symbol?))))] diff --git a/collects/redex/private/bitmap-test.ss b/collects/redex/private/bitmap-test.ss index a92fe265c6..ed2fc014ef 100644 --- a/collects/redex/private/bitmap-test.ss +++ b/collects/redex/private/bitmap-test.ss @@ -139,5 +139,9 @@ (render-metafunction subst)) "metafunction-subst.png") + +;; make sure two metafunctions simultaneously rewritten line up properly +(test (render-metafunctions S T TL) "metafunctions-multiple.png") + (printf "bitmap-test.ss: ") (done) diff --git a/collects/redex/private/bmps/metafunction-subst.png b/collects/redex/private/bmps/metafunction-subst.png index 5a732a97785679baf349e46755a8d958ca6f0419..6cea486ecb25efeeb5228e3ddf703ec0e48d3d92 100644 GIT binary patch literal 4724 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 literal 4359 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 IYu|tTKZ(hU9smFU diff --git a/collects/redex/private/bmps/metafunctions-multiple.png b/collects/redex/private/bmps/metafunctions-multiple.png new file mode 100644 index 0000000000000000000000000000000000000000..f36bf7fc14edab488e50f108abe9eb8e6ff1b891 GIT binary patch literal 8029 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 literal 0 HcmV?d00001 diff --git a/collects/redex/private/pict.ss b/collects/redex/private/pict.ss index 8b59e0803f..27b35bd36c 100644 --- a/collects/redex/private/pict.ss +++ b/collects/redex/private/pict.ss @@ -20,7 +20,9 @@ render-reduction-relation-rules metafunction->pict + metafunctions->pict render-metafunction + render-metafunctions basic-text @@ -634,111 +636,136 @@ (syntax-case stx () [(_ name) (identifier? #'name) - #'(metafunction->pict/proc (metafunction name))])) + #'(metafunctions->pict name)])) + +(define-syntax (metafunctions->pict stx) + (syntax-case stx () + [(_ name1 name2 ...) + (and (identifier? #'name1) + (andmap identifier? (syntax->list #'(name2 ...)))) + #'(metafunctions->pict/proc (list (metafunction name1) (metafunction name2) ...) 'metafunctions->pict)])) + +(define-syntax (render-metafunctions stx) + (syntax-case stx () + [(_ name1 name2 ...) + (and (identifier? #'name) + (andmap identifier? (syntax->list #'(name2 ...)))) + #'(render-metafunction/proc (list (metafunction name1) (metafunction name2) ...) #f 'render-metafunctions)] + [(_ name1 name2 ... #:file filename) + (and (identifier? #'name1) + (andmap identifier? (syntax->list #'(name2 ...)))) + #'(render-metafunction/proc (list (metafunction name1) (metafunction name2) ...) file 'render-metafunctions)])) (define-syntax (render-metafunction stx) (syntax-case stx () [(_ name) (identifier? #'name) - #'(render-metafunction/proc (metafunction name))] + #'(render-metafunction/proc (list (metafunction name)) #f 'render-metafunction)] [(_ name file) (identifier? #'name) - #'(render-metafunction/proc (metafunction name) file)])) + #'(render-metafunction/proc (list (metafunction name)) file 'render-metafunction)])) (define linebreaks (make-parameter #f)) (define metafunction-pict-style (make-parameter 'left-right)) -(define metafunction->pict/proc - (lambda (mf) - (let* ([current-linebreaks (linebreaks)] - [all-nts (language-nts (metafunc-proc-lang (metafunction-proc mf)))] - [sep 2] - [style (metafunction-pict-style)] - [wrapper->pict (lambda (lw) (lw->pict all-nts lw))] - [eqns (metafunc-proc-pict-info (metafunction-proc mf))] - [lhss (map (lambda (eqn) - (wrapper->pict - (metafunction-call (metafunc-proc-name (metafunction-proc mf)) - (list-ref eqn 0) - (metafunc-proc-multi-arg? (metafunction-proc mf))))) - eqns)] - [scs (map (lambda (eqn) - (if (and (null? (list-ref eqn 1)) - (null? (list-ref eqn 2))) - #f - (side-condition-pict null - (map wrapper->pict (list-ref eqn 1)) - (map (lambda (p) - (cons (wrapper->pict (car p)) - (wrapper->pict (cdr p)))) - (list-ref eqn 2)) - (if (memq style '(up-down/vertical-side-conditions - left-right/vertical-side-conditions)) - 0 - +inf.0)))) - eqns)] - [rhss (map (lambda (eqn) (wrapper->pict (list-ref eqn 3))) eqns)] - [linebreak-list (or current-linebreaks - (map (lambda (x) #f) eqns))] - [=-pict (make-=)] - [max-lhs-w (apply max (map pict-width lhss))] - [max-line-w (apply - max - (map (lambda (lhs sc rhs linebreak?) - (max - (if sc (pict-width sc) 0) - (if linebreak? - (max (pict-width lhs) - (+ (pict-width rhs) (pict-width =-pict))) - (+ (pict-width lhs) (pict-width rhs) (pict-width =-pict) - (* 2 sep))))) - lhss scs rhss linebreak-list))]) - (case style - [(left-right left-right/vertical-side-conditions) - (table 3 - (apply append - (map (lambda (lhs sc rhs linebreak?) - (append - (if linebreak? - (list lhs (blank) (blank)) - (list lhs =-pict rhs)) - (if linebreak? - (let ([p rhs]) - (list (hbl-append sep - =-pict - (inset p 0 0 (- 5 (pict-width p)) 0)) - (blank) - ;; n case this line sets the max width, add suitable space in the right: - (blank (max 0 (- (pict-width p) max-lhs-w sep)) - 0))) - null) - (if (not sc) - null - (list (inset sc 0 0 (- 5 (pict-width sc)) 0) +(define (metafunctions->pict/proc mfs name) + (unless (andmap (λ (mf) (eq? (metafunc-proc-lang (metafunction-proc (car mfs))) + (metafunc-proc-lang (metafunction-proc mf)))) + mfs) + (error name "expected metafunctions that are all drawn from the same language")) + (let* ([current-linebreaks (linebreaks)] + [all-nts (language-nts (metafunc-proc-lang (metafunction-proc (car mfs))))] + [sep 2] + [style (metafunction-pict-style)] + [wrapper->pict (lambda (lw) (lw->pict all-nts lw))] + [eqns (apply append (map (λ (mf) (metafunc-proc-pict-info (metafunction-proc mf))) mfs))] + [lhss + (apply append + (map (λ (mf) + (map (lambda (eqn) + (wrapper->pict + (metafunction-call (metafunc-proc-name (metafunction-proc mf)) + (list-ref eqn 0) + (metafunc-proc-multi-arg? (metafunction-proc mf))))) + (metafunc-proc-pict-info (metafunction-proc mf)))) + mfs))] + [scs (map (lambda (eqn) + (if (and (null? (list-ref eqn 1)) + (null? (list-ref eqn 2))) + #f + (side-condition-pict null + (map wrapper->pict (list-ref eqn 1)) + (map (lambda (p) + (cons (wrapper->pict (car p)) + (wrapper->pict (cdr p)))) + (list-ref eqn 2)) + (if (memq style '(up-down/vertical-side-conditions + left-right/vertical-side-conditions)) + 0 + +inf.0)))) + eqns)] + [rhss (map (lambda (eqn) (wrapper->pict (list-ref eqn 3))) eqns)] + [linebreak-list (or current-linebreaks + (map (lambda (x) #f) eqns))] + [=-pict (make-=)] + [max-lhs-w (apply max (map pict-width lhss))] + [max-line-w (apply + max + (map (lambda (lhs sc rhs linebreak?) + (max + (if sc (pict-width sc) 0) + (if linebreak? + (max (pict-width lhs) + (+ (pict-width rhs) (pict-width =-pict))) + (+ (pict-width lhs) (pict-width rhs) (pict-width =-pict) + (* 2 sep))))) + lhss scs rhss linebreak-list))]) + (case style + [(left-right left-right/vertical-side-conditions) + (table 3 + (apply append + (map (lambda (lhs sc rhs linebreak?) + (append + (if linebreak? + (list lhs (blank) (blank)) + (list lhs =-pict rhs)) + (if linebreak? + (let ([p rhs]) + (list (hbl-append sep + =-pict + (inset p 0 0 (- 5 (pict-width p)) 0)) (blank) - ;; In case sc set the max width... - (blank (max 0 (- (pict-width sc) max-lhs-w (pict-width =-pict) (* 2 sep))) - 0))))) - lhss - scs - rhss - linebreak-list)) - ltl-superimpose ltl-superimpose - sep sep)] - [(up-down up-down/vertical-side-conditions) - (apply vl-append - sep - (apply append - (map (lambda (lhs sc rhs) - (cons - (vl-append (hbl-append lhs =-pict) rhs) - (if (not sc) - null - (list (inset sc 0 0 (- 5 (pict-width sc)) 0))))) - lhss - scs - rhss)))])))) + ;; n case this line sets the max width, add suitable space in the right: + (blank (max 0 (- (pict-width p) max-lhs-w sep)) + 0))) + null) + (if (not sc) + null + (list (inset sc 0 0 (- 5 (pict-width sc)) 0) + (blank) + ;; In case sc set the max width... + (blank (max 0 (- (pict-width sc) max-lhs-w (pict-width =-pict) (* 2 sep))) + 0))))) + lhss + scs + rhss + linebreak-list)) + ltl-superimpose ltl-superimpose + sep sep)] + [(up-down up-down/vertical-side-conditions) + (apply vl-append + sep + (apply append + (map (lambda (lhs sc rhs) + (cons + (vl-append (hbl-append lhs =-pict) rhs) + (if (not sc) + null + (list (inset sc 0 0 (- 5 (pict-width sc)) 0))))) + lhss + scs + rhss)))]))) (define (metafunction-call name an-lw flattened?) (if flattened? @@ -848,12 +875,12 @@ (basic-text "]" (default-style)))])] [else x])) -(define render-metafunction/proc - (case-lambda - [(mf filename) - (save-as-ps (λ () (metafunction->pict/proc mf)) +(define (render-metafunction/proc mfs filename name) + (cond + [filename + (save-as-ps (λ () (metafunctions->pict/proc mfs name)) filename)] - [(mf) + [else (parameterize ([dc-for-text-size (make-object bitmap-dc% (make-object bitmap% 1 1))]) - (metafunction->pict/proc mf))])) + (metafunctions->pict/proc mfs name))])) diff --git a/collects/redex/redex.scrbl b/collects/redex/redex.scrbl index 4b8a0d77db..022696be4a 100644 --- a/collects/redex/redex.scrbl +++ b/collects/redex/redex.scrbl @@ -1474,7 +1474,7 @@ direct use of creating postscript figures for use in papers and for use in DrScheme to easily adjust the typesetting: @scheme[render-language], @scheme[render-reduction-relation], -@scheme[render-metafunction], and +@scheme[render-metafunctions], and @scheme[render-lw], and one for use in combination with other libraries that operate on picts @@ -1549,16 +1549,24 @@ other tools that combine picts together. @deftogether[[ @defform[(render-metafunction metafunction-name)]{} @defform/none[#:literals (render-metafunction) - (render-metafunction metafunction-name filename)]{}]]{ + (render-metafunction metafunction-name filename)]{} +@defform[(render-metafunctions metafunction-name ...)]{} +@defform/none[#:literals (render-metafunction) + (render-metafunctions metafunction-name ... #:file filename)]{}]]{ If provided with one argument, @scheme[render-metafunction] produces a pict that renders properly in the definitions -window in DrScheme. If given two argument, it writes +window in DrScheme. If given two arguments, it writes postscript into the file named by @scheme[filename] (which may be either a string or bytes). +Similarly, @scheme[render-metafunctions] accepts multiple +metafunctions and renders them together, lining up all of the +clauses together. + This function sets @scheme[dc-for-text-size]. See also -@scheme[metafunction->pict]. +@scheme[metafunction->pict] and +@scheme[metafunctions->pict]. } @defform[(metafunction->pict metafunction-name)]{ @@ -1567,6 +1575,15 @@ This function sets @scheme[dc-for-text-size]. See also picts. } +@defform[(metafunctions->pict metafunction-name ...)]{ + Like @scheme[metafunction->pict], + this produces a pict, but without setting @scheme[dc-for-text-size] + and is suitable for use in Slideshow or other libraries that combine + picts. Like + @scheme[render-metafunctions], it accepts multiple metafunctions + and renders them together. +} + @subsection{Customization} @defparam[render-language-nts nts (or/c false/c (listof symbol?))]{