From 3046afea047f2817a37f92a6abe2e72710772d91 Mon Sep 17 00:00:00 2001 From: Robby Findler Date: Sun, 17 Jan 2010 02:29:29 +0000 Subject: [PATCH 001/113] added an code to avoid a race svn: r17682 --- collects/2htdp/tests/robby-optimization-gone.ss | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/collects/2htdp/tests/robby-optimization-gone.ss b/collects/2htdp/tests/robby-optimization-gone.ss index 8da68f8615..fb70329b00 100644 --- a/collects/2htdp/tests/robby-optimization-gone.ss +++ b/collects/2htdp/tests/robby-optimization-gone.ss @@ -1,4 +1,4 @@ -#lang scheme +#lang scheme/gui (require 2htdp/universe) (require 2htdp/image) @@ -17,4 +17,8 @@ (set! s (string-append "-" s)) (rectangle 1 1 'solid 'green))))) -(unless (string=? s "---") (error 'world-update-test "failed! ~s" s)) \ No newline at end of file +(let ([s (make-semaphore)]) + (queue-callback (λ () (semaphore-post s))) + (yield s)) + +(unless (string=? s "---") (error 'world-update-test "failed! ~s" s)) From a9597eeb8b9241668049d0f9670edc79183198c8 Mon Sep 17 00:00:00 2001 From: Robby Findler Date: Sun, 17 Jan 2010 02:50:41 +0000 Subject: [PATCH 002/113] fixed up the docs for the base shapes to reflect the new pen arguments; added a section about pixels svn: r17683 --- collects/2htdp/image.ss | 5 +- collects/2htdp/private/image-more.ss | 6 +- collects/2htdp/private/img-err.ss | 3 + collects/mrlib/image-core.ss | 2 +- .../teachpack/2htdp/scribblings/image.scrbl | 254 +++++++++++++----- .../2htdp/scribblings/img/10735f73f78.png | Bin 116 -> 108 bytes .../2htdp/scribblings/img/10847861f4b.png | Bin 1292 -> 1277 bytes .../2htdp/scribblings/img/10a0d35fa03.png | Bin 2107 -> 2077 bytes .../2htdp/scribblings/img/1132401ea93.png | Bin 1467 -> 1465 bytes .../2htdp/scribblings/img/11402043018.png | Bin 618 -> 608 bytes .../2htdp/scribblings/img/11b64ab4d3.png | Bin 593 -> 590 bytes .../2htdp/scribblings/img/126418b230e.png | Bin 484 -> 479 bytes .../2htdp/scribblings/img/12948ac080d.png | Bin 216 -> 208 bytes .../2htdp/scribblings/img/12b0447b10c.png | Bin 436 -> 430 bytes .../2htdp/scribblings/img/1325a6e7bdb.png | Bin 1028 -> 1014 bytes .../2htdp/scribblings/img/133309751d2.png | Bin 134 -> 128 bytes .../2htdp/scribblings/img/138792ad221.png | Bin 713 -> 700 bytes .../2htdp/scribblings/img/13aef4074e9.png | Bin 471 -> 466 bytes .../2htdp/scribblings/img/13b344ed2ff.png | Bin 508 -> 497 bytes .../2htdp/scribblings/img/13e518b230e.png | Bin 580 -> 564 bytes .../2htdp/scribblings/img/1404e4b2af.png | Bin 822 -> 813 bytes .../2htdp/scribblings/img/150e1d5e9f.png | Bin 159 -> 159 bytes .../2htdp/scribblings/img/1532990d5cb.png | Bin 2316 -> 2265 bytes .../2htdp/scribblings/img/15717b87d30.png | Bin 135 -> 128 bytes .../2htdp/scribblings/img/157ab5efca7.png | Bin 135 -> 128 bytes .../2htdp/scribblings/img/164b8da7bf6.png | Bin 1787 -> 1797 bytes .../2htdp/scribblings/img/169990a635e.png | Bin 3767 -> 3766 bytes .../2htdp/scribblings/img/169f2ceb45c.png | Bin 1061 -> 1058 bytes .../2htdp/scribblings/img/16a631adf1e.png | Bin 111 -> 106 bytes .../2htdp/scribblings/img/196bfa7b9c4.png | Bin 616 -> 600 bytes .../2htdp/scribblings/img/1a0088e3819.png | Bin 305 -> 321 bytes .../2htdp/scribblings/img/1aaa434b462.png | Bin 816 -> 810 bytes .../2htdp/scribblings/img/1acede17bc6.png | Bin 1759 -> 1751 bytes .../2htdp/scribblings/img/1bbeedc0d6.png | Bin 1078 -> 1073 bytes .../2htdp/scribblings/img/1f0b671ed7b.png | Bin 119 -> 112 bytes .../2htdp/scribblings/img/1f5944ec1ed.png | Bin 269 -> 262 bytes .../2htdp/scribblings/img/201c231dce2.png | Bin 772 -> 745 bytes .../2htdp/scribblings/img/2187216ca96.png | Bin 1007 -> 1007 bytes .../2htdp/scribblings/img/21b080bdda8.png | Bin 1439 -> 1421 bytes .../2htdp/scribblings/img/2330a222ac0.png | Bin 4089 -> 4083 bytes .../2htdp/scribblings/img/24365c877d4.png | Bin 1172 -> 1167 bytes .../2htdp/scribblings/img/24410dd26db.png | Bin 1514 -> 1516 bytes .../2htdp/scribblings/img/24e80ea10b4.png | Bin 1484 -> 1485 bytes .../2htdp/scribblings/img/25354f2b84e.png | Bin 535 -> 522 bytes .../2htdp/scribblings/img/25451dd2997.png | Bin 398 -> 358 bytes .../2htdp/scribblings/img/25dd3e2d97c.png | Bin 985 -> 923 bytes .../2htdp/scribblings/img/262a4fa650a.png | Bin 1572 -> 1542 bytes .../2htdp/scribblings/img/268c974b9ab.png | Bin 288 -> 270 bytes .../2htdp/scribblings/img/26bd803042c.png | Bin 119 -> 112 bytes .../2htdp/scribblings/img/26c4c403875.png | Bin 1471 -> 1462 bytes .../2htdp/scribblings/img/2758748ad7f.png | Bin 1516 -> 1503 bytes .../2htdp/scribblings/img/27bbbb6fd64.png | Bin 1402 -> 1388 bytes .../2htdp/scribblings/img/28253f4c3c.png | Bin 967 -> 966 bytes .../2htdp/scribblings/img/28c73238138.png | Bin 1821 -> 1803 bytes .../2htdp/scribblings/img/28daec71a64.png | Bin 1043 -> 1038 bytes .../2htdp/scribblings/img/29b31e5fe3a.png | Bin 694 -> 686 bytes .../2htdp/scribblings/img/2a1f3988f.png | Bin 1203 -> 1188 bytes .../2htdp/scribblings/img/2b944b7ab91.png | Bin 1262 -> 1235 bytes .../2htdp/scribblings/img/2cc717fb347.png | Bin 1384 -> 1375 bytes .../2htdp/scribblings/img/2d9ba9032e.png | Bin 616 -> 600 bytes .../2htdp/scribblings/img/2dde939d6dc.png | Bin 773 -> 765 bytes .../2htdp/scribblings/img/2e6a31a9033.png | Bin 676 -> 657 bytes .../2htdp/scribblings/img/353ed4578.png | Bin 1203 -> 1188 bytes .../2htdp/scribblings/img/42f9f9e4cf.png | Bin 134 -> 128 bytes .../2htdp/scribblings/img/4e85791a5.png | Bin 744 -> 730 bytes .../2htdp/scribblings/img/54a488e1a5.png | Bin 2116 -> 2082 bytes .../2htdp/scribblings/img/54d58bf7f6.png | Bin 474 -> 460 bytes .../2htdp/scribblings/img/5ec4a0cb1f.png | Bin 868 -> 861 bytes .../2htdp/scribblings/img/69aaaa680d.png | Bin 216 -> 208 bytes .../2htdp/scribblings/img/6a5a617f28.png | Bin 499 -> 446 bytes .../2htdp/scribblings/img/6c262f1d24.png | Bin 530 -> 529 bytes .../2htdp/scribblings/img/6efa12ea15.png | Bin 1348 -> 1315 bytes .../2htdp/scribblings/img/72aef3dc67.png | Bin 736 -> 738 bytes .../2htdp/scribblings/img/7bbcc7cbaa.png | Bin 1118 -> 1111 bytes .../2htdp/scribblings/img/89a0d469a7.png | Bin 168 -> 159 bytes .../2htdp/scribblings/img/89b3a9e462.png | Bin 1257 -> 1231 bytes .../2htdp/scribblings/img/8cb34e62d4.png | Bin 826 -> 796 bytes .../2htdp/scribblings/img/8e1ebaaf82.png | Bin 225 -> 213 bytes .../2htdp/scribblings/img/8e7c1870c7.png | Bin 490 -> 489 bytes .../2htdp/scribblings/img/957fe78565.png | Bin 130 -> 124 bytes .../2htdp/scribblings/img/969a9aa483.png | Bin 206 -> 201 bytes .../2htdp/scribblings/img/9858b8d5d.png | Bin 793 -> 777 bytes .../2htdp/scribblings/img/aac8b78b6e.png | Bin 1395 -> 1394 bytes .../2htdp/scribblings/img/ab1841ea36.png | Bin 390 -> 383 bytes .../2htdp/scribblings/img/aeddf66d5d.png | Bin 461 -> 460 bytes .../2htdp/scribblings/img/b32ce6fcc5.png | Bin 1238 -> 1239 bytes .../2htdp/scribblings/img/cf131e14ad.png | Bin 708 -> 692 bytes .../2htdp/scribblings/img/d417a51b4.png | Bin 130 -> 120 bytes .../2htdp/scribblings/img/d47072011e.png | Bin 667 -> 676 bytes .../2htdp/scribblings/img/d629961aee.png | Bin 993 -> 989 bytes .../2htdp/scribblings/img/d92d6a49f1.png | Bin 676 -> 657 bytes .../2htdp/scribblings/img/eb99639e31.png | Bin 1949 -> 1911 bytes .../2htdp/scribblings/img/fa1a9f17b6.png | Bin 1348 -> 1315 bytes .../2htdp/scribblings/img/fdaad0760b.png | Bin 1176 -> 1220 bytes .../2htdp/scribblings/img/ff11314e4e.png | Bin 1664 -> 1636 bytes .../2htdp/scribblings/img/ff2fcb7b87.png | Bin 207 -> 202 bytes 96 files changed, 197 insertions(+), 73 deletions(-) diff --git a/collects/2htdp/image.ss b/collects/2htdp/image.ss index 6fcdd1c1dd..fb81e88b3a 100644 --- a/collects/2htdp/image.ss +++ b/collects/2htdp/image.ss @@ -101,11 +101,14 @@ and they all have good sample contracts. (It is amazing what we can do with kids angle? side-count? image-color? + pen-style? + pen-cap? + pen-join? (rename-out [build-color make-color]) color-red color-blue color-green color? color (rename-out [build-pen make-pen]) - pen-color pen-width pen-style pen-cap pen-join + pen-color pen-width pen-style pen-cap pen-join pen image-width image-height diff --git a/collects/2htdp/private/image-more.ss b/collects/2htdp/private/image-more.ss index 4ce7b08f4b..4af533fb28 100644 --- a/collects/2htdp/private/image-more.ss +++ b/collects/2htdp/private/image-more.ss @@ -59,12 +59,12 @@ (define (save-image pre-image filename) (let* ([image (to-img pre-image)] [bm (make-object bitmap% - (inexact->exact (ceiling (+ 2 (get-right image)))) - (inexact->exact (ceiling (+ 2 (get-bottom image)))))] + (inexact->exact (ceiling (+ 1 (get-right image)))) + (inexact->exact (ceiling (+ 1 (get-bottom image)))))] [bdc (make-object bitmap-dc% bm)]) (send bdc set-smoothing 'aligned) (send bdc clear) - (render-image image bdc 1 1) + (render-image image bdc 0 0) (send bdc set-bitmap #f) (send bm save-file filename 'png))) diff --git a/collects/2htdp/private/img-err.ss b/collects/2htdp/private/img-err.ss index 2903a3bf4e..2b072c8ac7 100644 --- a/collects/2htdp/private/img-err.ss +++ b/collects/2htdp/private/img-err.ss @@ -8,6 +8,9 @@ angle? side-count? image-color? + pen-style? + pen-cap? + pen-join? image-snip->image bitmap->image check-mode/color-combination) diff --git a/collects/mrlib/image-core.ss b/collects/mrlib/image-core.ss index 29e02a9ae0..ceee10e07c 100644 --- a/collects/mrlib/image-core.ss +++ b/collects/mrlib/image-core.ss @@ -908,7 +908,7 @@ the mask bitmap and the original bitmap are all together in a single bytes! curve-segment-start curve-segment-s-angle curve-segment-s-pull curve-segment-end curve-segment-e-angle curve-segment-e-pull curve-segment-color - make-pen pen? pen-color pen-width pen-style pen-cap pen-join + make-pen pen? pen-color pen-width pen-style pen-cap pen-join pen make-bitmap bitmap? bitmap-raw-bitmap bitmap-raw-mask bitmap-angle bitmap-x-scale bitmap-y-scale bitmap-rendered-bitmap bitmap-rendered-mask diff --git a/collects/teachpack/2htdp/scribblings/image.scrbl b/collects/teachpack/2htdp/scribblings/image.scrbl index 53026fa901..ac1899b94f 100644 --- a/collects/teachpack/2htdp/scribblings/image.scrbl +++ b/collects/teachpack/2htdp/scribblings/image.scrbl @@ -8,10 +8,18 @@ lang/posn "shared.ss" "image-util.ss" + scribble/decode scribble/manual) @teachpack["image"]{Images} +@(define mode/color-text + (make-splice + @list{If the @scheme[mode] is @scheme['outline] or @scheme["outline"], then the last + argument can be a @scheme[pen] struct or an @scheme[image-color?], but if the @scheme[mode] + is @scheme['solid] or @scheme["solid"], then the last argument must be an + @scheme[image-color?].})) + @defmodule[#:require-form beginner-require 2htdp/image] The image teachpack provides a number of basic image construction functions, along with @@ -27,70 +35,85 @@ Existing images can be rotated, scaled, and overlaid on top of each other. [color image-color?]) image?] [(circle [radius (and/c real? (not/c negative?))] - [mode 'outline] - [color pen?]) + [outline-mode (or/c 'outline "outline")] + [pen-or-color (or/c pen? image-color?)]) image?])]{ Constructs a circle with the given radius, height, mode, and color. - If the @scheme[mode] is @scheme['outline], then the @scheme[color] - can be a @scheme[pen?] struct or an @scheme[image-color?], but if the @scheme[mode] - is @scheme['solid], then the @scheme[color] must be an - @scheme[image-color?]. - - @image-examples[(circle 30 "outline" "red") - (circle 20 "solid" "blue")] + @mode/color-text + + @image-examples[(circle 30 "outline" "red") + (circle 20 "solid" "blue")] } -@defproc[(ellipse [width (and/c real? (not/c negative?))] - [height (and/c real? (not/c negative?))] - [mode mode?] - [color (or/c image-color? pen?)]) - image?]{ +@defproc*[([(ellipse [width (and/c real? (not/c negative?))] + [height (and/c real? (not/c negative?))] + [mode mode?] + [color image-color?]) + image?] + [(ellipse [width (and/c real? (not/c negative?))] + [height (and/c real? (not/c negative?))] + [mode (or/c 'outline "outline")] + [pen-or-color (or/c image-color? pen?)]) + image?])]{ Constructs an ellipsis with the given width, height, mode, and color. - If the @scheme[mode] is @scheme['outline], then the @scheme[color] - can be a @scheme[pen?] struct or an @scheme[image-color?], but if the @scheme[mode] - is @scheme['solid], then the @scheme[color] must be an - @scheme[image-color?]. + @mode/color-text @image-examples[(ellipse 40 20 "outline" "black") (ellipse 20 40 "solid" "blue")] } -@defproc[(triangle [side-length (and/c real? (not/c negative?))] - [mode mode?] - [color (if (or (equal? mode 'outline) - (equal? mode "outline")) - (or/c image-color? pen?) - image-color?)]) - image?]{ +@defproc*[([(triangle [side-length (and/c real? (not/c negative?))] + [mode mode?] + [color image-color?]) + image?] + [(triangle [side-length (and/c real? (not/c negative?))] + [outline-mode (or/c 'outline "outline")] + [pen-or-color (or/c pen? image-color?)]) + image?])]{ + Constructs a upward-pointing equilateral triangle. The @scheme[side-length] argument determines the length of the side of the triangle. -@image-examples[(triangle 40 "solid" "tan")] + @mode/color-text + + @image-examples[(triangle 40 "solid" "tan")] } -@defproc[(right-triangle [side-length1 (and/c real? (not/c negative?))] - [side-length2 (and/c real? (not/c negative?))] - [mode mode?] - [color image-color?]) - image?]{ +@defproc*[([(right-triangle [side-length1 (and/c real? (not/c negative?))] + [side-length2 (and/c real? (not/c negative?))] + [mode mode?] + [color image-color?]) + image?] + [(right-triangle [side-length1 (and/c real? (not/c negative?))] + [side-length2 (and/c real? (not/c negative?))] + [outline-mode (or/c 'outline "outline")] + [pen-or-color (or/c pen? image-color?)]) + image?])]{ Constructs a triangle with a right angle where the two sides adjacent to the right angle have lengths @scheme[side-length1] and @scheme[side-length2]. + @mode/color-text + @image-examples[(right-triangle 36 48 "solid" "black")] } - -@defproc[(isosceles-triangle [side-length (and/c real? (not/c negative?))] - [angle angle?] - [mode mode?] - [color image-color?]) - image?]{ + +@defproc*[([(isosceles-triangle [side-length (and/c real? (not/c negative?))] + [angle angle?] + [mode mode?] + [color image-color?]) + image?] + [(isosceles-triangle [side-length (and/c real? (not/c negative?))] + [angle angle?] + [outline-mode (or/c 'outline "outline")] + [pen-or-color (or/c pen? image-color?)]) + image?])]{ Creates a triangle with two equal-length sides, of length @scheme[side-length] where the angle between those sides is @scheme[angle]. The third @@ -98,72 +121,118 @@ Existing images can be rotated, scaled, and overlaid on top of each other. @scheme[180], then the triangle will point up and if the @scheme[angle] is more, then the triangle will point down. + @mode/color-text + @image-examples[(isosceles-triangle 200 170 "solid" "seagreen") (isosceles-triangle 60 30 "solid" "aquamarine") (isosceles-triangle 60 330 "solid" "lightseagreen")] } -@defproc[(square [side-length (and/c real? (not/c negative?))] - [mode mode?] - [color image-color?]) - image?]{ +@defproc*[([(square [side-len (and/c real? (not/c negative?))] + [mode mode?] + [color image-color?]) + image?] + [(square [side-len (and/c real? (not/c negative?))] + [outline-mode (or/c 'outline "outline")] + [pen-or-color (or/c pen? image-color?)]) + image?])]{ Constructs a square. + @mode/color-text + @image-examples[(square 40 "solid" "slateblue") (square 50 "outline" "darkmagenta")] } -@defproc[(rectangle [width real?] [height real?] [mode mode?] [color image-color?]) image?]{ +@defproc*[([(rectangle [width real?] + [height real?] + [mode mode?] + [color image-color?]) + image?] + [(rectangle [width real?] + [height real?] + [outline-mode (or/c 'outline "outline")] + [pen-or-color (or/c pen? image-color?)]) + image?])]{ Constructs a rectangle with the given width, height, mode, and color. + + @mode/color-text + @image-examples[(rectangle 40 20 "outline" "black") (rectangle 20 40 "solid" "blue")] } -@defproc[(rhombus [side-length (and/c real? (not/c negative?))] - [angle angle?] - [mode mode?] - [color image-color?]) - image?]{ +@defproc*[([(rhombus [side-length (and/c real? (not/c negative?))] + [angle angle?] + [mode mode?] + [color image-color?]) + image?] + [(rhombus [side-length (and/c real? (not/c negative?))] + [angle angle?] + [outline-mode (or/c 'outline "outline")] + [pen-or-color (or/c pen? image-color?)]) + image?])]{ Constructs a four sided polygon with all equal sides and thus where opposite angles are equal to each other. The top and bottom pair of angles is @scheme[angle] and the left and right are @scheme[(- 180 angle)]. +@mode/color-text + @image-examples[(rhombus 40 45 "solid" "magenta") (rhombus 80 150 "solid" "mediumpurple")] } -@defproc[(regular-polygon [side-length (and/c real? (not/c negative?))] - [side-count side-count?] - [mode mode?] - [color image-color?]) - image?]{ +@defproc*[([(regular-polygon [side-length (and/c real? (not/c negative?))] + [side-count side-count?] + [mode mode?] + [color image-color?]) + image?] + [(regular-polygon [side-length (and/c real? (not/c negative?))] + [side-count side-count?] + [outline-mode (or/c 'outline "outline")] + [pen-or-color (or/c pen? image-color?)]) + image?])]{ Constructs a regular polygon with @scheme[side-count] sides. + @mode/color-text + @image-examples[(regular-polygon 50 3 "outline" "red") (regular-polygon 40 4 "outline" "blue") (regular-polygon 20 8 "solid" "red")] } -@defproc[(star [side-length (and/c real? (not/c negative?))] - [mode mode?] - [color image-color?]) - image?]{ +@defproc*[([(star [side-length (and/c real? (not/c negative?))] + [mode mode?] + [color image-color?]) + image?] + [(star [side-length (and/c real? (not/c negative?))] + [outline-mode (or/c 'outline "outline")] + [color (or/c pen? image-color?)]) + image?])]{ Constructs a star with five points. The @scheme[side-length] argument determines the side length of the enclosing pentagon. + @mode/color-text + @image-examples[(star 40 "solid" "gray")] } -@defproc[(star-polygon [side-length (and/c real? (not/c negative?))] - [side-count side-count?] - [step-count step-count?] - [mode mode?] - [color image-color?]) - image?]{ +@defproc*[([(star-polygon [side-length (and/c real? (not/c negative?))] + [side-count side-count?] + [step-count step-count?] + [mode mode?] + [color image-color?]) + image?] + [(star-polygon [side-length (and/c real? (not/c negative?))] + [side-count side-count?] + [step-count step-count?] + [outline-mode (or/c 'outline "outline")] + [pen-or-color (or/c pen? image-color?)]) + image?])]{ Constructs an arbitrary regular star polygon (a generalization of the regular polygons). The polygon is enclosed by a regular polygon with @scheme[side-count] sides each @@ -173,18 +242,26 @@ other. The top and bottom pair of angles is @scheme[angle] and the left and righ For examples, if @scheme[side-count] is @scheme[5] and @scheme[step-count] is @scheme[2], then this function produces a shape just like @scheme[star]. + @mode/color-text + @image-examples[(star-polygon 40 5 2 "solid" "seagreen") (star-polygon 40 7 3 "outline" "darkred") (star-polygon 20 10 3 "solid" "cornflowerblue")] } -@defproc[(polygon [verticies (listof posn?)] - [mode mode?] - [color image-color?]) - image?]{ +@defproc*[([(polygon [verticies (listof posn?)] + [mode mode?] + [color image-color?]) + image?] + [(polygon [verticies (listof posn?)] + [outline-mode (or/c 'outline "outline")] + [pen-or-color (or/c pen? image-color?)]) + image?])]{ Constructs a polygon connecting the given verticies. + @mode/color-text + @image-examples[(polygon (list (make-posn 0 0) (make-posn -10 20) (make-posn 60 0) @@ -692,10 +769,20 @@ the parts that fit onto @scheme[scene]. } @defproc[(scale [factor real?] [image image?]) image?]{ + Scales @scheme[image] by @scheme[factor]. + + The pen sizes are also scaled and thus draw thicker (or thinner) + lines than the original image, unless the pen was size + @scheme[0]. That pen size is treated specially to mean ``the + smallest available line'' and thus it always draws a one pixel + wide line; this is also the case for @scheme['outline] and @scheme["outline"] + shapes that are drawn with an @scheme[image-color?] instead of + a @scheme[pen]. + - @image-examples[(scale 2 (ellipse 20 30 "solid" "blue")) - (ellipse 40 60 "solid" "blue")] + @image-examples[(scale 2 (ellipse 20 30 "solid" "blue")) + (ellipse 40 60 "solid" "blue")] @@ -916,3 +1003,34 @@ The baseline of an image is the place where the bottoms any letters line up, not Two images are equal if they draw exactly the same way, at their current size (not neccessarily at all sizes). +@section{The nitty gritty of pixels, pens, and lines} + +The image library treats coordinates as if they are in the upper-left corner +of each pixel, and infinitesimally small. + +Thus, when drawing a solid @scheme[square] of whose side-length is 10, the image library +colors in all of the pixels enclosed by the @scheme[square] starting at the upper +left corner of (0,0) and going down to the upper left corner of (10,10), +so the pixel whose upper left at (9,9) is colored in, but the pixel +at (10,10) is not. All told, 100 pixels get colored in, just as expected for +a @scheme[square] with a side length of 10. + +When drawing lines, however, things get a bit more complex. Specifically, +imagine drawing the outline of that rectangle. Since the border is +between the pixels, there really isn't a natural pixel to draw to indicate +the border. Accordingly, when drawing an outline @scheme[square] (without a +@scheme[pen] specification, but just a color as the last argument), +the image library uses a pen whose width is 1 pixel, but draws a line +centered at the point (0.5,0.5) that goes down and around to the point (10.5,10.5). +This means that the outline slightly exceeds the bounding box of the shape. +Specifically, the upper and left-hand lines around the square are within +the bounding box, but the lower and right-hand lines are just outside. + +The special case of adding 0.5 to each coordinate when drawing the square +applies to all polygon-based shapes, but does not apply when a @scheme[pen] +is passed as the last argument to create the shape. +In that case, not adjustment of the pixels is performed and using a one +pixel wide pen draws the pixels above and below the line, but each with +a color that is half of the intensity of the given color. Using a +@scheme[pen] with with two, colors the pixels above and below the line +with the full intensity. diff --git a/collects/teachpack/2htdp/scribblings/img/10735f73f78.png b/collects/teachpack/2htdp/scribblings/img/10735f73f78.png index 41d52546c029c301eb9d249cb7f4ac20078023d9..74b36d7285bc0db1d1e0be1e257749ae54a8838c 100644 GIT binary patch literal 108 zcmeAS@N?(olHy`uVBq!ia0vp^nm{bd!2~2jb_J9JDPvC;$B>FSZ?A3SWpLm)>~QFx zbvsk%zuErD`UPvfgH$ga+NNCgKU_Zt0^Tfd+Hb}g&uk=dH&z*_ox#)9&t;ucLK6Tr C+adq} literal 116 zcmeAS@N?(olHy`uVBq!ia0vp^T0ktu!2~2NC1>6OQr4a>jv*Cu-d@`%$e_S;*x|^= z|EHEMNMtNf*8N}^u6R;o8q10c2duyKpGh} L>gTe~DWM4fUR5Qf diff --git a/collects/teachpack/2htdp/scribblings/img/10847861f4b.png b/collects/teachpack/2htdp/scribblings/img/10847861f4b.png index 28209c64d492b4109274bf0e61229e42f718fea4..93d0e905571eb7762cd1eece17362c6cb72d354b 100644 GIT binary patch literal 1277 zcmV56}cHFl%ZBrdBRY7Fxk(op(RH+mZ1>vY0nT66}7J|BPA*e9w!i6xn5v@?E zcMugs##`k$UN|VyYVCMI)T2dfFLppgv1-!fEFz9}nzWA9XBGbU<9`xDlJ5&dQ4|OP zr_(txF<~;9*4NkVcDvi{_W67e1W^>l(px3^4{e(de-Ra8{)`TV-Nx{Heomde2H{r!EFN`+yV*=!C` z>Bs5mX>oCJTwL7p^70ehMxzmi;g*(`KeIk$a&i)eVZB}-l6!G+5ddH`8lNwwvDs`g znXId;D~Nk^bW|h~SuB=tiD{0GjsO7d?d^jtGkPIzZf;~U z+1%XRFL!NiZCP2_ON(i`ySvqD^_`m}Nd!T5cXwaMO_HQsE?-$$p(u(oKR+K66O)jT z5X#&C`9Kh))oKj}0|0_u=+)`?sBM zIEgFYDubp>93CDzolYn+GVWNLVo#YO06v_UDZ~nvh&^R-yIiiQs3?w5D0Da+OhwxFT9$}CWpO(k4v9p&_G+>d8 zFT+XPY&ZL@m!+3|{Ocoo%Hkdy8v_7v^YZctg1|70sZRM;`A+oi=he?M@7Wvfn-9_t z^;z}zTeGK3=yW<1MS)(gFDWT`oev2OK@b9g;Q06$oSdBS`TWq^@8@GQ8Ziu`=W zlaqBi-NVI4GtuDSAOPU#=qSA6^Yio6)YPh~D!+CAS=ex1TRIo6T~$yuQ9ZU>bP#9~c-A3WXgV9e-@aalE0SK_n8f%y^9d zJT^8qFbvaZG$xbjNmi01`}+D46B7#y3y+VFSt=Rb6h--bKAld7AV_X*?$p%O{d38L z)9Gw#YKo7K&&bG_nVAWCmO=hA0RXPAuZM<)+S}Xr_V)7g^DzuVQ4~QCu~>Y1dg}3b ztXAvh=H~SDwB2qmDk>^1Elp2PXWx@1xci=ylaulBag)hpu~-}qhsWa)2m~+;CnqN> n6biLkjiP8oL_~PEUyB3%S@BSooQs0$ZDaU(TC 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 Hu0mjfxQPk4 literal 2107 zcmV-B2*me^P)H{?~000OANkl& zPi))P9mjus`macGY^#dwNLC{|sf@0T9V2NHyXg+C*Z8oa=%MKX483f~nnRL9kq#~9 zdPT7m>wxw!q`)r2u&wK17_fueWW98?m&}D5ryWqQv7O3t9a&NANR%a!6vZ9LNis!B zd_OCWynSvV--mo(J-$DDQp`w_1pj}S^-hTS;{2Zyw7U#Z%$|5^Cw>p3B#u8+mVJodVy`#DRsa_#cMAIJXw z)jwi&Yt?%+_=C}7{lj7TpW3mn|8g<$Sz2|_chIx{<*wRSU-;YF$FD4Co_g{^IQ&$r zo;dRkcm3UbjVt$^weLS;EB#X{!o}0$*Dld-7Y*-yrz>@u%;>g)IU+L-}h=AHc4@0axt-u#p{GXRXgH~qnzp8{0H zmWpuW_i;V##vkHRQTL*gZ!HQrQSYpf6DQwVtUk_uQ=A&BlUZhJEYE(U-2SicP8m_E zkwtav_{81ZZS6JzfLwx)Pu$f!6~C5QoJiHa<>Evtel4RqIDH{6a)xFTk&~t`82W(f zqK+N=XtlPWS77G1y3a_BV#ygXdPy)M%0w>-$r%vL(7Ge12A+TQaZtsMPu6)#^@`1n zuNqwTNRl)+t~@VA9-<#oG__3hBcaFxL*S*0BX3+f*?Tl-#Ogg7eB;u|moAPl1VFW1 zNlY1PvBXrm`-HFZ$o%CsqqPQ@zr1$f#~lC=zgpl~>NO&tmf}|noyW`o&_5jR9}Xjy zE9Ka^gpgS>G+<mOD6!M^rt50b^H~76a|2lgwAc`o*z6+pqK}Q{0U#Act`<|#yxDLM#?dQm1F;~Wnd-M3JI7E368CPv+8vXV(quPzlm!F$5U+M~r1il1Gf zuDz^eZ&R->75%p0ebj_=(P9Y#0Q}v8n5Ui+#C(xYiTSkx?#B7Gf_FbQHdZV_03eq@ zwpeb3=UC)|iDO0oVYAg!Yj02!tB3I)*4_Cu2myfnDl#^=DhTVy*uuI;CMX=H4)SjoUEc9YFe4>#GEf%Epw-w~A98EpT|h{Q}iCMh@mujqb|92zwg z=Fq6!{orP2Y~}6%AYeyhffY>_Wb8_D-wW3LXX+&HJ8R$fLIZlW3;}>b78$#c6)iiE zJxwL{owW_U?XJPzYW7}JiD+f){-p=%$v-O>8WW#Dg0Knjv64i*DpeaV4^?G}qxS!E)8D;>mwwO$ILi?qs$xf^-+CAAD zaSs2gy8*SkXDG`or=NN*MJUaK65B<;gg_|GgA#j3kU9fGX&#i=?hy6P7D8zrl-Qmy z_0E>3ySWBuDwNpPoo0uZVj6RJt$M@wwxIl`-SQAc>roYMLdvn*zC*FCM^(59sfhgu z#k&zz;U=UU+u^gg0)_@>SHNESuLIkZ4ZCQ*Lxy%p3>Ir^-Tw zxw-eGpJ~hw!|pR0A$A?{_zr4})xLwCT}QV47%rpTb`PHps9sJyVaLO#16xw1tw8&a l6u{>GBt`S18~cBo{{R`A(zvRy!ma=S002ovPDHLkV1g^b6G{L8 diff --git a/collects/teachpack/2htdp/scribblings/img/1132401ea93.png b/collects/teachpack/2htdp/scribblings/img/1132401ea93.png index 48045cdc4c1b00a0a114b179b22cca979d7deb7d..76bd2360806b3084940a78b0d5e1761d0787f5fe 100644 GIT binary patch literal 1465 zcmV;q1xEUbP)_gQ>&r~6b+$83n`LF3u}?oqNr?D%T_IF+oB+=RUbqjL_w>f zHbtft*_Up_h2|HI6k#y=5%VnKiRXP^=gys(Y z0N{uH!~S9CRw7o`#l^*Sb#)aL6{V%6QmGUG@b>l=i^U!vA8&7OpPrsrMZ-{x%F4YolXM)^7He{%gb>bZ)j);1OhudJBy2pkw}CwCPh)q;E9Qe zcsxEkJFC@d;g(vhc6N3)9*<8D7jqD{26~sE|*gjwYl7)qZe82?-1#fR}bfd6& z9twqU9OuK9%jNLI0Ap8FRPbbnLLn~fi;D}!1P+&0tG&FuU@&lF8w`g1{e5n} z005v;sXQJJH(!s(qf)6L2F$gC*XxCc$SRde<@I{uHq3j$m6a8X#ln_tu~=4CR@i#| zS4yQa8jZ5b$s&;`8jUKIO1K$Pt$1{F)YH?0&hGB+K0ZEXG(%z=jmFc{Q*`#p$%)Bi z`Wkj#US2pHuBoX(0oT;jgu~&yygU>(^PcGa{oQ7>jgF3@u&q|>{QUg;`#Xv;l1fTS zo}Zr?YgU;|_Wb-@Qc{8v6SdzGkH@#Rwnj!q;AU2PRFakx1wa zBoav^5~;4PMhu8F*FLqoy9@c%tyb&a-X3~1c5IbO6$k{f<{6PlX1m?aHVzlIUaxn%-Ji7- zhGA~ETd&uD2O9w3bUHgbJ3n4`b#-wo2syG_TU+n$?l26)Fzo*RzNMw*``7@0tE;Py zjt-;I2(Q3%!ZsKTE|=@(=BBN!?Yr3k0H4q2^Z7Wt|DC=2wzjrJBJukA%K4dd*X8A< z(P$K4t_k@c6D+p~nNtN@ON3lQ1*;v@YPH|*7p7*~+uO5Rt#qR~tQD)Os-n^8*Vf3W zIdyz|+-9>SlSw**WHPz1urM|@h8Pf4Lhgx1Mn*O_HyQi*1VLjS-X24Uoc1(f&zw&`mQNoT zfZX@6X~%FJkHum+?cLKpbB#vhbUHcjTqufiI2`a37Z{u4X~%Cdp19Dm)oL||3h+;z zpP$30IxQQ=aaKp}|5q>=)o#&ZMCOM^o}Q*C3bG%dlSCq+C~9hI3Sz^Yt=HGrT`m`^6oKP7Ns^P3lW;Q@cd6#) z<{BFt;g*e!jdOEz=y$15?~n})446!&%F4=*J7keaB%MxE6eSjm%gV|=?vVNY{+*qj zrKKgrJ7nyZ=g+%yGMP*&m0}o1k|aS89PZBX>MQcp-`Q9EVgImy*oeXe%rCzHxYROP T1T?J_00000NkvXXu0mjfdH2Qj literal 1467 zcmV;s1w{IZP)tzZ0Pyni5{*Xh@9)pg&mSHhIC-NWgcL<# zbwx!*Jv}`Zi$$eUot~ZsgTYWJ^!oY=0LaeHE-o&nY5LEfKX-R`YinyWGc)0E80!;4 zNECF3hlgXa*u=zy!C*iu4F8y+718vOY9ID}BCRASw|n^LKS5YElbq4yOZ z^T)=QyQg!!Qbkf*kzO6bc2yFe;S_fkv&q zv$Jz?agkvdet3pq78Vw|y1Gyz#On9<_G)Wu`LWYhTU)!gw}(O_@J~-qd3kw4@OgQ8 zPft&L@KULiWmzHYw6QEJl}a<=Gyd)+5=knR5{^%$QW8n#*oxSEmSuBubA_;Ta&lf? zUJz*1$qxpDG))V^E0s!gz`)>3N=gLcgTWwA{L#@7HprvRU@#mXAM?a}JRZGXF9fgG z>pdP1N`W|fG)*%MLvkH|Y7|99qfx}^!QXgZueYYAh9ADBrpD{_A_Vvw&+T@bOeTJK zlgZ?EyD=j4>a|*}&*$TZ_xXHUtrmmErW-dmH)t=PnpUg5xw%1Wh@P19^Yb>FjVs<} zv(3-X<8|28tJUgAB!Y_Df0;xgi9{l5wHl8mNj0~&wmLdG$nov%?c3YiSQ#naY&P%i z?vmqoc6KZl%a`G^va&*zm6etL{(iK~Znry~&R8r)=$1oe zOQX?*!(o|BmPsI!$-?2VMx)_?=2Tc)UtdR@0K47pa=FO8amH)4+Pk~EPeYJIBJunE zI-Twt@c@AB?d?xvu+3&82{l6Tb#-;0-hn=!udc4{+wlN^{r&y6wziMoX=`iS-{0rz zhbP`>G+tj{zb9c7MO|NC8;!<)ga-f|9v-%|w4}doZEeNmlV6T+XlS^&xS%MCqNvNu z%li8Ie~JeHoSd9AH#eKjW^^Y1U3inp|u(-x1%Gpzx2@>8i)c6PRK zJh~H}5uZ#Z6N!ZI@quJAnM@`*;{gCyS65Y4RYLGpRaIA4R|o+Lzp=5=+}tb#-_+E! zxw(l_h&wogxpKzF#vp`gsBT!$CeW#$jNtySv+Bv6PmUrU&N2;qdG0D}+!gl@=8hr3dExe*fCq z+U)Es;lLaz{@vck1r-W~TrQ_5ie*`bVR(!S3ax4iw4Yqn{Kfy`fAPGH68B$2{s+7K V;??1=yX002ovPDHLkV1h!&&rARS diff --git a/collects/teachpack/2htdp/scribblings/img/11402043018.png b/collects/teachpack/2htdp/scribblings/img/11402043018.png index 4d58aaeb8ce2b9912b6d727e11f558275c11833d..19d80754fd6cab1b48b7a89f7a17552951b3fca0 100644 GIT binary patch literal 608 zcmV-m0-ybfP)kLLaxKlk}_zkQ)w_ zV+Y6M5Bbjwhu?2~KLY~J!48~*9XJO&a1M6h9PGe3*nxAf1Lt4|&cP0xgB|qa5Ec8V z*ket5#~Q>>O_-NV2_YY!UjvMn*uy%6`69o@`85vn1+~GV1^BPet(s z_p`bj{EK|=OGbq{tHpu8rw~G&)#AY4QwX8X;yWCRgHTT)A{rcv1J9kv4mDxxWP&wq zolJPv6WKworx2W-#dJ{VDFjbvF&%aaJ%uP4-F0;q%^|B!fm%-?g09Y@IjHv(qO-F& z4p=>fXzwh718z?tS~`p1fZJ1umd>g==;$c~)LB&r9X*ABI;-TMucr_%JFDcNucr_% zJ1g&?yQdJ(ot1Q`3G>clj7O5eJCB>|FX_&IkC|=vG~b379CXQ4As^B|yq7%ow6x9_?-EOnO!X$qk3c zu^R?uS(3lckPvb@efNDDLX1XVZ+)Kw4n{*KjD}7a4V^F=I$<<)!f5D((a;H_p%X?! zCya(p^rqpbdq3S{O&ekj>O@JH70w7D?;oE7j7!(ym%ewXThL}Pr>G_WEIQ6FC%4cy2=)WjD@12?h|HStBzkP%r3D82|9G9n8B#aC2A zUSuI&##dBBUSuI&##cx~c4Q%*GYN2wNQUCw|07*qoM6N<$ Ef|9lmZU6uP diff --git a/collects/teachpack/2htdp/scribblings/img/11b64ab4d3.png b/collects/teachpack/2htdp/scribblings/img/11b64ab4d3.png index cd3326d0966447f31bcd1c8c06ecb169057c4f1a..db3f38aa1c3e3fa5a33863f572a968d069944354 100644 GIT binary patch literal 590 zcmV-U0pjCLVrQ&QUy0D9V{*4B;7kW6}se4=-Q!_LIuIC z6qF7{C#QBOwZts`8WcieV&v_6cMb{Cq#Cqv=RI)WEqRaQGu%tKhcNjORP|gc+Zs^a z)=IN(y;-;3tXpr^tvBn|n|14rs@qk!^@m&)JwPA41dF9uEX8^TFi2yN!M+^!wBF~8M5Rs_TP2}?zuM}xQQWlsm&F-yC;RLlz64Yi;E!ur1DN? z!ply1y}1h=-79lx0Ls7k zm+3Y-4L1PPcEs{*J!-T*l5qn-Ws|QLT5w8k04Of}sg?wga|?}&5fb?Z(_#vKgd#QVhQRhou7 zHRen%1b^S1O}SroY2=B2zYuqO+P*Z}9i;K@n|NmY45Xp%ct75J85^7N&%4zd=f2<^ z!W1`|xsSPXHgs6$T=O~x8RO@gGsUF3&1wAZ{F`;_&ARnw-FmZby;-;3tXpqX-Aqb_ c|6*0w3AEsYzjj#IZ2$lO07*qoM6N<$g4v5BZvX%Q literal 593 zcmV-X02)Tsw#$77E=; zq2eGqb<#nsq*-irPzXtrraV4(k3&K+u?cI;g_7Gk=`3AGmaZd9*O8^`$kKIW={jOecN5+HMX5<1$cL8^shmjV#K;5%c?t?N zR-&=8i=l~j9a--6-Gou5jF8ylO6gbkAjK91J!I2K& z+uI0C>8)*^2j(D_^dL`QNTS^7bVyUT{L7WJJJR>2>GU8^7oVmJHx6-{OHYr}xreFg1^=kI zfQj^D4l@j*a~dHTJ-8!B430}rQc&P9E?uZ*liQrlPtxC6x{fSeN0zQ5OV^R5>&Vh| f#F#Gl{vG)@HwA^m2~u*U00000NkvXXu0mjf3-c4S diff --git a/collects/teachpack/2htdp/scribblings/img/126418b230e.png b/collects/teachpack/2htdp/scribblings/img/126418b230e.png index 042649d335f6c175cda324249f471204482938b1..6d834be9f92e75d3d9c6b49736e1d677fed2a199 100644 GIT binary patch literal 479 zcmV<50U-W~P)x5$;r?9TWy540JW6Y(GaHc8AGR9bYz0SuY zec%q~=`2Jr48bs*g`iJkbSGEJOHnNAOHsH|l9k9#ah`kQxU9W#jPsmoM0E1IE-K6C zEm2weT}M-*IVGGQl=?PKsf2Ty62U2Knp4}pZa=kc*fazsQzvJdR?bJlxid|sN~TUr z{-M3ZUNCWb&OZdD7fhVuqIl#V!W+kU%Ns)5$?v)dcU>YO%z8oF={5i0XwzQMbAs{@ zVb%*8PV4!HFz5vhr}g|p81w?x36p;a-Cn>tVe${5+Y2ZseEuP{dI9Bx&p&t=onF{> z(#<~vz85x}9`FCVkYpLA7dD(CA%ec&Nr?r0kGU_`oLni5pQ8{lq8HYjDEWuL^aAKa z&p*UwFMv)-mJ#z09#X0G+<@QaU$@&I_@MZ||5f(II^nQRIII(nPjqtTd49LUPwpye VynxMl35);$002ovPDHLkV1gq;+xP$g literal 484 zcmVJ0 z9D{nxvZ(LFS4!P(w@+)laJgJIpLX~gr$xbOQE*xmoE8OZT47a%Rb^|cL1;SYm+(}Gr<=eu#dAMeI7&U5*u zRBPY1QCU8piOO={w!&GdR+6Thd45@(=Oj&qvm&jqt`AM~e*VxjVO>j>`C8sI8J?9S zO}%MikMp(eQGgy5#)7H!90dqTESOqxQ9Pmmu^Y#DO&x-xwQt)9_X0&)^J2l#dXECQ z&W#0G3yJ~+FBUW{a}*#Lv7l+0qX5B(1wjiF1qf;^2wIpZKu}|W)xt*sf)op^7Cs8# zl_;@5X;Gs9fse(y*5mfU3Q3k>VzI6jX&rQ(4JDvpT^dpV0000FSThE^qZBP(!Ie5^< zgz>V0sISnW3oafDYL1 z!@2SM47Dw~taaKq9yI81v&(UnJP2$QvJrW4;JhS*)`w(mn|4**OXqfX0-ea<>FVdQ I&MBb@0AQm|EC2ui literal 216 zcmV;}04M*6P)s3`Wu79IG0Zn`8_3A3$62QBlhv0 zj)Rn<>v}dKeDBLOUq{I|rh1a&^L70289G}0<&GZyd`CBbwquAt+%e7{?3m;Cb}aDw zIu`kj4i5frM+iLp?~askp4fL5{#Qrl0~8| SAsEvD0000e_M0_ diff --git a/collects/teachpack/2htdp/scribblings/img/12b0447b10c.png b/collects/teachpack/2htdp/scribblings/img/12b0447b10c.png index ea65c0a194fbf3415f5f4a8046fbdf1d19306e69..646be0ddd1b0b81c6fe0a66c3a1851d531adbf4e 100644 GIT binary patch literal 430 zcmV;f0a5;mP)`tH+)}2Nx zrn?g@>4IeQ`8+)+-rx7n@9X=+%hT1}ZDMwA2I|uWefc;|qY35Sq9-@ko#QC(L1==w zhoXt#&Oqbt&O_tt&PLba|;spPJWriR-9O>wsknzC*)GzHz3XiB+_(G+ppqZ#jZK{L|rg=UP~ z5lyz+7fqhq9ZiNi0-B-jAZP};Px# literal 436 zcmV;l0ZaagP)s_sfhB8Yd++Xj&Et`EIDUEg-!FYkTZfv(!FH($%Q?RrDf6Mg8WBl?M(Ug+m;x}aZl(>{I7 zP2=={o0jQeH_g%~-6U@&w^!3N0y}cp|L@=K^XK_vb@%ib7&G?}IJj?Lmti-o(U0!y zhx^H4L-Z&&?9gM~FhWmo!va0c4Rw058@luyHx%iaZfMc--B6(yaYLS7$_-(9K{q7n zW!(^?7k5L3Uc(ImdL=h%)9blWm0s12di2_ERH6&GQG+hyMsd2B8)fN|ZWN>oyHScR z??w^2iW~WKEjKdhif-i4b=^p&tGkg#x8Ozs-H02pbUSWD(M`EApKi^KnRJ70%%R(K zW0KytolQ4@(8+hs-Bqzsx^Xwh==R;bNO$4pIo*q!Cv-<{4(Yz!Jks5{d7yiAlY~<@ e$pzhhN8STfDUva`@^D`O0000;!*Yjz7vGwP9sEvnzpL$epZ9rx@5B4OA7ccm*xZC% zj*She>Rkaql2B1W$;sq$k<}_qL1{Ml`7_eeaBu*P24iEAl$65E=fk~w=;;9fs}(sp z@Os5py(&T5+uMm@sJxtrsH}{XN@{D9psd)fIh{}_u&{6vSz3ZZf!$q^g+)IBH8te* zQgic};PdB1L`_YiDvR3J@-pP|FzxyE3kn4m7sb>TXJ#I~R9qY_=g}k5>Bwvr zxP*}HI2=ex!MAT0XRfa!B?aHV3s^*uSydJ4>$xVse2L0R0gLcAo0@`Jjs1PD`3DEM zc@vY9eAnS==Jz8n4Eer&wI1BmRv6C=n!}dR9DmW>(tP|HJ|Gi>~=5=wzdTHE5Paz2Y2qEzn@Dk2ead2WM*P;P^=cq z&=4{*xNMTcd$X~T?%t)65`hQ*9FHGUb~e3xcX8$g=384}7})L7G>m0!4Ge>yKci<| zbZb0)N(@79-bmB1Aa!-Ly-gNNw47+#Gc!=Bu(u~+zXI&-;l>S2Pe)0KYNpr2Vv$zq z1d9dv`SANAjYl@?>Vi%eWu{pCe&}@Q>WVZT!EApYsj0BpVx`4mvq7!KpFd#-BitG$ z6B!Jo*Gqix&!N|o!9XTc_|Y)7U%!H3;BdsYVJts>fMM|EOXx^Av(i$SOfh!~^7=K5 z#?Wwx*~kde)8Tesh7-%*zerEV@bJ0tSu>9ZS}pqeE>DZ4uMb)+Jf73Bvrj-v3#rv) zG{*Mehhj96T1_o2XM!h^J3CM)u)KWP4P#kZfn1KAonYY9d-K^dN=&52#>;M4kQXn= z?WWe&z}JA`{5+IOIGu6nR{*CIN+ss!*>C^N3JcNJ7B{CLt*vV!Z07*qoM6N<$f~iaLU;qFB literal 1028 zcmV+f1pE7mP)l000BaNkl#xkx;Vu?tDa z7S`jQ)>cKC6&8o-X{b~Yn)KrbcphKBD#@)_&SXMMOXR7xHr%+OB)2lT zSFfPcMLn2aFY@wWx64kiK+f$(Ru)D_W5tY(Au|&P2l94MaFtlCR8T-SZ^nu#EhU42 znwn&8A+IK^uOl@T%gga2S5}akinTQvo5;ONs;Vd}iyl1^75wlaEi6!9pX6O+6oii- zq19q{S8V*=9xh(QhYwQskuK-=L$Am4=h9a7^+B(P&nIb-bh&5GP*fy&6@cPm^z=wt zAyMw|2~~RPgbkgcnPJ?&4J^v zwI#J>0k*fHQek#hWVjT$@^Uma$#Dwi$rF^7iHsF3H#CIHmvML~(@DVN!Idi*9265P zPVVp!moDM;YeiZDZ{8p$M@*gK-mT5eboDBgmB~B@$GCNia&zhF)A*6`3*FiR$6;=c zLC*x{=fQE<+>9M1;wrg!k2sDVKW5Uk0QL2>y-hY-te7|@PE0_f!Ojk=mIc_^L0TF< zeToqhPtItB&BjnE1e*F z>*!#X=?%8I6q3!7+?RGMUI?i98#*prs{n9M;zp*fW8R4R9P57sF?w z$W>IpVo9u1FpZ5co5P1A$&HL4I~#6y!kq+u|3-E;hKG+0hsk+7(CIKRa6(!F0|U_M z;PC{Hg&l~F4$^ALY)2m_(-)&~zL zIhmT9Pq=FVYHP{urq0g4UjyQklTfSSbe??60yv#et1&rw^ess4`gL@5osLs5ot-Et zIr{iduD>7o`BH!MCIp`k`T6MY$6vYqePm?d-MdrP5_ta}>FLCg>B;WS(;IK*n9V+$R)2KftFxxX_ton6S^~M7Z{~cPJ$Kc+ bf7j(?B)Pmf%$0?JMlyK1`njxgN@xNAb#E|O literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^S|H591SGu{#_<3tUr!gukcv5PuN~xNP~dS2G_YP)y~oXt@rDhIEoRUb1|r9HKn7 z-*0(ibob-?ulqkRLA>&VpLgE?0Pop+3IG7ygoQ4KZqr1Ny0rw|a0t0dvrYy8><4Gpg63AM!!{U0C25P%WSj)yGuIo!*hm>L?6^YH{E(z_ z#%@3lUS$jek~6k>ff46DmEelOVI-#YDWTIcpl^T7Z2Mgpt1|kH#ddj%7?%kRk0y*N zqq|3N7zClNlNH34=`cXQ;GetRYcJ4a=*lkMH=ps+^WXTL>uQHUj7|n=qmfQ}?@ zgK+M+eHiOp)oY6nO2qJqaZQ^OjT_QL7p+vqMIeOMN48U&p)yO(!kAhTuPkC*#HrM4 zOT~~d5WsCN*@~crC^0}*B?O@*m53o{h?~mCga(E&lu_8uS;U__peBZ#0m2Mc9077h zm!G!@`Jz^&a>kM}uGhXwGaD;;a5=-mc*Uz^^;xOZ^|;wJGNWB3o?)olFeS!m5Y64% zgji&-k^-2WOmyQSP`U1_0j6;m>WImuvpTY>VNuU@uIGIgb+II0G^$AofcU@qcRYvHxR=rIJ~F4ufeOOL@~KvzACkcH3)gTl0To!5y7I3EC0IPO`b z9#()828Dsvv_{Sg6sGB>;4tR0)onP#@@Z%KTMWp(ChFbY3}CPLR{BH#P1lT z6aY-qG))r#D5Z$V`&!wy-RX3W$KzXXZ~f_XN~KZ&5Dte`Rjt)(&*8U{kH@1}EQ+Ey z7z|WZ4TVAgkj-W(rIb>}_(=Bq{l#L@>-Eazav%`6Uax{6>~_0EBC*+Q6h#@2$3Bvd z;|zzx^?I!+3eWS6Mq{;FvBpRwQms}U$MN4}y;IVU7t>;x7+PG^NLxP z#k!NpWUJNMZnwU#@`~m2d0CbxlS!da5Cj1LbY1^~&1N%><1|fU$N78?0ES__#VpIp z<#HUyNs@HAT-ar^*%U?bd_MbNwrw*&mSs)To(v+U)9F|&)^4}i_WoeqZWjPbrP6PJ zMUo@{;CX&D8ogro`#qD%#N%6ov1^7{n%s1O%1ojJ=hQ;7_YyXO+szLIgXzC2!|A#KY&J^>A%rlDpSIucFBXeluU9UY1A)NxdKE=+x7#HWiOpuC zs_J+==BIUCcQ_ob*K1W(1wm*u8mrZcnMNX!YPIUR?%Uhe>-AtTh%sI+m#ktK#&kNp z-EPkw4r$vqn~+QpFYR=W_rs zP1BFGZ9A9CA%tXEzFaP>*lac>Njjg;eA00o#wd!S>-rO;l%~_^SS;3Vx7j^^lih9? z07|9OPlidBWdINaVKf?X$ou`C$zn diff --git a/collects/teachpack/2htdp/scribblings/img/13b344ed2ff.png b/collects/teachpack/2htdp/scribblings/img/13b344ed2ff.png index c2a1ac2e4dce5bcedb6d632163a947dcaf89d6c3..1e8277f47b25adda4706d55a713b8d0d15f40ac3 100644 GIT binary patch literal 497 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 literal 822 zcmV-61Ihe}P)){9Ki8kpLShF8(0-sgpHYPuxU(uNhWHd7hD4KK!_2HMl>cwPyPd%c)`Sz|9~Ep zg8>r`CK^cy7f#A9keGnH%*bna(Y@FX8C~mP17wc11sCKU> zmIBd{Ycr$a*y1rwD^MTjCtV?nr`b~GQ*{_C&?V6t9cleCba!R;^!_0gDnCj2Z_=J- z3!;mCZAZE!TE{+hd>(wT%2(=TESjwXow#QW+@g2dfWq{d(eTi_r+mCdcc4c1_BtGSmsdgQ~C#7ZqT zlwnMh~OjsPIJQa2fC$4b)BWY2msDnXV$9%+|k!`z2S8F{=r4O#m9L<4S*w&n*# z$kO>3{=Xhg@v|ETj6p*Hz;e^L8QNl<2(t95+5y}cZB<>OAWN?cb|FH-?NJ*diMs1F zWa*{lrORLg>y_);^0*r5sz0 zLa&(3k@(idk>RErJFak!Q9LfCxB%JM!xp~j1pvnWEqp)ZJ@w|mVG4O$=x{HaH)Zf2 z4e&NI>acnDUy(5_<>vi&atj&d!JI+?Gnk5nV&TH44O_Dhf@MiywyPE6Mr|vdZ*M2tRb|7M*h%u}w~^CJ*wBZH@_pUXO@geCxSV?>Vt literal 159 zcmeAS@N?(olHy`uVBq!ia0vp^T0m^a!2~2PJ(Ft$QfZzpjv*Cu-rhXO*(v1kNnTM?>T?6op{1u%^!dB70^ZoPgg&ebxsLQ E02{DF;{X5v diff --git a/collects/teachpack/2htdp/scribblings/img/1532990d5cb.png b/collects/teachpack/2htdp/scribblings/img/1532990d5cb.png index 84f6cd5fc69c134c9d8685709d5c2974e5e84463..2cbd994d51ea7ad0a0056472bc1ed67206ba2e93 100644 GIT binary patch literal 2265 zcmV;~2qyQ5P) zT~Ji#8GxVVM~y_0pYDQ)&>$ddB8ZA3PKbZwwALzM9ot$n#?NO!8OHGf zXCHiczwg_#e=hCqxAFVYH2i*mkr75l7#(G7jKM*Mh8P?i|I331^!L->&%gk8?f}Hb z5+Bc;ImE}4m`Hp)9uICeNl7Fplahkljmw3DVO*M~>HMcdL-h60*GEqey}jJILsu7_ zopg24-A!8?H*a$HE~%-crjnjcdO8^yWM-0?NkT$Ue+uhkpwmN(|qy?t*w-n^76|R7D_t_VERrIw6$^gFdu)+=qP*k zuzRc?q$IOX`yhS;EG>Rz`=twHIbCWs#WaVNprKbQ^--U zQ-H)o%F1YN#_Oe^fY)EAuTR=3geco7z_ZWt=9^r(!q^xK7jpEdv{0x}aDRFnRaLz5 z3OPCK-%nhev`vsve4ZX=`EshONlRndGHPn1ZGw!2=4pas$Jn!n0|(f$MOr0jL`e&T zfRYl@(%7^KO{2J2+9o(yah?Kv^%eQ~R8_HTnY2m}u+aWAi6u+8aDl=?E?<^b2?Eyb z1gu=ikt39r(%mhsVifDHdlS6-E*CFy>Xh2g0MHB|?LH-<;Rmmfja}9~APXvBzR;~Z>)urP27nA<3!T`g6L1-pN;~MoUY&f9FYTZYdv&@2^Q0a0 zVXsadkRX=Fa0! zQzaj2ocmAaXE{_!JLtwnoz}wV(hj<@%l;GvJ@8|>`?=2kG$ocoi?SCZuurF-!)a*; zBiN^-LdcIostX$ON?f8Fyy10=(+sD`ud zJ%wMx3F%12v3{rDz#(Y|<5;{?Hn`!8w1#mk-f1@+k$Vkc5V7((A_{ImkvSe4bj}fv zWfOd3j!4F_a;I0}fV4xfu^xnCU&1A6jR~B2 zdIUd#yJm`H9BX!Z4faVp1Q!dgd-LGmW;#IxaMr!a{0_=Z7RfkPo2O{F4r|~)(k7E| z=IQ?^fkyL1GLF?cS?>f9z*6hpLO28SVMN;G`#9^~cf1B4nKF`btTRtDp$+n&P1@v< zIP)~lui(5{BN@j!oveC-2w;&;%U}-tQ(7Z*SftZ$;m^_zA;k*kh?#H$o`-g6lPBPu zBiII&=8j|>D|E8b^B^9F^6Op}oP~KXDsA#)?7r^33V$(uB;%+(PcFC)>*0#5#}u&j zJgtRJ6(Si&?M^%3u(U&XP4TR@T%LXqw2aB0iBSm z&SeOju6rxthB}dqqiQGB-(Tg2qH3p~!bxd|aH8b?6c7J}1f?z)*>Qg=f(uGTGLDj+ zR>Qxf9m0%~os@p3SAD3rKSjWONQQgizik89Zhy*w>#9XEj(VNceNTTQsMkr|&&V)> zdYv-t@xb6D)a&Gd+tLo zQx_ylJA@zgI^A+QDZvd$k#-0_>UFAy719pjN4-v$VX3r3_))J@3jkTd7U4#{PQY>4 zD(w(vl)61gx|wQ z5G`#I9t=G%Oc+gL<3u9Enonbi}G@oF6EhL*t=KSCbXzLPXQVlShR?X z7g=HD%So#4Pv7D7^2HZy-b`Jcv`Pq3zY|bY#D^cUVFT6G(kh|C5}knJ;_+0+j!CP8 z1oii)hpDMy>sCric<()?O_R0>CRUlJ0C{;_x1AIOj8pz0?tc>n%X(#GIbdU`l`kp26Kj%MdhcI+TERoZE)*s0S5m6ep2 z^XaFgr?YJv8#l6Ok+joOuw|zJem`f(U zEnK@sTN`a{%$dX7xum9&n26hr$AjBVTpS4rBqR_U%k0_An4$Y-ole0()9C7=y`A=U zIy>p=qO+5pp7F1{cj@ir-aY(&;^LS&lb9G{Vwg3H>C>4$of$L6|BQ?zDvIdn@#%EA zaJh(x;GK6=e%#$WxLkNVcswjw@}zGY9_HRX?%$`spZ8)Iw?O+(Z0`+@%fp$$g8=UY?*00000NkvXXu0mjfG8kf9 literal 2316 zcmV+n3G?=eP) zTToQz9l(FPu!0cobQdoO2?DYvqNq6Hgm__`)>#@YM>aXK`4qMAfTwra6f%mLM-)y=j`r(zjMxS9Q6Tb zfAI7FecztFIW$e9q5`KAhXbdRs3@FHTrQ%cnKA{Ji^FiH|2fo`eJv z6N!nzCR{|1{W(00rZGASFf_!_5W~ZajL_fDzySUIV}E(@0KXre0uLlO`?WMPu?rwT|xO0cjPC7d1 z?4+xU)>dxb3 zo{UulBbRCdBO}z+QC*GC$Ej1?zD;Q#95qt~ zNKdDtf~F?CUW$u(^G$ktrJX{E%Bcc8_Z)A(&6O*Rj4)>ohYm>#g$gzIs>e}X&1R}cy=F%myvRJf;ni^@FAY-nn8t3p~cJ5^FUe>RdRtXx>PyZ4X z*|?FcEY_|?)7Y><+9o)dbgBY;`z=L9R9CZTk+ez>FxOr+fdvaVcaD-0E?$&Y2?C~0 z1uR|4!Gn~S)72%dViZ#^faARP9_P<<{J7dr9ng#+tv@MTa0S*$YZ&}d8=WeLBL7cc zhW(Ha{c;Wlf7E8*tA5}#)WJ4s4I@}(s(|J2XD9%vRokAb$?_HSLYcINZY-1vI1&Me z3*A^~0R-}(3T6r2y1f8C1K$IXBW$4)Yo!7%!a`{WeONA)4~nE6^kKPFH(;i;gFY;m zsvR<<9rR(jRBhmvcF>3AQUOuY0{XCADh*V+C-@LnOf@R)pbyKXaznSYgFY;mDiwO9 z9rR(jR6l_ZX$O5+E>%7#`l1obrJ4;_r5*HPxm0;STwhlXYdv0-2)7_X=)7(}UiAzV zL5+RCN(mN2wX}n7td(jdd?oFm8w>4K(a;Ug%iRUG_o~UV5So>}RDq>Z{Q^!%I~c)2 zseTT}r5%i5mAz^@)PhI!q;Bt3lj4`~4`uIB1+Y-6zezh7#1adj2kK!O42o*l3*giF z4IGv3WE@MR`Yr62b})|lQ{{sjPD*PS$NZ^wz(KiJDh3ggA1k8a29!p|!-@8>;z_K9 z?<1p=aZH}-b=WKI5G>5R08WR?FcbQuO#;{p;A7bipGHh4uEMY2g0#js_EbHZ zpTgZp>SP?#rg{T*OFIM?b1r~0;a`z-pa@_ufREt!P#IyJjAO#7a=~?20sodZnSec2 z6WIt2k=MyMCQN0%14RI{Er4_2B+P;#X_NoQUI71xH{j!l>|`8MO;sGU!hC3zHhCoW zRQ<@W;Y_4jx z7b&c}04{|a>U1)W!l_h$cb8{H;Z#3^W6}=cMAf}275)QhN?lK~=w4L{=alMX992^- zhkr^tgc(&+Dg7?A`cQJOa>9L>2KT~$+Xk@WUR40sRqJFNB~z*U2?Rz^GL^cY>tO^X zQ{`CWvBU`|naTsVr5(bLlBv}FWH%$In#!IkHBj_}eGQ^ys!>I~jiKbXtn}NZ>qf~` zoiI(>A^a$r>Xw~K6>h)`X@~HmWU5QBMA{+zD4FUaER=Q#KT4)*1|Uz^BHSpM3OE9r zq#eSHs;T}C8>Ah=jH;=sAPJUBYlIV3Q)%!g_@lH&I8ikfupeH8m!&nrhQg`(;ScaJ zxTH85I&En8@4AS#Odd_MSq2M?r$jAGtYKvEJPeu&RUeLXojR8-K_CGDgi zQ>O}$lS5@CXV22!PHrySw=24bnRl;xB;DQY+sB?gxLj=8#@4N5W=cCv7K^1C=j>T3 zEBX9$va{K|nKf&eJ6GE2DOfdCfYDJ-p5*9Jjvd44WaUcA%2>53GEa=wPW3Pi4OCT8 zRmJJkq^0r7D-;(~T+B-^5fu?HJ+V_gip!TdbB1re!RO=pbqWe7EM)$C3JUOg$;c3q zvQs?`zn|J#YHO*hu)=m{9G>y(q+S+Jq zqoae)PC7d1?jHMf_bxp>+`Gr`iN8@sh&8WkH z!-3PuyYDLgfPLiPaNzOa@vvaQlfGaezn{K7`uZ3cpueAi0fvSc9AtQy mp&>>_7#Ts+&@@Izf&T(L=S;ehfCmr&0000VzfNWS_T2wf#Xx@A=9_QSm)@4Y bd5QODBDeQ>gNZ+ZMlyK1`njxgN@xNADP=H( literal 135 zcmeAS@N?(olHy`uVBq!ia0vp^S|H591SGu{#_<3tKTj9Okcv5PZye-gP~dUC=yIq2 z>5gVcmcKi^{cnZeW5&t;ucLK6T5BQ-z( diff --git a/collects/teachpack/2htdp/scribblings/img/157ab5efca7.png b/collects/teachpack/2htdp/scribblings/img/157ab5efca7.png index 3290717ca750f83814574180aefe3197910cf447..8cae7a8f42b5b25dd692e03329f640450b8a8880 100644 GIT binary patch literal 128 zcmeAS@N?(olHy`uVBq!ia0vp^njp-<1SHj&rY{6i?w&4=Ar*7p-Z;qF;2`4csQm4I z(Hh5Mq33rGAF$V*E$2M<+H)hhVzfNWS_T2wf#Xx@A=9_QSm)@4Y bd5QODBDeQ>gNZ+ZMlyK1`njxgN@xNADP=H( literal 135 zcmeAS@N?(olHy`uVBq!ia0vp^S|H591SGu{#_<3tKTj9Okcv5PZye-gP~dUC=yIq2 z>5gVcmcKi^{cnZeW5&t;ucLK6T5BQ-z( diff --git a/collects/teachpack/2htdp/scribblings/img/164b8da7bf6.png b/collects/teachpack/2htdp/scribblings/img/164b8da7bf6.png index 73e3167594cd666b7aa9e7824cdcdbd2fef6cf78..3f5e957375f4d532cb3c083a45b5b40f6ff23daf 100644 GIT binary patch literal 1797 zcmV+g2m1JlP)2 z?Q0ZA7@wJ)-MhW_)7;f)B<8ATNR>oXln4P4#7JqV_Jaz7Xg{=+(*6hj4aE=b2lb1f z2-T7zMgjLfj0phtnnOEV7yp&o+Zhu8j5Ui5VejW_7atLtn^82%k^^9@ zIl6b-#|J%o_ORptSZc=MKxo$zcdyjZf!MA$*lCXL-3ElE+zEoGvy&MOz)Z8aDirG6 zvfNo|#|{*Uuweq2X^tK0dOt;d42OyezK53s^m_d#PB=S(IgsBL zWKaC)zMAIY+JKPvzyZ8rL%Fw?Rx0(|t5ZFT}I2Z6D)d$+W6r}p@<+TTxdx!QVLX@tB|pnYR#XX^)9 zOU@7kY5R6*`*w3`N*f;5M@FcsTIsi}W(c9wxLV%SXrK70rYspwl=A~U1)B0hj3k}yqGOKe6}$BoK!R` z?JZqBs;b)1kTx`gqEXMDJyJ&p$6b8yVUoh&Nbb&%o|&(yUu`3nf4xj!y{Eq}*tTH*LXmvF zbm@|~d9!@*APj|U+p!KKzmU0dZ{g`gop$OSocidfF*W7u>A|h7pKe_TN>3){F5Na2 zOOe*fa3E}^l}hRI<;sm4z@`1zCdvG9KXv}PBZ7g0d*al=L34K2ckGz6^%qiBQ)jO! zlPL#nI=MVDrl(8i&r@6LyCq@HmuAjfaaJ&JJnw0y(+lU$k!-epQ+hf-^ULqrKdu(uE6kUTt%}H2Z6>o^x!-EQTvf|2MMj=IcmV{rfk!1OxZ#Rc1O}zIf5j zliVb!v)9}h((mA6ipQ9quH3p+Yp=|o{f3vc=pVC`_hw%{JmlK_*CI~ zDzDtzOAD4_V)l}<;FiHN- zV`ek}OU|w*sj3D;+(|a8RXDsI zS_LP~nT)PDwk@<)@X>5$GFpklEL8=k0&=lv6u4FGIcYAJ%@Vi!na_4Us%cc?_N@+1 nTNq7~8XP{PRRy0fgz&|`QnGW>Eqh^b00000NkvXXu0mjftypwC literal 1787 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 literal 3767 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 diff --git a/collects/teachpack/2htdp/scribblings/img/169f2ceb45c.png b/collects/teachpack/2htdp/scribblings/img/169f2ceb45c.png index 89fdbfc52ef821d35d655f8f4fff547361f2818d..d4b7ede7b840c996605040c1ead9c63149c814fe 100644 GIT binary patch literal 1058 zcmV+-1l{|IP)W@pMu*C{cZH8QFTAyM{VoFtA)0_qDIlZg*|^GV%< zG0_+j(?OA?SY-3L503nR;CLD0oeqh+Q0wBt)Uwm{#0rM zyJoXPt==oESTf1R;|#Jjno63smm+21frfzrcRrs&wpOb@cP_p)bYkMuJ9n;Px4V1J zWNMUE%y>iVM;DGNJcmUcCiKsvnvfT(E70?&sl)n^-{$+ZfRhkB^nK2CYwzLgX6*AcqDTB)TyrkfN}+dLK9c6ypu?u{&attNu>h4y)80PV*T?nr_-MKT$Bd4Cl+AL=XjodB#J0`$mLOyVAtQ?U zg9lp?DT+cM@QbXRq0q0`uB~mh+1{q8N}4`$;zS?jGZ`)%z5yg>i6qrlYr9mhQ_1A& zLu4+OM2Qf*-e$?3&|H;?OeS6&Utj+!wk?(x2#G@B!J)UdHeXZovV;b;y5jWdAGh*D zL$4R#(+Cj4a`tOFEj`(iAP5yfkfJF3Q-UliM?eViD-TIh;PKB^wR*4F+{m)C$UT1i zlj5Hn0~IS16s0qn?5nGPB9~!Cj~)8}*`d$`)&>ALaKHr=*$*`}FJb%o^$U^6ZHlVI z9{_;gKOBoOkDN0Y91jG320% z*VVbRSuPf1mY09Oe?QaFF=8}6SANc;N4w|ef7sj%0|4^*^rcH}BuNRvzxOnR(B(Rh zYy~tJ40WBIlNT>G$KxTygu}jY*jF3_p}ae;s_Kx(Gv)O*bKEjw{wsiJYx}OT@m=I9 z^Sq?j*LHSJIi1~m_82fp5UPFqo@r?4ID7Uti^VNBr@>I~@k}`!U0SUklMoUX%gHlm ze!>C(08r`wHAJ3|@cf!qYtZSQE}uE^ c*a;f`29#8p@zpSjy8r+H07*qoM6N<$f;}e&MF0Q* literal 1061 zcmV+=1ls$FP)w3@QgbxO=;jg0C-NR&MoCyAqyfck>QWa7i#d{Xyd zOf-hXbdV_-4_h=52xJCiix9Dqts5z~6kn$7Sioy9}3pxewp( zJHPyX=gU2RdJ7AM0{H)fc-RwA24x$&31u6*2`bE1R;CLD0day*?ce|W*6fW9e>%N^ zL$leTR_~S7FO>=>5)9%RO(jj+w-aUIu8n~KH_xXL*J|}=&Lp;GPfUD#>(*r)c6ZO2 zOpUVo`TZA1M&3ufy879!u3xtkW#JK7RAn3YMJBTWfT(E60>?!}F)ul$l2msFj$8Bj zz72TI-`#Odp5L6D{Dfh~VzGsMo+AiSudk))2AAtBO&`K( z(l$hqXP8l`iLP(gk7btz23lgV09JCjR4_Om430;mH&2}S0stu2Lnt(H>C#)tWVmQz zLOi}0k1sAPTyARWZE5-Jem3%XZgB9G()%S6i(c({b8q|@ue!>^~)G09O;6s}(V+-Q8-ZubDC_Qve&SJ;EY(bd!QhueLwxA#w@ z(Tc>mx&Bn@wyc_CV;^D)a+J;(Paq{H% zTlJx#SBr0P1PEa%+c%SuUgeS?2o*t)qA2{+f-GuBKnU^29!XL_kpow)-fK2DhQqTc zJbLt_;`fe$`jrTZ(wR*5)z#ln$S|Wvj=YC>C^UiX0RRphZ~>+EMorBNm|wegE*iZ_ zQI+@s0QmjG@i?>Nn!(_BAn+pqVlufrJ^d-xD=HqVs(K12b^SS=?_9q=gjTa4ojaFf<8fwr`IkF)vK<{GM&mQ3*F1c#wTnNsnjB>uqM)Wu*Mu1JTy@O=IKR zC{*k>m0n-l**WEOcJJ9^z#>7Y_U(J3p`qjS>7OkYx7?ZrL%qi{<#2RqwR$WGT9Q diff --git a/collects/teachpack/2htdp/scribblings/img/16a631adf1e.png b/collects/teachpack/2htdp/scribblings/img/16a631adf1e.png index 5bbe9d16d49de04f50c8c6886790c477d90d3edf..ef51f68169e9a6d8d284c41386bd5a00953cd3f5 100644 GIT binary patch literal 106 zcmeAS@N?(olHy`uVBq!ia0vp^qCl+4!2~2j&wdpLQih%`jv*Cu-dFSZ?A3SWia4jI;j5X zpY~+gM|xFNep8m{?&g`W=X>??b)(dLK0fhI6`y85}Sb4q9e E098#QNdN!< diff --git a/collects/teachpack/2htdp/scribblings/img/196bfa7b9c4.png b/collects/teachpack/2htdp/scribblings/img/196bfa7b9c4.png index e77dceabaf834278798788a89277908ed3a67058..2a646850aaaa475db8884e7fb954de43a482adb9 100644 GIT binary patch literal 600 zcmV-e0;m0nP)lo`8n8pn;YLz!$Ir5)&#H3KJU=D+@Oi zS^&r5qTmm*t2=W&xd~MJWo8pDb7zMn66fXy-7b1P+}+{v5dil0adLw5bA%y+Ao-I3 z08Eg@f}IXaB?3QHsl-l)i$#)0lH_)KG-42JQP(R7I2vVPx7+mn6tI-vkA^XHO=!-t?!pKAEg+Bi*dk z!hD{x1E$Y>j#leS4=on0FIuWt{J7^)mSl0Ot1ADJ&6G)xN)1umv>_4+^%Rs`k^9f-R_depavr zH7_p;wxC8qev8@NRZx8&0E~P%jx5;h?J3xTnu7xcTToT|=t#jnJ_Z1DcBWvTp6c04 zRP#TR=b>D7y6AElo(ITp>cxdqd&Mc94K&Y0%RY8_>1e}0K#FJJe{l9E+3#DoH_kk$ zIP0PAjEiKgX2q`6KEvPGam+#?V>szdlZvxkiP{WXqBgsisNGpe)b45|QIz_QDvGwl miELWCo79L~%UN$7=V`i7?`v|4Dl@$!QAcK|p&#nlyVZxMzF z0>kAPFJ?0~o6P44Y|DI}%_e8Fn5!}t-|sUBcEIZy1nl<{;u{V6zJV?2`)oA!=Brg> zcs;AtJ@`sxFI%!w`4eBOC16X|YKDBbOV3M;_dIsHvH8)6=jVyplG!Xrqj-F&l&~#X zD#hS?J-V(H-gVjQ?c$3?E4E~@xRr0WE!vWu&SpLgt@B~HfgcWSed_;w1BSyD?<|kL zdL7fL>G5kE(<$op{~frwob|0s=5oJ^A4MtIlFQ?GUi^m#>t$b$R%`w+=N}(aRP_IGHSpKNw&Hs)9Q{V+X0RG}a zfxo<5@HaOK{PndeKS%ZdY`HE9g;cj*D8O}r<&W;&U8?+w)4gUWU$Ryw-u-<_mHz?h zUa$|Qy+E?lvCeO6u28qNMD@lR$#U5WUoQWqHZ)bU*@SI_rYdz?$`YClbqURJf`sNU zMM86wBoRf%gS04$vv53~*2aiOG@RikJ47|+lZ|h9;j0udx2aJ800008ESb>I`+9{F(5-^r6NsY^QzArINQ*a#Wx?YyW&jZ@F z-S^$ctAK6W)^+Xs9{Z_2&pgjf({x?uKz_$3IZthkW*QLne8OA(K4xLZ*5sg%o&bgp_&ZA!Q!LA;lhLA#*$m zLS}l|Au~O4L*{#Ag)H)rhb;A^Axk}kAr(9%A$2^GL#la+A=Nz6LTY*>gjDu;3aRhK zL+X1(Lz;NphqUsz32EqEhBWlJ3Tf-{7t-A09MZ!(hV<|_gmm(NVHiRPFIN-ZAnoU9 Tc&cFPRXvKt@L`lc7<|WN6e!GA`;H85FfbMntWU5mD=; zdsG$a8&yj>M%9w|MKzE(MYWN5L^YHBQOzXXQCmp*qBfFrL~SRVqqdW@M(rYLirPzJ zkLo~LqdJfnqxz6oqPmf&qk59csGcOcsLmvcsQx6is3GKg)DV)_s8J-(Q3FXHqQ;WN zsIerasNp1kQ8P&HQIp7P)FhHi)I1WH=UGICO!C|pBwftJsc52N00000NkvXXu0mjf Do_>Tn diff --git a/collects/teachpack/2htdp/scribblings/img/1aaa434b462.png b/collects/teachpack/2htdp/scribblings/img/1aaa434b462.png index 77e7adbefe182e7df6145cd489fe302813ea5aa0..9e3acbc688770b62c73797c41adef63f85e1275d 100644 GIT binary patch literal 810 zcmV+_1J(SAP)^bvXpIg~(Mol77Gw{=P)s4Yiw z)PqX#DKon}Gm2RK=fRo}InM5^)Or8u1NfBB7azNI_fSJxvma^Aexx<~k=E=-0!mTw z{m)~PKCQB{D5V>+NGIrY$8m2m2u=?u^|<-*%kS;=y>nxNDT{Kq+-#PcXg2JfjnI1J zyItI_UpRO_+w1${c8!)H=6vzM)Q?i~Zz)=X-RB<}Q!`2_mK(GN``v!xX+0x-%N6YYaSbTmIP6iw;$tIi(;`1X) zC21WN&&L3eC-}dCf7hOmDV1ol%az1Msq5`{J|^DnJV~?574c)Ai4Yi!_86LMIWU;+ zt900+V6fOrO0%WGV7GskV=I8cdS)QO)&YadoP?LH1_sC35Eok$4DRzVceXMZSZ07O zY<)0r%{}edwSa-R-ll}UCjVbk3m6#9V8uqm4hHs_KK)Bhi3AuV&M~;yLSPU&yK!gB zfkE!P%7rZo2GKJ*JGL|!q|YTy*$QCr^DI`@OkZhL;hLpAA3?JzxQYT>%4`R&BFz>t zyMU{RviZ&K;3{%#W-}MKiV&OAY_uO%J{8#y+g{Rc06^b(GOks4?z0_O{|u}OgV|-o zQw!VG>^{@dXFHj>hIqv6u~~W$ufR4l>zq7DvklCe zM=hdks#*VRNsdigZyW8F@+4*4TG1~Go@BLJ+_`N z9`YOa=k&ie=Ea06`2uekG4FnDnVM0`?kCc?jQgJrw7E3YeX9NyUdW*>_=L& oA8E~gq&54IPFcRh<)mo-0t5Z`*$v9xoB#j-07*qoM6N<$g3sKEGXMYp literal 816 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 literal 1759 zcmV<51|a!~P)Uw%=IG#@7dHDDcEwdSZ|Nc9zt-va& zjnwK40j03o1ZODJHT2YQtWIK&kGQ=hx?M6Ek44L50@oFh`tlN`lGuB2!2PCHL%U7# znl{0$6>20s)kVI(;JSEwBQ#h#0d)~XxTxwJs^6%2EuTlH!#&Ay;)JTFr@F}VGdz!| zRDQ-;fw{e`77^2_D{XMz5 z?1un?0R29h3^#%*RMlOYO`M;T5@{3MN~l&ChRpq$(h%Vg%thoUy2Q|CG3F)3A}%jc zF2|j-<9^>YQ=vH+R)oHeYDpck-DxXpbKYobK)ofuekCxGBkj>GE za2tMJzJJSPcC4&Oq9*&$rrl2%kYhlS|Yh?`ExFZy*;rhmr6sA zom?srH`= z;hXfy%rGjf6bk&gL4~HxP@nQm6pMU?XB)_!%9S(^E22@;WTsChp|lDZGp(_(!eX=* zYv{pPpUq}EFO92JGOa~klzs|I7k09%E9y^*=+8pWibYa#|S1XcX0ssI2>lAw0000B{NklX`8Yo3dX_lDqb5{G>W3q=_Rk%4gd(!z-9{|pD=8EX(=iYR0@Tvyn(eu5Ezb6bGhYG>Gsvb z!bJywXw;9QIuzCUd?Rb+`un?3RA;lD-%vXMOilfXqB^trWZvP%Kwk=NftFg#O*c>z z6TNP?#pfFl3Y9fAZT0o<35CiHRm9^VtMx~ZXBfjAB9T%q*Xneim6z9*43s2;{rz1| z=RnpOAOH2{&C^GY{9ar8PJtyJ&)GFW~_P)Pvbyf~XpWAH_iBw0A{>5Uw0ssod zE`?$jMWt-E3pU&NLO}1{{WccE)#~=chp%Q9j6|}nz5TmHB5Jc;xPJY3clT%}xneP~ zSUe6#koTd{a+jUe`U3#y^`B=bv)Z}yBLH~(c#tIVbwTgnzX$+2-N_shjm8K7b8}+^ z;m07xdur%%l*vlNrbO(w}eV6wWpz3&CUjV?JJKu!EuB;gjyM~5-0)V!*ud;;2pGhjC( z?%kgl3?@3Am33$oMQw%^0OIkG*ZW|8-pS`zR9CkM1XV?pEG#_p`9>m<=Lpgumuom2 rQBI%)p#P6vn)~P$XsNXYT5A0Zi;axwj)&K&00000NkvXXu0mjfOr{CL literal 1078 zcmV-61j+k}P)6>KDoK)o^xrLOa?ZInAs+sUhsPD0DvHMY_=e8DTa+MEJOu@a-mSQsySjY496$A z+)}A@`_gXVqGy|E)Q_S%6xI2BL(7%+_I9AC&SpEmstEvKV&V@J)tSvF^LAIwx+%29 zx-nuFBP266*6ns%e7+%}P+3*gQd@gaC{(U0f+Ry$>yIAKAci?aBBfle)#*MfEv+dg zD?tQ%dpn%YzML~U`s=M*r;i-@y}J6H0z*8Wzj}JwL!l`EU@+J?J~=gY$8P`mz=7`@ z8;>u`8jA(y=RJ87Q>lfe=Cy0@x!o4ITw^ep%F7#Yd~$gBiq&fB>M|IO=IZLVR|F*p zysOI)kK^_A?fdtCEtPH$2A|sPmo1jF{r#UR6xxakU4GW??)O(r&&lEFal0)dk?QEt zKUu6-06?MGrBLk3WKuTU1)J@BA*}cAeH)MCYIW=3!&kHGM2xv>m{6%?c~}cqEaoSO5CE9Xr_j28S}lU~okuC650ci9F9bYiFg=7}=Y>dryl*`M*#I@ z1g~bDwX^bgQXWqdj|WRikcNhj*A^m?Yy*H;Y&MaYr@ZtY&pl! z0N`}?Q~a5kp>yZNCR0^9o#!*RSS2NLK3@s|V`INjhNh?Q1AtguBNSE?fpy=$GXUUn z-SPWJawbWJZ{9pX5TV-Icj9}&z=)@`(+G!jG}Mt*wJ2A_Bw_+ z#>cNmA}^H6X05g(SGnFj_Ryg#GTEEAZ=V?)y!dY-liS>UO0WNt%@!7tz+iBW9kccI zbv}A@b@AbN_wG*&1{0mm$~m;6{KJrB$m@MLJL}~0%PK3I1cHh+gv`x7_xXk*krxP3 wCzoqD91*3UIIRDVHq-fai*;kP#kw*22f_J_?Q8)!(f|Me07*qoM6N<$f@<;y!~g&Q diff --git a/collects/teachpack/2htdp/scribblings/img/1f0b671ed7b.png b/collects/teachpack/2htdp/scribblings/img/1f0b671ed7b.png index 14f280af243126b8cc0b59fb3afd2fd0c2aeccdc..2d310ea3324e2f064318a99a0752e0fbeac20e68 100644 GIT binary patch literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^nm{bd!2~2jb_J9JDRWO3$B>FS$q6YbDH0q9I5z(H z|Nno=>*X%`!j)DlncUvWZLPlYE^xOyjN!?|d?SvTA%cg^s52**5oiR1r>mdKI;Vst E0P9a9)&Kwi literal 119 zcmeAS@N?(olHy`uVBq!ia0vp^T0ktu!2~2NC1>6OQg)s$jv*Cu-d@|t%b>u+>?pVK z|EXmO%?w_j->uyo)T*-B(6d2IDk9zSC))wv@@uo!E9pbPf9t*b@3AfB7Sfu}umNNe NgQu&X%Q~loCIFDFC2{}& diff --git a/collects/teachpack/2htdp/scribblings/img/1f5944ec1ed.png b/collects/teachpack/2htdp/scribblings/img/1f5944ec1ed.png index 2b513da2346f3701335c8d773041afc4bb7b632c..8c49da86a29a5d1a81fdfb08173f50b90d2640b6 100644 GIT binary patch literal 262 zcmV+h0r~!kP)-`1`|}LEDaHt{$MtqUo%fex z7!t1!I{?)C6R)-#>OG5j_kT>fvoYgdirw!*?0c7E$GaMP-ICbl7RL6sJT|_YV#~WV zHoFzE&8>?KZgt#y_rzUyXRN>bW94lUYi_H!`8JH(ZrixwHjkyZM=ZLX;`;3uS8mt1 zbbH5(HzCg7oH%pS;`z;te{OR8z4`I`9uflxqhbJIR19EBDe>2rCvtl8OM3>IdO22j@5<(!W z@5l3XyPwDFh78a4{&Er#Hb2|juZAZSw_TnpT z7rx%c^G!CGZ?%!U!iMoW8^fz@0B^CaywNuCc3aOwY$cDfH9XL6=CO7g54Rh554)Ck zva5JMyUe@V1>W1v@dSI7=h$hUW+!;2z2wRE56`#1d>4D-d)X7;%NCKL?^gT(P6YN( Tt*&|i00000NkvXXu0mjf6y$qC diff --git a/collects/teachpack/2htdp/scribblings/img/201c231dce2.png b/collects/teachpack/2htdp/scribblings/img/201c231dce2.png index f641cfdd40d9da87e3451e3251e2b0b0fe34e30a..582f004f71774cafa32f8e1b63841eb4ec0c10da 100644 GIT binary patch literal 745 zcmVY)GIUeWVtzxLmh(er*{0txi@=qVLy%Vz0>`+KWjc#9SlM)} zM(aMSJn!LqP*cx$s3b|?GJ+uReSf)Ju2!os40pR708}cKTCK)$-1GBuye{=#Yi zK;^nOo6T%Co6qO#^*Xm4%d(9|Ls67!wfZY}6h*deyRI9@ac-eQ5JHk9sj5oT^et}B z^Gws+Znsxi4`CQa*L6`8uW%W3~-EkZnhOt;I3K3%jLFjh7 z2%*gQ(Q%R_g^K}Tu~-;}ae9G|+?Hh(E>889Wu0|$a8{t?GLbltjZQDogFbrMSEnAFnU3atD?A?yzT>Iv_nK+JTv)SG~pU>|j z#-utF1i>XAi2_-#*Fg{f0PXvJ?(DHY9(kjWe;)wQdTRB>ey`rUF#QqV_j#VD48zDg zb{XFOz75@BW^f=4UjMx2rsohvvD4|$tJR7yY3z?rO9Q~r9k#hP{&6lPoIRG(VHgtJ zBX4v=gj0eWOKH6HIS0Or*G9Q1mS(?e_XJfc6++y4Y7ruGN+^q^s8*{HCiTTWAtI-Q zvRH~Zjw4L!)q4YJa5_Ga2EBTZoD#}nDK(u=CzAS$ zmzNiw=Mm5IEX&?g%(5(QUl0H^8jX9pQyl^TMNv){uqA;IQWRzHu2!p(B;Cg?NmAOX zeV?wXstm)FEoK--Rn_$H+fCE7uIpvHbzMK~4)?cN6h&E<%M;78oaqaX{$iS@34&0D zSP%qF(=vlcZi=G1-EQG}+zXzzqW@D5obs67KjmS29w}iMI*xPIUXLux6m~M1n00000NkvXXu0mjfEJ$9) literal 772 zcmV+f1N;1mP)~@$s=(ERrPo{QLxfTCLV-G$cv7y}fNV zo3bpQo{&4G_p8-vI-SmDv*mJmG*}eHR;y(gM!jDDEj~?C&+~#H$g=Ecu1z6?G)*&2 zljm74n1v6+&~cpgdR+*-DM1iy+g4Sz7#?Hnx~}j0XM;DT>$+uG9LJr6&$4VXnat<& zQrJX_qIA1mgb>wE-(!qRX9K`|KA%h`yIrO6uIrZ0&Y!?_T^2qJ!?MPEuYBJR!*D-7 zO;g8ls$&y5j+3V89=zvyznNnvYQ0{2o=4-8Bng6`YBo_21gq6*3-9}W(eK*X%Cc-a zoo?Z0v)N_X6b=DE9LJ}uB_(RPT*h$>WWkN1=;#l|(RdV&-u}G-K>McMSNpwY??iX6 zq9~GOnZp>ryu47;kX3^=F5?{#C=UQhk}&Y2aCC-6Tn3&%c>o}Lrb8klTGTq~5-7doTv!MIYPA|8qJ7h5 zSZtS(mOv2zG#U*?Twm=oEVj!?OP~kU-p@Pp&r_;H+yW=p%aU4HCKeMAt*TchuEXxQ0WLXwP@sey&6iG4kJ@Hzt)+O;d z?i+6y#_le-A|Zqf!`Q;t>vc`jE`!%JEieCmdTg4eAP7~n1wk-PGr#@8^E_|ccGY;> zwl|B;t?^b>RoC_E*t)J$X0ssI2$WJQ|000BFNklOmg1h^5*$`zA=08-go8w&OP@t=iKAH!=Y&!%2zxdzrDSc z$z&Rhh8fn>)TmUd@)n{$rJbD}05F+M`NOfXv2xepej@cR6z6lre|&t5$Kw)-q`A2n z03IG5Q1R7j^}oP>mA(N$Yip}qF2B0ELcbLXMI;ho4~s^lp-@Px)sBviGDDqCXEvKX z9?#9qjaI9jo0}_$a=YEJSWK_iqbL9Xnx+>P7MxBe>IIw4w!FOjH?6m~w+8@Xu{fPh z=Z9o6nd<6l05~`}V9c-Y{A4mI6bb==Ac*{slamtwkV>Wbuf+ubyWPIJx{8Wnx7#;1 zHUMCAa}&pLilUg(C6h@U$G5k)+4n^vkr<6e06086%=f)sF8~Y=4_8)JGA0)Qg2CX$ z#RVD%gTc$oO8`(Rm43e;y)x42>8aoEZ)|L2#{%%kdw`334&lA{emwl zv)L>V2#$`97{}-H357zF$y5@LVOVW#Z8Dh*g+j;)hr@|PLa9{t_V#`VFO$jo`}+fd zKq{32fOI;2c6K&6I4F@wO5*u^KI&~$aQLwiR;!iE{e{SO>RBw7R4Nq+1OOly48Fd; zS}c~5Y$R0Vi5!p1WynIK@dD1ub}5YgvT&UCX=~bE`>tT*Vk7TUaeMlbaXsFKR-P^VHl=R zD9XkQ1cH%~k@xrasi`R*k5?8R^8V#Eo2}@CZvYUB#aNcmXfzxSXJ%$5-*h+}4u_*8 zzP-I20P5@O4F*He35D5H6jfDK#SCehcDvm;j<>Y5uwZhzTv6ZS@c_W=>@1(pFCNL9 z{@2&nIF19r+S(d&78e&W3zIk_dCl-qp@Bb9|6Muew z-re2pa5!FGUXY{L>$|$Tc6WDK!2A3Ab#-+p6Ots6>2x}KdV1t?IRGpzEwO}u^1@~0 za=ADhPE%9U*49=omqX_C^fUnQ`FyL@$|O@%fBUhO%jMqQ-U^PROePbL#~T_N{$S02mAg_H=Y~wAg*hN{+#Ifm3oFJU%`~A`uM3 znwpvb;Njr`WkIP_{v`$9g^x;XX=#y4rB_#1Xe^V-g27;Z%TOrf_xsgq^~lHwGu3D` zMx)W`bl%+DsMYG(+1V^Bhr$hdHKIo;@;jK0Ek4Q zL?Xd9NhXt3RaF3RaB#qo|I1y7#bN@1002mmWSg9voB)7WEM_bFxC={5ORKA^%y?sC z0{}KRHwl8EX_|>)EEXdOVtac#e}XU!)9dvBaCmsg=3Ooq01OQcRa8_kpEEf5F{217vwIF8rU)Wl*jzu%9TKp+r}M&)vOPfyQR6-XqKzP>)M*Bg(= z0U(h`oSmHw3=CixR!{+t$3xYQA`hP#F`Lb0WxqHr@Fto}rg%K=^?Cuo=kvY3zM4#? zg6he_g0Zo&tYrlh=yW=vP>2%YcDu!5aesgR7Zr4LbSM;xXfzrK1cJdJ zP172UrnR-TI0ZtXP_Nfh6cvxhDT*2#9AuYqL7)@6TrQN0iHV8d*A(tdCX*=|jjpe+ z(=`2i48Nj)BuSDaxm<46E%>Se9LFURiQR6O$z;8~y+tWdDwXZ+?a$B8Pft%cj>}}S zQWWs{{Ndr@_xJb7$w@AkTa*G|-F}P3l5@dFX9|bId3I5$R2&XxdU~2oTCG;A)ml(N zTU#3d)YaALbh?}ia>Rh9>B`DVW}3-l91aIT5Y5fac|4`l>72aN=>&k8nHe6Bm)nxv zIj*m-34#ECwY4?GEG#VGI1T`zP$+++nwy&gfR&XMHhFh z^RBKgtJV7Q@`4zxR@>Rxxx2fY$M^pJer;_nIuAurh_u;k-QC?%sT2Sf7Z>xGm)@Nj z*zI->htt^DxV5#FPNxw$H8lkQJRZ+%HZ$kRiEsEzOQ+LsZ*N&IRWg~3L?ZR|^?ywN dC;t6^;!ib9ir60%--7@E002ovPDHLkV1hT8&>a8( diff --git a/collects/teachpack/2htdp/scribblings/img/21b080bdda8.png b/collects/teachpack/2htdp/scribblings/img/21b080bdda8.png index 6bf1de68c54f830e9ffb5fedad5a0724d4cb159f..d3e0c455b7729272997312309b2dc26e9187291b 100644 GIT binary patch literal 1421 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 diff --git a/collects/teachpack/2htdp/scribblings/img/2330a222ac0.png b/collects/teachpack/2htdp/scribblings/img/2330a222ac0.png index 9274a7d58dedaab11ccccdf9c02239b9f77f9414..d039ba6c0b1de9eb421bc2953bb35348ce6e7a8c 100644 GIT binary patch literal 4083 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 literal 4089 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 diff --git a/collects/teachpack/2htdp/scribblings/img/24365c877d4.png b/collects/teachpack/2htdp/scribblings/img/24365c877d4.png index 80925da1422cb381d06388e6900482c2c00983aa..a055c89ab23866172e191b2df235e0b01aaf16bc 100644 GIT binary patch literal 1167 zcmV;A1aSL_P)BZSTp{z|_Em0p5`!Sz%ISOw>ZYx|8Br3 z3`nUEH7R!uk0_#QQ=tZK>bTZQOF&9Y)U>&4cuI<>b%5%)Y2f`@k^yO>qGrWi!!r*^ zIwpDo0cjJWX4hRK;jp1l9a94uZP-jeic8e|xodbN8P!jK8bEbiB{2r1C`I*s;pW1% zy7_n4@Tgl7Ve<`m=OE&M6oIIp++D--8j!ROC=kH`dQDLacZ~xiq8e3#6V`D{71upr ztsrXQuA8K!h*}${fvFA$$K{ni`?08nyC%-oo*eAHgaO|D`2YL9sD-pf*>FyAW@LyjNBF$ z{13T=BpHb!LP!wa?5Ph|W837G>0F)jvFjza#)2h)ZAt3@>0rX(%YO%~-ajY>&AV-K z+vL~Z-08RwI29-$HQFj+m~^1h_+`%dIMR4CVc6%E$!*iQwMO2oI6!Tbk|H)vKx04{ z91#UAu}QAhC{4!x;Eda*WB2&OaGZt<_FNL2YzYI6!5YKK>vzAdwW*R05C+F5YM66tG`BP_Pcv&Su=D&l4gbJT0us@YrVs{%LH!g;zbF${er)6x z`gk|7O>Xy`!8zy8MeuzKLa0(NYaJjgt`~daoqV_-jBV4gO@7t?>=|jlS`Jhs469r5 z4ybKtM#=Ytn@iX3aogm>Z+tfW6eq0RgA!pt7}gkUEm6crMFP`=v#CGqyO!zLCcm>r zIV+jB_hgODJAueY8kQvCx!=jix6hn`$*ms$ex22fG%t4;CJeqDCI9wZDu%fO+!ycl z2%Y}>J_RJLJ?{i6_0=x1<0eI-F7o_1wR+q(oq@@ppVE?%f^sM51ePp!5+S9cF7nsy zBxpGX=iGhSbVia(;&E%<2~;!k=6ME0{fRH!4MstSb=BvSQCt~mUhXg;431l&%AG{W zl&A}Mo^W#!WF+VM!VRC1kcg^82|9t_Op0WJtctqGbm9;DZqRbv+9QAIj1-hR!5*o# z)A&;2dgMXWMaHf-IODd-t)BD!`u%H$dAY-YbYd@e5+QG*F5>(%8=UbVCJDZfNV$^; hc^384l0)+;_yG?s?e}X;dH4VT002ovPDHLkV1jR3GL`@U literal 1172 zcmV;F1Z(?=P)J0j4Kyx6?5|SmgO0QaShJ z)_ZRiC=5fPrgF%6FCbece&E{N8F-fi4j;?<_%q|C>Gw@uSkNJGbPc>9gXFyF%ExglG zGF{<1DYveRHv9Btn(%2G+cLE3TH>Ffom>1>K^_MoA3j4ZhSeTl)bF9e<%Hk_B zr8K&(X0yqWWYjqZ!^G5r16>tLB5|R0P1k0VqctUJVrl}l@a9gTqeS6!U60KsXM0~U z{@siVn3{^BYhE^+98p9qL!}lrOx*4jB{k)#Ytd{rIf^RkeV`^bEWFdsGc~PS*Rt4b za^lovVq)fyn%1Oid2Kco_PZ)IF}0w30_#al8R}X+n@x@+qs|df3#f@(B*WB{vaVq$ z++O(3p!znO9IYu47H`IzyD6upbaegTHk+JpsY&mH3Mq`#tLs|ZY!)C9wW%5nT!%eP zTy@@hpRTpdt`kKS^%I~LrY7tjHs1BwrF5-rHg}raa~&OX zfnnk9G02UdkJR7kTH9>7kYv>9L3HusRcbTT7H!6OYfp|xYJ>zN3X)us z)5V$}kQF4!NE8u5g7D-1`fxRIZSL6K)fu1oK|X7&Sq|8c^gfV2CJa7(e>v;TxhX2> zU7Nc$zxnLXCbhVW2Zu;gWNre%SW{cj!f4{dhlF z`8hQal7w1@M*2V)93E*&#@N)(b6%e2POP!_{5VVHnI8cpq61we3&2_+Ma9ktMiW@oOW7`NJzr4 z*39;P+xqS|g@JH;>AOSj+Wh)6pU*zTz_qoj5C(){ok4SnzCJDTxsN!Xh1ci4V|%X6 z@11eQis+4PS!Z!wkorZ4CCUH(@N^uyr{2is&X9k-DQj?ws~?65gHH$fzn7Q4u8a6D z!MCBh_=kfkNcu@!7wmQ3ckZ1v#nN?==f{~d!?9ldOn`y|^xDmE`^Qa_IUWp>RJMM-A82IiHTR3QlqL!+?Nvx za-nRxE)WF5?L`!vyqgO@d2m7^Y7sT63;ySdNhv6?u8Yj3;q|#66(D!+I9xh7Mb%HV zU+O1CeB*I7Dx&Km6F(T8a@Xe0(EEDx^V5j9`e8u&nO8r#P(fW6@&2BVPI;7_giy$( m`pJcg>-u4-pasTWBoy1gwcwQ>7l!7HFH+(AHSN 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 Q!2kdN07*qoM6N<$g1S__tpET3 diff --git a/collects/teachpack/2htdp/scribblings/img/24e80ea10b4.png b/collects/teachpack/2htdp/scribblings/img/24e80ea10b4.png index 3fa98bc5874e346ad6e38adcbe28336f46f95769..43659d6e16539e7a25b8916e569f174eeb94179b 100644 GIT binary patch delta 1464 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 diff --git a/collects/teachpack/2htdp/scribblings/img/25354f2b84e.png b/collects/teachpack/2htdp/scribblings/img/25354f2b84e.png index ef8f7a061afbbe4841768ec94049d9c970835ecb..03cb70eb7448678939309ebb82d3be99aa90e8a9 100644 GIT binary patch literal 522 zcmV+l0`>igP)8 z@*v(MAk$jkE~kPEw^2Z*wFUsph1(EdxvGZ?=RRP$3Wjmv{9Pnf?iygVY7`gFDZpwK zOy$B^2W+gG$%QKbLzT%SHwoBS1wpYQLT)340 ziB$%;aLWP`tH3N5ZayHr$_f{5G9bMQY;)m80d}r(gbOzWuyYl-$A$X?%z`+r1NN`sJLxfEM)ZCjzA4zA){B>g&M^|MtsK#)MOSiVwFj#`7C7Z0~vs-v8?s4 zvAt?NsIFf(Yt%UU;!p-y$QrAbf-=cMR-JMt6!-if-kWD3t5!{evd%(QUdJdXr&!3! zRYRcMWFZsK3*|lwnE(oELo8(C4rSm$v9Z|K%aMCxyDVgVPh+;*FOU2V3dUaNtpET3 M07*qoM6N<$f_B>T-TH(^?9 z_>Tzy_;@}tF5;|=lAQ6t^^w+zX{|5k)9b?l0C*5aX)aY6XN8FGT%T=Gta>TFJs!S4 zPwgART`E-(t1?PA$yg7&qTx2m$gUqA7!9`}#%9<68qR-4*8aF3gN6%tiBzR;j5ot3 zq2at@WSuYQd1yH2jNM@i(Qp-GtO}WxHW|CaU_CTki*e7mF!2=Eh+(Uv;TlF&3TcFq z7zQTMaE2J^VHVJE>oU^Az%CkYIb-iICuq3YjJ?CaH5zUbo_YdH=X z@jw>1S~#Zu(IkeM!Q&KMq+v40CM=hfF|=%fgjsYcZ|$`_qvJV!JqGe_YJj ZZa+cq7Y=x`PgMW_002ovPDHLkV1kNr^)vtg diff --git a/collects/teachpack/2htdp/scribblings/img/25451dd2997.png b/collects/teachpack/2htdp/scribblings/img/25451dd2997.png index bccea64f9231a61547ffaecf46dd6f7197725191..2833c9b7d53d474ccb2337e55a05b4954b2d81dc 100644 GIT binary patch literal 358 zcmV-s0h#`ZP)Xbr0K(MqA`31ku!YYOTVP}z~PMsnKEEK(4OqQ@Q+2qX&>}5a% z4?IC<2ApIZSrklDh9Sd{Y09GDI8GlVN!;C^&s?tw+}C=|rg`PtmPzseYb6QW_D`Q> zPq9{(J@;k#0&A7!Bj5LoqPKh$vF|57&)>pYc|P%R?BL`0x36mltX0=nF95b%xaLM& z4}bRxXc`8Avk!vn=O|T$VQ@bGFrcacKz2K4tl94YKn@2#uNS*N9*th1oK8lsP%amv zS14U)^a{nOe1y~6+YzWu|ue+hui#`*9!;@Q7H zF+V;qzq-zEe)`UDjo1D_|NVuY`;*3LfBPb7{DA-f-{ZtwI0lFTga7~l07*qoM6N<$ Eg67v+w5=S@sn#nPqc|Aka_*!Hc4zc$k sGS3-BbX~eGqlkIVahyHN6|Gm-ADv!rIKhSW^8f$<07*qoM6N<$g4I5xx&QzG diff --git a/collects/teachpack/2htdp/scribblings/img/25dd3e2d97c.png b/collects/teachpack/2htdp/scribblings/img/25dd3e2d97c.png index f5ab17d819d68486e3a1707bc808f1190032c3d4..6f31fd2399c4616f676b638c2f23bb2db8f9ce47 100644 GIT binary patch literal 923 zcmV;M17!S(P)3)4JL7gt$uP>ln7wy+qB)ufE>}yk(?$=ixrHNb?JV6rQxgE!G;>x(EZ4M_j6j|Q|bJxaL&R9 zseoBu-SArNU_%A0L#={pW4A@9_t|oN7NcN^LP!$;E!6vhH2p&5)Ho6UyT;kGJ44IQ+5!Pys8D zR%>iwFpmQ;p?1h)(AP7#p?1gJjlrR6FcRpnbi9A+^Jv zgxFULEJLMQV^2a{@9)Ar_^a0Npc-;;QmwHc!5v>$;SFTf8a7NpuiD`N!dma!r7xxy zLRj-S0{7JpHdMnJG^jNWCZOYM2;RbyTEm737*IPLN+|1n8djh}t#K%!%;PXTfPZQY z4^ohYX0=8k1Tl{n!n;quA3@CHb$Fz9u;B>gpkA#}Ao}C$B7By9{}~r?UxV;eYhXkf ztOkD#v>oyPV+YJA^J61kzxv?0Fy4+CIHz`qg>oKiVcp@HaXZR+JP+>-uNh^1b%pv6 z`(R{!$-l&Qq6{{mMy(MS+4^+`GVn{1oeWK1zI&8t`qJ)!lLSp)P3oQhi$>E|J*-NC z6Qk)%yGL9SWPO#6uNVk7P)&%YuTA-l-C~jTWs0V+pKx3foES}C%cZ_zu?Qz5!HLoI z_0jE4w3t(#FF`Bs-)Do_C82PX_wPsHvMSq=9+*@+#6>xeDVT*WS$;8y-v=0Rd%i91 xs|psNQ>hRS{ri~xFc<3Aj=PDXD5dYrivMtA2$C>kWMKdR002ovPDHLkV1gcvx&r_J literal 985 zcmV;~119{5P)w;NG=nVLa448x-oq7-i6*~2ZjLH85+*Mf$mUQYa8xvT9 zW|6eZ#ssFJU8n9cvUkv?Q+FBJ3N-1|T}HMJM|A2gBU^=fox01&fI~WImyre1XC|+a z?da59Mph3Qox01&>R?l+?lQ8&@KvYoGO`xtpi`PtP-}MPG`X1ENh1a>Czu}jd=;4t35bt%o#W* zHQ?+}t`RoWec^1D4Z?(UMfMj*RhEW6wFgg)*#H@+R@?B@nAcz&eyVMNpT?YqZnXy- zHD(JeOHY-uxM|E=@CdB@w)U&664oK5wy}$k#vFjO+Cvr}kv)YQY7bc)MAitKkW|~q z;$ZyWgvanhZR0PUTs$P@AdajLo@pIKK--uza7HK}9`RDP4z@fzSLPy~W#{3om*>hHl#z8=JrXaB zGBWvB;t^5JvI^LST8VZHl(Xy+D(!g4B5QyR zm3BO2k!f$bi-R(@3(E=|Q)$OT z7TE`HTiE|lZT_4v{@QgOl$$>bfSIctLZMt6jlpH1d}M?tOg%8E(vFJwP%Z(p(4~@( zg#MMh5pSpE`p9Zv5juqqLZXih=!ZG0UtjJg2!ez>GI#s|20)IM!*q1S00000NkvXX Hu0mjf0iVH# diff --git a/collects/teachpack/2htdp/scribblings/img/262a4fa650a.png b/collects/teachpack/2htdp/scribblings/img/262a4fa650a.png index a6cb9f558456d9183f05ded9828402304b05d55f..0dd50084e16436991abdf220af1292bbe8063ea2 100644 GIT binary patch literal 1542 zcmV+h2Ko7kP)*7bZ=DpC6`7!Mu404Mli3OeUC22nZO}Ljj)=db?aG zF2?QKC@h4(KjPxBY#BmAU@$bcd>-dR}$`0CXdYsul;H%3MAzyS|UhVahJq`|fi?ZT zfBxjcg}i=!e5_xrU`NN_fsVH4;}yz@c1#-tWjG>HY-=6vJy_G0Gkcr;cDy1X6jVL#-g-Tz=sbA3sYN135yn? zrba+r9p=wh+eHaWmY}*?fXfAqMr{`*EMAPaZw0vB@bgpKMG1j{`0_amUySw4%C;UD&oj^Do2nZ11=ZCH?wOy28w?n5B5FCv9dbM4YV7DVENPxkB z+FG?;lwdYv@nQk<=AofMZ5Jg}RUtA`Ky)-pOVxH!g4v9vOF@f;VPR^25y+;#o?0!t zy9GowP%0~tXArD zJ%>C30K~`R&6^3Zs$^$l>(-v#>z{MYj0`xP$jnsP%mWSw7A(Nam(c6c>;35yj7HdO zqmMv)i}ZA~x8vf)-F8xaf6|uY;N|tmS-f12?^Y}bI{7cjs-VwhRufHVEp)j88gOnt?Q+; z6G=&!HVv0A58hzN*WI^|CKH`bZw;phIywk&&mIqP8;^MfyLWThvawG%@l0DA@v7td`57~KPU0pnLhFUET9irVnLcf7jR4^rlAtAhb zS5ZHOd3cSD+_#Sb0ZdEdyLZa^_C=DIm&fE}&Y8orXZiD|(i+axkR;^gAwM5QMFi(7x*B#n>~^%Z!QUTR sEkqF!5m>SWMkAIl$Mor=eH;MbKfR@yM{%PWhX4Qo07*qoM6N<$f~@54jsO4v literal 1572 zcmV+<2HW|GP)w*o~zDTW}Z1cJvlw!7e*2z zlkh>fM_U_eYVhnKI1fvn*;fRPpLjWug9b!vzL41vZ*?%z*Qq{Tw3l}$~G@6g)Hq9ShCKv85?7N0*4!9t<>*RRaU z;lzpDwvBalAv~`;UN29bqS44ji&#;isH<#szn@2sQWUvs7u{~fiot1Z<>kxN>9}JD zfBcZyNuGLrJr^wC^5wMILig(zx0^XRjEUjPmvWlRP|we&Ue7~^25KggTem2RJaMAm zhW)9ZJ!w z^l9+5WYW??fP41zRo{pD)vGj_`0?XVY01Rp;_TTxe7M)j-qdY2YPIUjlb$p-(qQ1j zhdpb0sQ>!KS+jWQ(lA)brLd4wrm(TGTXBy)Ol~f|e8J_*A?_=Nhyw@k;sx^ayA*bL zk?LxSVkmo(p~mZFTpaWB1IxOqFI~!W=Z4iuK93&JWa6Jcodp5vB_)iGrq8E>mP|4; zdGciERe<{H)wEhw5Ry+x38zh?*V}&eSG}QuQBi?k$N!YfOkTLq{!!@owO+rDRjV+1 z^zbhp%GkK^ztykfZIY8&RHWKi%14r@)A8Lqc8vP>?|AbDX=&;WrfkB)v2Go%T>~Hh zz>_CPNkRBvoDK{F%a-B619YfAevBncR2GuY!i6X+gU2HPfWv{ zazUpP0Ki~?)2X(O5?n6m^#TBxOsK6@*+voN<(M-^0D$S!QD3jNjuI*=kdPn%KvEKl zi`CXqLU}pn%>zl=Y@9Je-M0UZ?ZK4C{rkwsKv-$qsz(D~o=-aT3@s?Gy>*zMHm+7FBVo(QC;@Zp6jm)hif{=%W7lGt6c<90L!54;6WNXlcRe(;b&xX40lj+`Cte zDJ+9epQzOa#+kdSH#IRTigx>OYsq27if#eW9#M^h2f1?P@CnJ}`gJBGP?7@6dZKZ{1SVPkFN7$B*2;osp5u&E?y-io16r zNxXB1D_3&rR31OhU%!;zAf!A;l1?XcbE(%eJ)LLHC`cUq{hI{^+_j539W54~Ki?U` zRmuReO94m{?%cuMyC^7t!GOd>BqSg)5uym44q7d~eS_PLZ{JW=h003UY?}S8YDay-HQGv=zxLk0#(AwnUX-S~5)(E`+TC@I$B#8)#+h%Gue$5W_pw%(=?VL*))(L-_(;~3)4-8T};2SgV-z* zz?rS+S1hGsDHThpSW3lGDwa~Ql!~QPETt2zWg9MiF}n_A`;M>avf;3wD4VQCQe>t@ zQm{-|yM@W*C1rr@E(&5Ikr7Q(*Aah{d;d(MR))aS}L&d2*K*% z5QTNYArR{yS40G*aHoLPiGVu=`Ia)il<}pEFJ*iw<4YM|%J@>omomNs0BYUM`00y@ z{Z|(R*Z&jVj+?Cq8*%rG%NCq=rEyS7 m`x`M69K(`xa|~JB^VtVnzNqa_#>LP80000r@ diff --git a/collects/teachpack/2htdp/scribblings/img/26bd803042c.png b/collects/teachpack/2htdp/scribblings/img/26bd803042c.png index 14f280af243126b8cc0b59fb3afd2fd0c2aeccdc..2d310ea3324e2f064318a99a0752e0fbeac20e68 100644 GIT binary patch literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^nm{bd!2~2jb_J9JDRWO3$B>FS$q6YbDH0q9I5z(H z|Nno=>*X%`!j)DlncUvWZLPlYE^xOyjN!?|d?SvTA%cg^s52**5oiR1r>mdKI;Vst E0P9a9)&Kwi literal 119 zcmeAS@N?(olHy`uVBq!ia0vp^T0ktu!2~2NC1>6OQg)s$jv*Cu-d@|t%b>u+>?pVK z|EXmO%?w_j->uyo)T*-B(6d2IDk9zSC))wv@@uo!E9pbPf9t*b@3AfB7Sfu}umNNe NgQu&X%Q~loCIFDFC2{}& diff --git a/collects/teachpack/2htdp/scribblings/img/26c4c403875.png b/collects/teachpack/2htdp/scribblings/img/26c4c403875.png index ef6d9ce1c9f6724ac21e4022965d60a5acff86c1..7cb0cc02802b6f2b532cc4c14c18cbf388183719 100644 GIT binary patch delta 1406 zcmV-^1%dj%3$_a^iBL{Q4GJ0x0000DNk~Le0000z0000z2m$~A0FeOpz5oCPeMv+? zRCt`#kt|Dp6=UWKCCbj5-Hl}_Kl|8b_Pu%Y?diVLA%{up657DKA*QN>+H>0 zmX*)v9mnxJ@7zr*rOv}$tJQ4VP9ze8^j9L0ux-14R;&FC?sB=D%jE{aH6@qJRVtMq z#ocH$3WdUOiTzS26dH}jkhxvgO{G#1t=@q9unr~IgC=yK15Mb260F00xDkn-N~K)a z9S(P=()Ox&*Pn$SCcLCrK_5&B5+U&Vq&Xa@P*2|^DHjv9BP z(GYQZG^D3rK)Qcozog+sNUw_llS-w`l%#Q+8POcmC-7h}V!u3qlc2FKq);e?a#t!9 zVLfknJc2tR1fyWXI&6dYHD7wL4eMYBeRf^B14l+fW`q%Qm~Y%-!gS3Dc_$&zS6~Hy zK723UeSj6X5`r#z{i6}rbGcjqcePp-zBY`81Bb^vc>P3cFC&C9M#vM<<08B~FLd{MX`rW#;3z_J zB9Z7Nf0R;=p~WFgHy=p29D!=Q2vTl&i=f7|t9v+H?t(Z?Q={2tyAL1!I z3Mcl_dv#i6zL!}g@QpvBlVK9lg$BNNsXN2ydi|Q-7!FA(**~BWT zR4OT@Ms|01{dfP?jo!k(uQ&=1b%WQi)(`g@yw>kL)Kk(vywwc^QWtonUa$M_{;3<4 z_2O-~>MNcEb@nWjp$%;)!>nQO2u^&(t8hEAQGxUYczSx;e|J-VM{|0e^~g8{tOk92 ztA?3~v+KHcPSnf*V)#!3%YhTJX(uhU(mJNx^_a>?&;c0 zCZm)hoz_x{i2Nemh)6Q7Ys=x>;?<8EQN=H5UE37ebXqBe2!b8Gj)>gR+IBd1Teq}y zZKp4-Whtdbh^LGslSzMBbWBn&{-+oJ(2F8|MW{qY;Z`&%k&;PF?p9=f1L70;OD{Tv zicpD)!tHmSs>?k#HWuL`s~7*(i}&>68+by1Jb^cn6@^>Ts6grhk7To&SzR}p(u*RL z-ZSP>kKry<;1hg;3fzUqy3I|4TeuaC3ZyP@LU4;m7df^BO<&3!g*Es`w|Qgqu8=i7 zu{WWl8_2{S#2wdpRcz;fvEN-c?EjwYhTnXhCZ-bFIxVj2;<)~YP)gNmHQ{B$@bb(5 z`}j9IWB#8_DOE0uNpej7YpR(3M^^FuZ?9syPtujX_NCtUzc2MZ#MMCiQc9`g^tuI9qOaK4? M07*qoM6N<$f^+q~m;e9( delta 1415 zcmV;21$g?l3%?62iBL{Q4GJ0x0000DNk~Le0000!0000!2m$~A0Q{pr6951OhDk(0 zRCt`-kt|DpH^%H0Qgl0Sb~l!##MygnGkR~{d^?(XZ)RsMd7ei+B{38)M@L6nTU)!k zyY+g#Uaub<9JJf*cDoHElgVT! z(9g_&%(Pmq^P@YCGdVe_`@I1h=Oxyk4Y(0RKRG!W9X&(QTdh_g_dI+a9(U*Y4D%uM z5q%$w?z*l%PDbHn5A zEWyp7Zqwx^EWv(=s}fw*suYXGv!dI!t#j{x1hv$JMd)J<@J$R@gl3S>ogn(ah$+z< zjfRNdqapqM3ex>U`y~ypLi%2eoKz~MXDf-W=SzKjpTMKRp#Aa)PJ+h0kV2slg6=`lyFa};#3uDYSc!IKc~Yp?=; zpS~9aKfwxI3!xW%|5=Ooxm+$7y;`jbcN<#Uf#YNzoPMIX6B5NAX_gzBO|@DLKsQa( zZ*(VUUJAJkFZzM@KQG|2=1`xtVx?f3rbKrfN9-GHEe?u!av5Hqm%H=4*67n(#1wHl zkx2Ab2VHc_viueqE$uC8JrvmAU%`fd1sMO9O~+vYZ1@_|_d*s`gHy<;29{+h==pr! zuU=N`f7J4h9(g=?1GhDlp4^5vLAAuVH?&;4tQzF=`Tx)l4-dt@SggO7)XLYid3g#? z!lC{0MEgG-E#@q#1|P(`8OGt^VHdqrD*1J{G%T?`S-$(jkQwR4SGDU0d@@wOSq4WkLT@=+8j!$iczE1zyp-LQ75F+9u+mnCGxC5uZow}<)Uw#-Z)oSQN8 z$vtdt$;^@&C&@Bg+=DSw6PBqH9Eb`iC?FIHSk{)7ws+Ut!%fl%9MZdbT<0f!`1k)i ze*J!urv3j~N(h30l;M3~?|~fzHwexPehmCW@DGs)AQ46)3?Tx6gTMhC0DuA^-b^6P zAk84H&@F;)5p;_|IYGHVyFjmi&XIa5fS89B??dz&qBjt`iTG{AyO9XXd2A_2GxUYf zuZCd_jB8=6nwRHXR_r}Qenjhe3OOIZQV&qc+eucT28?_Jwoip{ zGSPdGdjw3~)CM640uliXy@k*j6@w`NQ;WPGKw1G10v|;G7DTVB9ZCs|>)^fwk|8m+ zKSPuNM6Y9PKLA3wYX>)?b{yrP>?rh+YNtpGBrNr6XHXPNJu>&zf@I*n0H#*$M6zLO z;l2Qp0YCx(X@#p1uG7$a)D4y*dJkNu;c67$tnfcLF(s2(r`u^{)Fd(^{4k=;kEX_3 zi1(yWN9j zgRy@)*ibJU>g6Is+@z0>`T2M-!A>B-3JDefLDC>;lFruYEjojZ%5qSqJeu*)jK}a? z38}X{`NO5riko;49&VZ(xf&h2&Q1)->_%tj8yBz3vTraisiv}*N?)wJ6+6)%>is3u zcQzjAR<`pLdTSxGY&+w5jm~z@c!82u(b2#Bx4(&aFFl=SH9-(2=N8-Q_l&tOJYG^H z0T&(^X+97hyePj_3YcA6?duOx=KQH01*|6e&-$)>oZuod`^bT$Opc95vfbOoyK=39 zJwN%bexgJ$1#oOQY$O5=oWGkt+)2Q4BFsrhaZAgDm?-rE(~R7)h3ut!xiL>J-YO00gPCmFI}0rSwL0+Z}ULw z313$u8x72PF>SOuigx5z?6Nx7Pp>WrtH^lIor?#2U8#IA?I@~Uwe_GWryzM#eXD`i z6P@Qjy(!-}*jtln3!d7rpea}x2kpHxZ-KzGv@ z-u9E?S~aV9WVGY_US)fBoZlOdj6y}L{+8ohETn8tE*9!gdof5wU>OxQMq(UlUDi9S4)>PX=QPF?8Oz+_wB_M7VSO* z0hHIhFR`grD`)wpqMEwoouZmLXZa>^t>IZXGbelr{smC>?1NTSeOmwk002ovPDHLk FV1kl$&XxcG literal 1516 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 IM6N<$g80jl8UO$Q diff --git a/collects/teachpack/2htdp/scribblings/img/28253f4c3c.png b/collects/teachpack/2htdp/scribblings/img/28253f4c3c.png index 45622440491372c8c4a0025eb0a58a396a7706a1..d2a06d730cff440f624b9c06554716df9d9acaed 100644 GIT binary patch literal 966 zcmV;%13CPOP)7KauB)7^1zuH#V?sYBhjtmX9CFWHejAkoG6CwA6qGYBiRY z^jjpt{p87hOcd=M(_pcU< zMU6(Hk-J*0nx@%~+ceE;wW`ZYG;+JHyZ=CPU00Wv=;E$aD!?h2hDBI~ukaOCVG*X` z6abY|r8n~6JcLp6t z9Yn{p*dMo2ofEf2-{^g;s}>fxaRU)x1zx~wcnk006KnvGffH~V&cb=P2o2%E4C+pq~C z1h4|j@Cfd~9k>J|yU-28P+iV2opLLsfHN=!kKtW!(_d@6gU2uhX8`C5y(8{tg~BYn z(ZSj--oPw8>o}YKj=NIX%;mbui2Xzzw(@!DVENUayIK|39SrUs;kvT#dc94)ES0!@ zn<$D~A*{k0tid|0!zcI*pCN<|_yU`-1>fL1)S(W*5DdX#I08rEIGB)u;hhcW2{;KS zVH8GT42GKwrpd#H+`PH>H1z9F`JmJy%)u?V&^qu3pb@wLw_pwy;X|9j+Tf0&s8lL> zo;POOgXR3a#%$a3yi%zYMbS_0FbsX)&n8sG)2eJX>-&Bfh9ZKaFKG`(j^l_(0`;oF zD6Q{FTE}Hd=Rpm5CxWQ6ymJgpFcZo<4gKAD{@+_y?NSQYu{%oTzM+Z!>ptyn_xrTF zgWRXZO69&dRx0ZdO{K5y)6k!;vmLa$W~@I~M?RQ!dl5A!d#g8nJJw#j%yu!xDMzGlfQAj}CLdC`dn+27#(q?-b8|NP|2$o9H7~u{? zL?l?N%^}!CIM+is1lhRfooHT*jdvHl#C*);T=mCWWQyeX>|}P{nRmt#5wfW<6G$tLbvo zhCW>^-h$OMgKie9a0{l3MO}`1&=*UkrOwbBV+j^ZB`u~p(3NWT#+^nJM8{k?G`do~ zL$}4y^usN`9z5XOIYfYYcm^-wHN1rnuna&B_QC-;1V`W)98SM$S=_(R*|USY5B}6q zB#!d}uE9h7{Cd5;&~%QkD}n zg5xm0f!?w#)#sek2f9)UI0#qZ9=sWBPHc}ia1XA)K>+%q?-l)VsdOD)>A>w2ui!d7 z?m5@?fL^Pu6bgOi%VDAktHq-9uuAKSUayPqkA`@Y@O|mJzVDn(D-|wYBuUa%3=6Ob zi?9Ss@Bu!;M~Gn=KEVpC!WZ}oO=toz24k=tcEC>94L0Op&yUUPUf2iwU;-v!685Yy z*fw|WaQ^(}gquFlJEdmf23&xn?Nh-BG!94M0^EREc-P_GT}Mxnq*AE_K``mMqecC_ zCS5lOf=Z>5BuN{39LHf8=JWZjCj7nf`Ft3LaU8eMJ$+eyH1a%8M2uB>N1$vEm<+$B z8J!&Uq@)Cr-cr&ou)#K$l3Mz+7Xp9l@@s>#x#<0&tZp^d=zrbdUG9H_cX`Acyi{4; zR;S8pF=I`cEFrbD)rGr%vs{{L>x$I>^3i~ZWcWZvL`0?wg`SSV3I$z`{|_HUB)dnx zlIeqX$?o-rR9U@Lk}9iLc|=5lplxOh0uv@?s$Zv0b!%$U|I30uDVJkrruBJd#soK} pdL3vqIC&D_(Id=MGmW8}*LQ|=u9f>ypBexF002ovPDHLkV1m#6(fI%X diff --git a/collects/teachpack/2htdp/scribblings/img/28c73238138.png b/collects/teachpack/2htdp/scribblings/img/28c73238138.png index ecaaca43789e870dd6f067484238d953c7e9f38a..27c038dd274912ba490a4f4cce9cc54a61c2c04a 100644 GIT binary patch literal 1803 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 LNkvXXu0mjfaF&ch diff --git a/collects/teachpack/2htdp/scribblings/img/28daec71a64.png b/collects/teachpack/2htdp/scribblings/img/28daec71a64.png index 0642049e275dc6fa63f253d9b3839d435c53be07..886c76044a22f73422fedba0b9f39b879aad1318 100644 GIT binary patch literal 1038 zcmV+p1o8WcP)Jv&zB=yz{~e#Z|K0!ocOZfwz@@}y zH*40XRyL;ehGpZ?mi?bCnt3A)E)w2(Mhl4m006uM%HFTliN%2ho!nwO@obG}@t%v` zK-5qusE8e-_WhT3_4>egIPCw_+`fje$v{n61Y{iiYL2 zPx#6c*?e*++XtFHS)K7{3tu^%#)LT;Bv4d3*|4%1$Dp{9o?J|!Ktw6>S;>d5T||xm z0DvG>1^)P%`p(*Z7mT0{{R4PZZBe zJ->&7veIllemz=6mV+67^*rIJ z+my&o_tol?vVEW#RyO-;#SuQYkrRFF=A^=dqSWv%#`URDem={XXrGhxV-;L#PxtZ-6@9OYj39mTuJl^foQd*-Rx^z zG@UO{5X2!>Hj#CUP$^JNu>|I1q3nNwGPyX2^}E66aVgX)VcYGS_b`;WwvJ5u^4U(Z z98U^g@sl55sybUFjL)>9|DN*`Dg~+%wqbRgQFe^ldF?oHM+ii#DVAUw7kA40FYUzt zZqRAW+R|?H_o)}k?ypt#`UF8o6eCt#-jDLR^+}mr93Xf};#s`f(jGMPm_LfmZeGyI zi5!B@EvYPQ2{^9@rfAlua6dRy3RITcFE}6a2RypQM#*{{R1X;QYd^$0uTq7p&mxkM|6;NX0MT-Cew^{K4}JBHgo3JtN+4Tmtucg??le-`g7 zJAGplg-%hCF_jnBqsTSCet(<2IqUkvBNRG?fq}u@EDO#i$2H%7ewwl_;o*x*lsiRL z##~e0mVDQI{qcVCnz$#guT$<6Mn=X!y9#6x(p>ZP$NLGZqo2RIMY&TL7#OT{!sWzu zkwut@*ZlqGr^##LsO1!1E@3~L5;Q?#UGwYrw<+rqs1iXC5bo5-%^^UJYySQFGkbFu zRgx_P7_0jjsCrW|;xGXxJ8xFtTz+mbf-14N z=HkknKQsMzC3wyf%Oeqm{Vicph=KueHi+7b%E4eT;u_Ss;P?0txQa!qB4xC>| zYUcx|(M-&7p1pd?t|Vwd=6wA6YU}Zd)N)F!Tc@#_H%YosS`-@(cM;z^!~>X_SmHc; zNp%W}Yo5Njar(wa%ALZ>!k*|gfusn+;+ic-`zRkh;biAc_n%38vc>M2=WlOcxxb%6 zrwH&!WChM8GBe|I&4Kd^C=3`mah-JkS;Q1^1YGm$&-b%8w^Cw?vAR!;TL-~{pD5Q{ zyMK`Eti;U35@1`7zh)-QHCG=TBu}#tpLBv}Kc4mqIj(v1@-i7Zjn#c3oSSjA;>dRm zsVxUyF5z&eMy$yP&wY&;S|DoRquD$*v90Wi7&I?Xc>2>_@7Z?DJsliUCR N002ovPDHLkV1n!(4=4Zt diff --git a/collects/teachpack/2htdp/scribblings/img/29b31e5fe3a.png b/collects/teachpack/2htdp/scribblings/img/29b31e5fe3a.png index 32d27bb051e3b5f8c24de68c56ca698fa0e3720a..82647dc886292ac19abcbf76b6a6aecbaab3662c 100644 GIT binary patch literal 686 zcmeAS@N?(olHy`uVBq!ia0vp^(Lfx?!2~3Y&ik%lU|=fsba4!+nDh4b*<2<^9@Ye5 z)=pvdT??3&Oqq~&$zzr$r_725J&Qu8M-F_8T_&DJxKZ+SJ<*1fK0n@vdN`ibwS{Qg;G9b4l6Q<{f8 zGOx-*M1o!N{XPj1751B}882!i@D;7>KeF(F<%!ivB8`_?nq{&x_GzrOII(@zi`GjM zn(w?`Q#NIrj7VVRwgo277c7X{!*!;?@BPpGpVG8P4`c%7xW3tX>6yknrMRV!w`t@l?VI|gO~Xz}u(vf# zgHNfjcAA<-*u)pxgyoK^G`&3382Cl$#4;5jSIwsP7Y_xPe4n*S`t9GEqyML$F8aRm zp7P#5(Y||wU%6C0)VR1Xq~pucz(o!dyS|(V4C+=AdO3aZ60X#!CFOlWmZw@y7+H9= zXe29nKhl`EfTv5Re{qUX>W4GCEZ=;X%vJ2+=lx*`hkqA3u|}@n{k7>C?fc$W*xz&u Se7p)whYX&selF{r5}E*_QaQ5# literal 694 zcmV;n0!jUeP)+#=S_HHIKI?Ot6@lhGWlb&`5h&ki*WscR zf&SBHbQiq{sy>p(b*U0T?Kx#cms$}R4sT<*7(`$@(T?I`6T$R}b|U3r%JZ&yagWg- zvRfW%zx(L-%k6x*p1#cw`VB_}jTb_u3rz&=w`7hBQv@!hgJ>7B2)ybkaV~rjI2M^A zT)K$BxANxe(n|#HwHkT!czzPIy*{|&R2 z`;ld*jPf-)^M0vD8AYVT=2C|;mPm=gr2=I{k&;>$Ey}neB~>mel+i^>^e*!#>kuhX zy3C-gNu)&MGKI1}k&;=LsT1w)c;JsgEFn3HAtX_RB#Mwk5t1lE5=BU&2uTzni6Z1F cf28*@Kil65@M5*;I{*Lx07*qoM6N<$f-K@ZD*ylh diff --git a/collects/teachpack/2htdp/scribblings/img/2a1f3988f.png b/collects/teachpack/2htdp/scribblings/img/2a1f3988f.png index 3856a91e09573465c89cb09eb450fd0fd82f793e..ce9a9ae7374a1e11360d22092e74ceb6ec430752 100644 GIT binary patch literal 1188 zcmb7E{WIHl9RGOOd3I_coRLx`ADPg0YAL4Q9 znM&l;(-$)%vL*|4q!CZ487r+&r5wxlAN20^e!uSZ%j;h6d)>YB0{y)-R1H)C023Q zt9}aKnf1$}?80af8CaB6!4ck20d5^$rPZ|7v=Ch?I1`XlYaJOtR9x6C)C+@+}R(cc#ZW6;66L?RJT56{ofrBdm;cO90qztHg90f@|E zv0UoW+IiQUoeQTWr>Cc4@mF}*<&ZnoePKwMYzew;qxa(A9)0S*m?~|HR}k(Vb#`{9 zkJaC3QH<#L-AhNwsCEA2>@2)JINGj;pkLj*2T;mbi<0dG#|cW{l%9rQLkR^_IV0kh<V8P=RN&nKzM0oN;zhg3#cBXLF%vb{+#~l`7}TCit0YFQLxWQP2n}WNx$*UNSv8*|(aBf_I(q`){c!cww6*l=vlIEuYo%4g9(u+quvb`=duY8nlIW?k5`!PhB)FR;<3NFyl~cDDV@Nlr*{V$;nB9;8GI3 zzTx?zRLVqhZEbC3iCo!e@MLh1vvsh9N_QPb4~t!lG{N8f6h{tIT;lBTKw~7h}1i6HC~AZmK9uKwC)v#Gg&iNVZTcG2bqa3oh|yV zSOG_A__Q537nzx8uo$qrs|@L!9RR?oK;M-Lo4c(O%+wOvj8 zX~w@7`WELe94;=lFZsXYRPnmkKVshB{rvZnQ|o8vD;|?rj{P(F?ybp{?zSf+MMERX~b}UU+rWSO`%Q= zW4~o0s>}~QR{Z+AZ`J-;KQ9xmv){5 zM~@!;_;KT>;{9@_MtkG#XKh_{amA;_`z1_`81lA9i@5H->zDd#`C?Btg~=zUc&SER zwiiz|S{oL<`l?VT%UV`D!Bis#z3Hp3zmC)q>#`PbozLT7H-G=moeOs#o`0NWX59Mx z?YC#oo?UYN$Ke?Y%mSS*ufFcm(sSG7#I_)4<&npQx1#^pwVkk$^WT0u^}ijra|#1j z>!Ft~HQ(yi2}h@V{`~py!-B-b#&1gdyL62hZsu$Y(715#QMjRdnu(NaV9D;gTf~26 zo|(vKVPR2GQL$j}QUBzLKFcp}y`4M%ynFS;{^W@~4mx71L$tPR|6$>FlEpE@Z1%!{ zj&DlxM>HfG0yM7Vm`U2SCQavYSQ^xMGzq9G-)HjAntf%v*Is^^q5sL*XENiC{rl~0 zY?kaj%D>TX+nzl-U60P3;d$%2@3@s@!|T_tWAxmsyWg*DIFq)Sx7~U6S-0wm^+Al1 z4U;Dem*w%TXg-r+Qf4K){*DGIYJj9b6?gT?%;6AUa&jb*!i z{|aiGPGr;&;Yv?WFDVa@oOv`!(6ul#v-1(3mNN4M50$K~v%*#{-P-W$1j7`sr9NuT z*}Jq(zA3Xl8m+ZTg;}82Eqd*=xb@+6TcS=f+_`se-u(I6_TfiU*qRq!%vchn+4_9d z44#I|FW-Ev;`*=WbvK29sqsL9K}39fc+R3%CmGhPUF$h%%cf0>&g{qp##OJ|?z`_E zJzB)Hd07jOgN2NktDywXDcg*y6AU>yIVDzeORRKXzq}GMk#R%R+NVW3qt;r<@Xd7d zk(Oj|6qs}}W&i#CyLL@_+;~D$rTTo1S^DOi*RNks+6W3wb93{R%HETfOjPk)e9`As zhfk`B)b{P$%YnIQ+cvkwfm@?w`;RZa_(I#Bb#Bq7`pX$6e#?tXORuIF&GcDTWB321 wv+rB>;C(;hRch35=3N{)eNJ2a3AMNR|6;nlw}!v&0v1LLp00i_>zopr0Ea3!EdT%j diff --git a/collects/teachpack/2htdp/scribblings/img/2b944b7ab91.png b/collects/teachpack/2htdp/scribblings/img/2b944b7ab91.png index c951e4c56548407f908872956e8fb795ebcc6747..f0777aad1e30a3a91870befad6bc79f4e5066269 100644 GIT binary patch literal 1235 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 literal 1384 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 literal 773 zcmV+g1N!`lP)cd;0w!uV)lw3n)wG!i}Zd=^ANS{J#s!^hJ9ptNuz(5((#A005W> zdFTRQlHz0PvA|=Y#{!>)r#I(e8h%8cAPDc4>*!0D+Acl6I`lR)Rek7(fJq{lXFcLMDiTGx&>WSu3+tHWx;X+n=c_Nq-WY%jbdDWU0wNmLL z^7676y38|0lHV=&t3*3Z+$16nT_!vgGHX66&ciHjX3%-6^MZyC4LOp%bG%Y@z_vnC@srq_m1bD|Vo-{aftB81eYW>#aGc4@a6Xs%5M zGHVo$Wqw7Wiqjjs2o3hc0urWKr6fj-y-aR)3A&R->wf=GrJAvwmDrl|dFa z+t`g%+9rOMABQdz{y|gJjp4K!YW1P5nX)JiUFQ5DvmU|)9%f0qtKD3?1!+8VneZgG zZZ;CFbJSz08AL#H?IFmldsv=%Ebwa$qg`k1_V}(pybh6wt+nU6F|=H2Q$-uP%u##Y z%*xB+96jxp_BoZd$$mV${_r{!N!}Q%RyVCSaa+37R;1TG4L;AzDtQ&8QL}&4IHZDXuj*9_|YHCwmldU9=&nH3$9>q@P2cO>-FaGyp~d@g{#5JFbEbvcFG zxI1-Sjamz1=raGu=rSwK4|h&!pI*xfEhKYvapAJDtmYa&xV>%&IuwUs_15gWA`%TXbN(d=>zVhqa*H-|eVh zGg#?XkJqQZn_1C;)q2=bcb9FS#@O`-fG&}UE8XnwggW}|DwVaM-~4ZcbDkB)P6oBt zZrJq)fS;pC@~6MsQU8l3tHKC-@BjdJ%<}{X0L;~2&9%k>ke3Of00000NkvXXu0mjf DPfmUF diff --git a/collects/teachpack/2htdp/scribblings/img/2e6a31a9033.png b/collects/teachpack/2htdp/scribblings/img/2e6a31a9033.png index 178a528a7beb313bd0a5857028824a75708c6da9..879569394ebc2355fdfa6da1d2af6d6af6812ce5 100644 GIT binary patch literal 657 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 diff --git a/collects/teachpack/2htdp/scribblings/img/42f9f9e4cf.png b/collects/teachpack/2htdp/scribblings/img/42f9f9e4cf.png index 6ab99f4b0627528b6a056eaa21539b19601c39b9..76665a9d69f9285d78aea2e016a326170389fb65 100644 GIT binary patch literal 128 zcmeAS@N?(olHy`uVBq!ia0vp^njp-<1SHj&rY{6i?w&4=Ar*7p-Z;p4z(9c6aem={ zU2W4NRjob$P9NCYlP>Cg>B;WS(;IK*n9V+$R)2KftFxxX_ton6S^~M7Z{~cPJ$Kc+ bf7j(?B)Pmf%$0?JMlyK1`njxgN@xNAb#E|O literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^S|H591SGu{#_<3tUr!gukcv5PuN~xNP~dS2G1LKsrT+I?>i}X!-wbHyL(TUuIpgFkFGvW?yHymFaVH6467q< zyb(9vh#POjjW^=P8*$@}xbgO1yQ?|vWTUnh6|8gYMTL`%S~aJcJfG@vOp~GTwVwST zmov&BY~8A4)k;?V@$UD7r&Q<_Me;xVf`9~X+eUo&drQ=d^_Ntib{8P8Mm1{U&la5wJ;oLUy?Symf zXjMF3la%ZBLru3>()XVW`J{}MW}G7S2TW9S3*fUToDzi@f86;Ixbc74jt*+Rr6{(-hiXaf|g6v?FE@Hm#AMB zGyp(nyRxSCx5s5;nyR1e$^d|VeY5;oIM@s@a>!I|J_9_o?}OafkkJh=dNkebmC%71 zU^KDBAh%_^@q-SzT@ymK7X z0szVbk!_aa9esmxJc?|yRD=C@9%Ok}G{N~o4jpx0*d0x9EZ@8jn`6xKuDQ=#V4>@> z&W-{L%-p9IG_*Z;s1caj^vrCr4w=-sF*LKqPHlRqk@iC!ChzfQ6hD36u641I=V6a^ zXmRI<4r1W(YbLzRVB3ed>7Vu?j1U9CMLM`hS94n7OTCz~@HO2Ra*s!7|2*vtnz}?? zjua42dLHSw$>9CTL1t607*qoM6N<$ Ef`0T#U;qFB delta 684 zcmV;d0#p6k1?UAWiBL{Q4GJ0x0000DNk~Le0000!0000!2m$~A0Q{pr6951LuSrBf zRCt{2+L0|uf9~vXHc_kb4n5yV-*-|}_}ugUy{C>^tp>vxW%?5z9TqSE0N|y$K|~fY z1`wg+h|qCF=r|&D91%K>2pva+j-&s8Ue0JI8#*IESzjq${Eez`@77NG#PSV ztLYDNF{Siu>ryGLmeT5vcfTJzr2?-Q?>vo|yWZcCf3C@Jx+DL5Uy&}14nw~xrj%kz z`TiC?d2=tg%yim-_B%{Ip~Ppel2K{!?wh0wEg6;Kvsd{<`!Bqeu3W?Mnsl@(3g_6+ zjS1)4(W-d7CMnmgFE!D{LT&%Kkd4cOqZun3m-k-?Vxeit;Fc~HY6lUalvW20GgRqR zJ%}{vf9rHbg2NS2DA-~r>6B2=4p&4)sz0sMlToRhwdr^_R?e!)Xx)wg;4-IWVpXgp z6J=u6%bW%}{cKm()S+2<)YRJ9t_(W;*Eh?rl>JQyBLJ|;DcpEEc*yS@xv?SJ03D0~ z;L)`CRd%fDU<3dYOAK;aw&36Ikkc`-#DGp8fAu1NgvL!Wnm7qtjUuu6wAAd&i zcGLH9O{?`>54%jOJ6?& zTWk|o8pppmGalRHOMC|>l(;6)?FJe!?ZPT)QBk!kHPwo4L1Lq3t2|Xg>T6#SFMa51 zC8R!~HdR`Qc8gYJySu88*dm;z%V+<^Za2p=^ z=|-WG(X_$P--c9qo=>cb`9h;mF<+QZthT>OZKulfOl)QS=%xYNg0km~SV(82bwU9k zoslwP!;Y|BD0|jdMCXo(+T3N%hOohKbsjquF%w@$}?+5CBL8Rg{YO8c`}rg<1n&eJ09M!@ep@ z+E<@#mB|kQK+TQPU~47uk@$?b1t%vDFzwAlL|^vA?|NQMb)S7^r9M%Dfq&8Oi3@QZlA&V%<4+<>faOpnOKg;@&FJB zTAqt^9Q%#m?&L_Tw?3Rm-pD%oPJ8+uv3&Yo@r4&_)3WRTNL~E+fB9Vb_RY2+GNno^!GS0MQ4;30A%2@)xnu52KZa*U0CT(GR14`BRLpl7^tX zOwco{Y9ki`;D;Gvd5vWJ%3@PXm%oUOU%}lDG^G{Kiq-5&CyC|hq>>j)^L*lwba8YJ zM|E*@F7b#scQORY1xn9yK?!(!>9jx2mkPb~>3l)Pnn4S)dg;@7y5ed;a*;Agkc+Cv z)kCLUjH>_;eJI}gehFW7>-(kX!wpEh33II31Yj~F4h@0P~i-lHC8jzw;{s~3V972#zn_1ETASV)cv7D&fzn7sabPZ0S zJ(N;ZRj_*LwAoeqoyP2p_{-;3e0Bkls5U_{CoL~;tZHVygHD?h>HFvG&(qkoYqKAG@UMvpgUMW$bLn($YAW&d*HiDk z2a!nEJMa8@V4z$7Euysyss?7>L8q1S^q%9fyr#j~v)_!2d~RsCo{5S1k&(~Op8ZDO z{uvzBVxnmp%hsmNm?)HM1pvUxa^d{>>tkaE=f~?aHg@~``Rf3HsLxw94OnEN)2c0a zmL>J0k0$7}y3k-x_r!x3+7~7m1{9U@)Ecprg#rL?MsK|pq0{O@#L${%7)DVj4?Wlx zJUcr~XU-fQ8tNkz4h{94Idc>M5Tb2o#DFAIrUzyV{p&b^poL-J+__gSTsRqtbm2%M zk**6DPM$mWir&5)ix|2N$|6RRmmM~mRLm;Sd+y#N=-&(sbPo)4)8r&9LI5<=D2tGo zOM;uG-Zne^+}Rx#Dt`=zJ>jrtWQ1UZBbN59FP3F8BIS{d!^HrARUjVLR)O93EM+3J z1~Rdfx7@^{%<2N2w!?)0;Ls7`PIBmon=`fgY98WElyfL=VpGdAbXsqK1%UpSeWXGP zNj-??DBGFmP-^)hoz@#b01(_6z-q-S(y6XIAz`e>44k=cX*!0khUAdCNK zG7w}9A4&p%-N_A}3=W>$$R;%e0f3FXsVgN14ilV~5Cyjh1ON_!*mI?%?+A~%A!Qh* z@5t8h>=cOWQ7Q5G(7s-*A-AuW^EBw#n+XB{r;XfmwdBR$T5wdDVeJM1fXhzo*=4Uv z4?;cMGy9tikZ1OrLOmNi1Ji*3z-(gm_jEB4%$z=HSMu6vfj2iC)x4Q`?eqqu${Rwd z>K-RSuQLpGd(rE|wnmcIhiz`};~&X7rF!@}2s}3mK5*D{;!Ru42^&Jpi8pNr4pU}6 z?V!}9{VprMW}V>Y`}wZj?3K&;=z}5vg!XdB2Q9&;S~%ux10~ObnR5y}&P$L^fnOW^ z48yc?R7@vqo$}PR(<|V3-svq*MUU&l1uasZS9baAI0DSDtxVaoLom4=O*Z9jhnXT# z-D*^=AK{?0Q5H{?~000OJNkl2 zO>7&-75;X1xuljq;*TVol4G&7>@<}f*>qC7kP@Rt&;nIZIE@XsLexN~00wgH)$k>U zUIQ4&$w(C_0h}~O5jSlS7;tN$PEyNuZNZf-3sfqJF(rzUNG{1GcejV7#J{DvJCtNe z`A*{SeVqAr-n@D9c2|t5s`%l7tMx@*R{#55d}bjDU{8zV$9p{-%WUGnHWrNTZ0BWl z^nPS1nO$pfJFLA2{X0fE(QO@jG+(M2z)~_h_Go@nhO`;bkv$hnMPjMy_DC!>r`Nt6 zQ7Kym#>4Si*5l#$&Io{&vS;U$VkTG1TFm5T=aU;eq|HF3?5W7g(+PDAwgt*$C&XMl zk*#H_A)d%4#G3A~T~H=l+okKmpxIVNne6Xlq7jZkv#pF`mL_KNE23nCvm#1jHZNE? z0ECe0gva07(|7duo$b8B>`6yMY8Gxdw zS3XMJyS0S^VNv$tiV4}e#_^c)`EboN?(^YPJoao{x*7%9*_9!YX?!@IUtDCC4c?z z^ZyxJjz%&7+WfW`L(M0C(duy3tohM_10b58Y7N@SeDZ;5`s9QB%db=>Z8!h1c=?b2 z%cP4}aAsPZnHI18HG1ZE&mDi&OE*Ye5CCb3Qg&LB0fZl!PQR)tS3ipke-JL!yoO9# z9{wQwmp?`52B`}IAS0P@(Xs(ac>v!{nWk4zMz1Z@Rdw~V$mlhrM~1p+P`2D;b;o0- z>G7DH5et!j{z>-o@Qe}G<>8t6C#KUXT@V0Lj#9RiliPgVblmS}3!Ps1cs3^)3aB|r zx$^NWU3V2A0Hi!+{vhQQue*zmyAV|XgddA{zFjiTy7TQ)`0+X<_KnWA*YzVh?qXC1 zK(SocWrY&}IrE#ghMcT89qn}7Q|#_U*Z; zsl{kCnMz3j>~_Ab%@GWGj~r<~aUu{5mSsDdY}(mYR4d<1$4!g$jyk;>)o$FFe*gV{ zjg9GqcS%aeS>?kI$LP2kQUA97jt2q2&_0>LFpw3>>NjC2I|aa7 z$=h#-=(rkDlTE3cVHjDaES0bg$aXbb&Ye3xFwkR`I55z2?%Z)`vI*^M69!p{GIOxn z=%4;+^V=8(7cRVZ>C)*?sKW>)6zaHi>GXvQuW3`v0bmJ3=cz1VveL5CPLrrL3G}i% z_X*k`eSMvMeVvr)3QGt;6IfY7#B>ZEnxWer^wG34D3pE-2ED3!wMsEoO-nlxh$FJV!a(JVzFnAJcJtZ3IAIpK$nPw{h0t zpLzoOg!*>%(CBPOW8-w(-5rHaPyM#T!W+8o7M`3sOIg*Z00Cg*DP`MuHl1Da_)OD1 zKGwFnfwk_ko*CR@gmq?cPwOtL*}in4$)>#3q7nB7P0OyJ^qy?_)o& z{8jJ4!>-M{^=GvZjwNPqdU7nWS_lA73u*JS#&3GI`B~lDod6szuK%>Z|MYrJtS$=O z+s#jSDdo^n6Ezl7#v6o!Y^Pvab}6Oj7;o_O$}mjNu`MIpC72#cDaG4D4s;t@eh0ca zZw(LMOsvYbo0nZqdF7WjBP@ev8;yc&x5Kn-x1%g`2y}7JAFQ)do_bggqtrb9ut z)xv5|3>$=C<+Lzfir3EyytU>E=dH}^XV)Q}UKbRH?sb`PKV4&wkGwHxuSI!d(C+a) z`&F%>IF6QP6S8X=A3AC|^_HEKSLX;}PQ7J6bd)kF+6WXKyVc!foc0vsmwNe*z3jEC zned}LfWUt4WWUY-TmyyD4M0)0VC7r_Z{#UVm%y(D0)}B4sW;OR8%J3f+wBvK$lmQM zMy6-=)&9*YiWIF|m$64nb?{QiwGTE($${i)>cj?+0H`o@al-<$l zc*^lxuvt1S~df82Wr-?y91t`@!q;l+SKl|`+YjemfvS@*K6O7(9ae_`&%nc u8g7R*w7+#zhO`-|`QF_R@n2Hxc>Ev6F9OIJ0w13M0000Zo@-F4%`J^yp|clL-&{p;fYX=m9RVViHS-o>u#SKn%vc;4NIcd?Cm zJ8Wajy#to;0oZKNw$7XIYt^<`udffMlj~kRR)T=16G>vXn-sR$?MPB> zw-c@QZCO+u4g$7CRh|pj7FAUxU|V#iH7EPP`qCQ5Bis*H4E!_>HYf>yYuL)C?3A+DT={SNpeQHJ1$rI9rX#h3yJsujLH)L0000v?4=3@CZ<N*?_lbk;cy7_!5I}Q!QE%;fsDO)+q zZoyB}jlw>af(ih6&VW}?0iY-t@Cqsb)HMTMK?QKFnKqV!>Q`l}NB}TR2C#w(0JhD5 zS5N`Kbs6vqDgbyM171M|0N-c8U!lBLjsPG8!f?}155rp{rmp>};wd-&N3q3UYBCqv zN}O#5u{T-7+hUF}U~8~Pv5gl-aSm5TmF4WwQd#OOOgqw^>#Z?Zn}J_L--F@Pfz9}s QLI3~&07*qoM6N<$f^>k&egFUf diff --git a/collects/teachpack/2htdp/scribblings/img/5ec4a0cb1f.png b/collects/teachpack/2htdp/scribblings/img/5ec4a0cb1f.png index ad20f76df38b9f7fdeef7e32b746547012c03c01..2d67258f5ce9ba9c365dfdf803759fab2af7ca9b 100644 GIT binary patch literal 861 zcmV-j1ETziP)jfF+SgqnLGE~`2ij7;=OzCe1DuXGk4}rMnq7?6Ig)`?Q}0P z4g`5vfGa5x%s>k)!ZhR@2(sFV6EF`;aKQl`2M4?1IRMS@5$d!AItP!7=)gC(GUy0K zD*v8!AV93~U8G)w%J#^9oEHiQWAMk&)EsgDJqDxne(&O?nO?~U6@t~w4Sd< z>ca~8h-5@wM{w{7?kMB~VyT3IU=#{E0$>d0oCpdqszwLqV9Y!kkhYt;?3cH8krjOn zF1pC~;*Ggx)r{{%vhEHL=~6nl1S{?ifCuox>R?f1QzZFb8whYvNpLL&IwB1sKf+Tq z668@I3qj|1iR)!N`Ce-kSvEO{aCZ9RgKr60CHgJWl!OCBIs=P5o)Eg%p88W1v%FPN zzDS6OJWEtQB6T8P%N-62TnpQ;9Y2wXq)NSdA{# z&qcM+A0t0QL7ml%@1s8a9t@E0a{#o#p-A$F4gCS6x83Ety?}JX7DxF*kO>|MBB+79 z3wmSNUBIwl=6%;oNc2IYc{Dh4BGRMFe#94X(5}_p&>lL$NL>)ws&H^WOn#_?ES#{( z-w9ooDWOkA{l$gb6sK(pux_axF()U1Ej3`!Jd}q9y8*?v<_?(hbtbm0iQ#A!36U8t{uwV={kcy}XTC@mUgwa9>HwFbQlp&2U|CWl#LJ|^+KA>8(=!2l3 zMYJd~BKtIopdv#>D|LKZjLyuRd(J)Q+2Ik?c!yw!^w!=#R8sRh4*p9R2c)TnC{BX0x zT4ONy_mqPMViP|_YDEZ^hgL&H#ExSa{)8$|+G5ywz8T(xDy!f`Ea)QL0Fy&h&1LIJg_v3N}1c0w_9mxB! z%eNVYvb*4iHvIq;J#T_Z-vR;8SHltC0>Ck-1`5~U=n7ne+hC7Zh{Mph z{JVI29P!HWOu5#s#J#;1x;-UoAow?+IOYSwu-0yZy@?@?LsbNah+Itup?dZSY0QbN zPoU9PK3^zTKsEFvNL0V7Qla}X?lbj1#bhcDpau5Ff*8=$tEF$bLpZpQ5=lApakpikeFg*x*Dc6+Z|U@TPWbMF<+ zN!)2A0RPcmcms3=Yj#4L9fZScL7DTqr9u@h-&l6QC{Vd?ER;Ck>mYy|#}s7ZeDhl6 u(02_SV(BH=C0sOsK3H%Yf%7-WSn&^%TK@pT3o@Ai0000FSThE^qZBP(!Ie5^< zgz>V0sISnW3oafDYL1 z!@2SM47Dw~taaKq9yI81v&(UnJP2$QvJrW4;JhS*)`w(mn|4**OXqfX0-ea<>FVdQ I&MBb@0AQm|EC2ui literal 216 zcmV;}04M*6P)s3`Wu79IG0Zn`8_3A3$62QBlhv0 zj)Rn<>v}dKeDBLOUq{I|rh1a&^L70289G}0<&GZyd`CBbwquAt+%e7{?3m;Cb}aDw zIu`kj4i5frM+iLp?~askp4fL5{#Qrl0~8| SAsEvD0000e_M0_ diff --git a/collects/teachpack/2htdp/scribblings/img/6a5a617f28.png b/collects/teachpack/2htdp/scribblings/img/6a5a617f28.png index 3023e68f766f756a1854158d7f575d213cb780f5..4bb9e69275ef4fd2299825490b8f677ac26e68e7 100644 GIT binary patch literal 446 zcmV;v0YUzWP)bgnEfPs%a&rmK zJM`Wn5^3*0J$K3Pxy$A5fDi(_VHOb)(YEbMrIJi06-6;k({UX952bW88kI_=Y&N@I zuf2KJ1`#dG0)S?-`OdyGnM?#hn9t`Qe!t%ff-oMBe@HKeVE}-x>o1?n<%YwdAM9o} zn~9=$xm=jf=kxxtn`*V%Xf&ADG%cvVUa!$;lzB>NP>+bREWgg5BmI6K07BfCCzHtl z0CCsn@VDD791e%vioC2uh(;j zFOP_trp4p&cDwy}JiaBRv{tJn5{c<_>P>!lL^MsaTrQ_lsaC6H7>46GyWMUu7|605 oiA3u4x^3IWqrvLx| literal 499 zcmVD0lnr;=Pi8Ns)z5zmfg04P*#bmJh24yl?EGCi~uo#6j6^W=sq85pyF*zfr z!h46J_qyTYKEp}QpWl-=Iqx|PBEka@@o+eB97ic-S@zK}KtzUN9&Y~y!!Y1ffryA` zSym>K2?m3Tq8NrjDa9*3i?v#+Fd52ssS1cA?g{rFW zDt5b_*Xwl^gphX?h$zc40C*^+0KoJ72ThU9W&yzStnL0H5{Uo+v)}JIj>E@o{sh~$ zS(d$2VcYfxirH)i03PRoESJj<6vN>V;CdtFa{1lsIG@kqaM)Eyl5{*C-%`|SwPZ5s zDiVo=qA0KDH=B(piqq-TRjgJk02q(QujJS3wIoUPdL8c``)D-s`Fy5nKF@2K1^|sl z!2xR*s#Gevu2V|q^Lew` plx3Oc`9h&!S=M*&Me)zS^9z{i01ow+eyjih002ovPDHLkV1fy$=GFiJ diff --git a/collects/teachpack/2htdp/scribblings/img/6c262f1d24.png b/collects/teachpack/2htdp/scribblings/img/6c262f1d24.png index 3e0b8e3ec21bef7ef44708b1364656fbbf8230a8..9c807aa52ec6afc1222232b73c1cd604ed741f0c 100644 GIT binary patch literal 529 zcmV+s0`C2ZP)S?8S6aE-OQe$ViH$qB?ac34)3ag;9r2b*aulhx+gOQ|yo+ z#>%;#J->s`>DljPANIh*czA@=YZKguDB$xNB7YcwPXs_@ON6#6(b++T&JGaT!z!H} z3liFaKDGOF%~Lv&t*MApt$8-wnh@CL2%Vjc(Ai|)Er}?^i0l~y0h!1yC)@MBu>}Do zDm!mLSBdPcsg6gkb}db0r$fkuJ0kq-+SJboKYKevWap#E8$|YzWfSCK2NfKcMD{@r zgR)JWhh4W@a31#NByth^l;?J1>DQFE_Qs^m*5YJ0%70}&w0EjaT+f zxpm;UgSlAuO2+n{iKq3Bqbv_QIfTaww$j}zS=zdavm(wHT6Zj*?Bo#Y7LI43 zDJ<2$?2sSTaqOE|O+j?c8txv5O$a zYID7NpM&q|-ScA~_QK0}d4*1=1G?b>ka{D4MFC$o5D8=efJX#C$4j)lB9ZcbnUwd@ z@v-Y4U+ zVo~EFe_QUJBMEptg0p4oGFNy}z-twfK*V1bQJS<>$(}c2xLdbd%$V0k@Y#UZ_FGx< zl8E;@rqlsiSn^L5Y^4TkVa8vT&?*ev#fEPhc-U~#$bfGZ@LF})>-ndBy^4F=+l(bI zOL(c`c)_{toR6#cXkaO3UCEw5(DA(8cTVQSCjxk?pq8<&WXx*{&WpHM>0SZx;}Zd# z8aP>mDzk(w_|Pb-(>Te^Al~6i0K*C;?|hQ^C_kIzceUSvh}UuniG^T`Q+SnmS3#O+$x(t)b)(+|ZoS zQcB#pnp$e5HVHX1A~h89%%-AeW}?7MLBTU>U-$R6clX}A_wK#Vy?39xPg!jA=T2Z( zFbD*4B7Z@Q2XgwRJK6(r0@-~T1aep;6A4FHb;ikQ^queBmCHifEe`hCn;Vi2OkGPy zUCZ705zNPz;!9sVta^9;qk&%#BLn-r2deIrk;^DP6N=3A6{%-b>L<0@tx~y#zx3KR zd0^VI(KI|;r=R<3EKu4hfV~PEObhVUIf47wniQF?jm}KK1+~Bt&jb)Xsbsa`zuW!q zYCVt$1oisJ0yC&45>?&L3PuW*sqG1PR~cYEJw5mCu~;l?)6G3^zQol;Donx3oPvUa z2iw!r(@`jtLZM*GLTe($Vle`N;P=hgY&NZyM!pDvLgkB4>$SN;i{0JCGr)9SULKW7 z1tN_mR-ANpNGU8V1geyjl&mcM`ue&wgIgB0Z_C+aarBr*Gm|exk;{o*z%|)jeNhs- zXL?jouRk9D(z3DThwu|8Jd`z#Ph#_Ec6RpAlPBTOg6*ep5v7rh;P;DMTwK(L>Ae#ISc8TUA&KR1J~hKW zT%;GnO8T6^{MW&$CznW$&ZPFn#`o9?9N5YoG8kG0=Xi9_zNxG;XH=OT5v`ReOLxW2b!9jCnhF}HW3C-2U0FN z$RaMtMB41>=g-g6B{0_?_w5#J~R@0h=zCd z^YJ;4T)`d}T4*$y$z&=c+Ota|Fj#D7M+c$R>eyh4gB2%WE-XGZ$UTERjQJaDYx$Vn zMaY$H7}=s;f9&Yd`eR%O1t(DO7P}3cHgiC&>YUtzt(b2!KV4wL;czuNw4@O}Y+7Kt z{?qN2%avyl8(R|C;<~!}!lV}{jI6V>^K_t_89c{0b;_CK%vN~AY+(;`j{EG)%*^B= zSDcA5M^B^CC=!YIe7^ed6u%knnUG_Vyd|zhg4P3w8e0{oD;(P)~VeW^ZS_FXTNGrwqI7g8Xq6Oa^*@>ldp{aZdNHA85xmErM0!SdcB_L zRV8bTSwn{YnPjV|sCctX*fojvCcu1seIo(3DHH)<<>j|6rnu(O$*@O{9=)|%(6h_i qp~SJ0pLzc$8UH3Q)yk>r-&R~QGG9=tYD!Un_<_izXyUDiWZvJpP?ysH literal 1348 zcmaJ>dr;C@6lSfIARp`cNY?O`X=;UxuY8~wnr5p>Ci%j0(QUQ0$*7d9O^u~QQgN*q zU3^wHri_+pxk|Vz^jjAdhinm$LQ&KNVQ_mH?Jxh{-7|CUy>rhubH4A~JKwcK@%znT z2p9wcF^`SG;lVxUb3#qP_0hl?e+Xm~JQjydDy(0YDZC&2=qS*QontL$2`dpypZXKK zJPvsK3nySZsh;tU?=0u87Vv#{3hM7W?v-ZYv(VZ7M>`G%gd>Lhq!o`fWpc%ZzQDnT z4|A8eocE!lI{nEP>F0j9dC(?m=+JSX?P{|pZQ41^$HD(b1tKn*;oib$CVmUFb&y3&?mFs&U`)&9a+xfhNaWAx_DITqSL~=6 zQNgICGeN9_d@i0yB&MdO;_>*5jE`$;#g{H2!5Z(SNF?I%N}Qn{9v+!`_}T?@qD?kh z(retph(3Je$Pog8keQiDAiNNZNvN%bY{m5Sv`hx}M^?_ORI0SVV%tO;UMK4No++@x zVmV-~T&th0t^Ep+Oj05@p(T0#{{8`V!ll*s#e=V29lt))Xs@EWOZM2&voBthYv0rf zbJV*YH^to$NhA&yG=V^%Dj?5C#MFEl>4y+%G@6MCYeUtWl^t$Zo~a7BitvySc-XAD z7=XIu_5@o&4F*GmB{0OUu*wRk+fV{wbDOMVqM@hz<;m@~l;MPl!ud*hzE-38iCFDk zLP|?Z6AFdn-rd`)d~9IP#o`FgGiF40VQ6P^dlP{a>zsncV!dih*TJ^7wxIrX@cn!D z7FJfQC{Z^yG8a}USgXd*U=~1{l1NI3I+*^!k3Ff|=);9<8d6`ganvZCnv&(8cdfpR zWKzQ<;zCl6I0j0T^ zb8~_GWN9hyHh%MGwPtf_wOXlE&dj(OsuVAaf8J?RPN&oP{Ajg{_Ei|l%+z#paL5$kAs44Ew^V}9u+kxAqNT&UhyPu3kV{L6M2@SH^ z*M`h)Z*R}Y$Qbv=lrBA;EyCE*o1XmfAtc@G4mcR8ls=p_z7JF4nGzQ_!snYB%Ew#| z zb^%31Ls@loQiWpw+peK472wx7*Dqfn=lUVkE_u*GSF$9`>J1Neo9J6*$V#NJ}D7M7Q( zl)M(t@=wZ1*UYHhHv!BKEK-(!<{EMGxMze?Tb+B6{<% zH+8Y6dMFV!ft*BES7>R-f@ljaNww3YHkq04^ALmzd)eRZIXn+MFYhCaF?{Fw+}voR zfs_~{yImnf{PpX~`STOg)9ga@J;s=4H*S=QMNXf_82Uj%pmq1jlWHzkx_qRc>9e&puUgHIjL6TQF^0p3*}tE`K`}IBZEUD^J4w^krKMMwFaI_>tCX^`+3fVa zdw*TK_D{7M3y~f=qzeT-FrbHq^x$AxEXLh#{o%vEXJ&rCbH{aE`rp}SVSc``XHPqq z+sfzLL9mt2N4_8V{;E=c&dr%!h}~N#KYqMfsc0zyv_@;8wLdZO%atqtv4#J|H^_`Z US}V-Mu>b%707*qoM6N<$g88RqEdT%j literal 736 zcmV<60w4W}P)N+C?jg1Hdz;Tde1OgC6#`9L8fcEyj zwzjXEn>9-WO#>mgy(RIuL8;K)O%w&eAZ#{B5@W0yj|=HE7(*W>;_wiH zfYDKiA~X$)i-<;H7-((9#s-2xND>+w1;eOec~PV;7wmS!=VJ~Bibbrf;OYvg6kA(^ zWzm+Fa$6e|h05}ur*IW}dQypms;a`l0pmDQDj}bTszMNu%b8nSW~n5do#}3ODw#AV zCTb}um&<$M@Vo78Uw=REcEjU=*9%2~B!N;~U!zzwuCIUX?tU8||G2ayNm3mEyWKvu zzW!r&_IDy-5Mp_~)Z?LUH*IdFO-+{1XXtund;90i%%{~=Ns?*_e$qiSnys%dI-LcV ztEeaimrIjnO_tAielHSvK1p8uTWojtJ|3qW2LP0UQbMWR*Y{y^^8b(XD*Xk>8Ab5_ SZOn)O00004%8M+@i!92E zEXs>4*~p*NHK>-nYB4BJ`cwHZpA7-P@wJYlo!(`ew|cW{1YvwF6(do+@_M+j;I7XN zCXB}(mJwP8l%EB!=fQvWwfcp5aGrAlEsmxN5n`{k8F#ZXu#6${NGlt@DLb_}cfV~O zUFRY-Pq+|xWdOF8`n6e?=meHAeD}OxDF%D30@_&k;NI^u0NX1)Qmp&bX5F0?TbKWL ziR-ns)PFhcjdP~eX@6&>Cp#II*V>F5`O12j7gL_>WN5Fv9&UeD263HFb~3cr#)6CU zG{le8WC$-^gY~)CF0T8?ONQ{Omb|B((pVxX8NzG17|=VnjARI}#Yvy)>7^q>cunQ0 zzcI^2hVUAVI?#?pWTK3J$wG$ka(s5*KngO1SI1%6eDTQ;UT1gF2VkQ`a599~$*s<& z9S9M3AFt-pGyqH zBg49Ij;?d{D{d1!LXqMA(Dqt|A2+P~7WWZ{4A*N2uzPI%>=;yA^PdPpMsOn!LipI2 zNI4nVgHMqWcN9`i7NujAX0nJK(bSSf@3^OvY^)cZ6q0|9`(l_jvKU^ZQ$-ffz(ab- zVjHMQ30a&2TWKJRc_1+HWbqH2CYy}PKy!l0XbsFKm5kyCxeXXM1KOvSTBr_os7dm5~<1fEWDAIjNAHXNy&JwCl`Ti`?*a- zzWcd~!gX@6^}kAFP>dIj!ewOMy<2Df^czZVEVwpkhEb*#!CA-sS$nPm(&7O*Zc zQM`aRS#5rR^Q;ue3%HV5*|1tdZx|t#7jPx3ViXe#=LP)8${5AOB6)UJxr;{VIpQJ*=!= z@P};7s^9N7#$Ky{f4szA@SDtvTw7kh%I!8Li1udWR+1f8h5(;ih4!tExl8jXwwH;v zOS5?NUZWgc=Z?F^zjgtCn4YH{UPj*qJRx2H-~`&2Q}gSYSuJ_X#bEKtF7s!1*^{w% znNN<_C_xB~j?tj@+9db=o_&-TS(F!9lowf)7g>}SS(F!9lowf)7g@A0Ox*vVqM2U= Wk!-{!<#xaT00003;fdLDY7R=+S0&U3b}MQ$oD2}8Cv<7`%jmN7yeX=Q^q zWxF=#?6=LM>s*L)aTqeP48YdXpf>9eeabRM@174TMSrhVKr?e6g4=%vV0)!c>UE#m zth2My)5ZUR5|C{z4PH*WQBJlx?d`1eMOVWmTbpr0UtbUNV#sw(*JdsKq&?lM=O0VTn@FQmkmgu#$cs|=xS^hrwFaaYD zC~+2v3@EGhJgwP9|7F3*fTmjg!o=CqRXj4Fqt|7o)0I+@S%c=SG%&eB&<)Xj% zWJ~?CyX;BiE%l`$8^;fz(J>m--m8Sa{U;wqMjS;(97RSPMMfM&MjS;(97RSPMMfM= d{d;86`~m?+Z^*&v$guzb002ovPDHLkV1gnd4fFs2 diff --git a/collects/teachpack/2htdp/scribblings/img/89a0d469a7.png b/collects/teachpack/2htdp/scribblings/img/89a0d469a7.png index 09f2565b2da5800e7a27d8561a1d708ee223f76c..6d8a7de7f880472d5d00ee1648fef30472098356 100644 GIT binary patch literal 159 zcmeAS@N?(olHy`uVBq!ia0vp^#vshW1SGc}US12N(mY)pLn`LHy}6OM!9e6l0H0ye zu^-m*wnD9|muyh4*lRp<+x0}%%3JH!-JO&_d1twFUGOndpmq4PmdKI;Vst0N6D_pa1{> literal 168 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 M>FVdQ&MBb@0FNI{)Bpeg literal 225 zcmeAS@N?(olHy`uVBq!ia0vp^iXhCv1SD^?g<1fq6`n4RAr*7>Uf<2jY{M-ZC*3u&qXU_;SPACq$Iz^~PseGr=r=5Q!e#-gv zgxqdk$;-bi@xsh)2UF#El`b1coH?+-Ao=l}nMQmwBOj+Zail%VU@$NajZMAQW1DvK zMnYLnXxin7q;I{I&rZxp@#~drOW=|0yO^Hg)}AQk&vP@wsOItXLPM=*hve&+^Br97 Y?GxG~bGk{S6zFCKPgg&ebxsLQ00LQ7*8l(j diff --git a/collects/teachpack/2htdp/scribblings/img/8e7c1870c7.png b/collects/teachpack/2htdp/scribblings/img/8e7c1870c7.png index f7cfd7faf54a5bc11f71a6dc49ba74271c6d1429..16f3c9ea26201c935cbc03f31512c9cfac6975ab 100644 GIT binary patch literal 489 zcmV4q17y#fn_H*`+h8KT?S5N+dIneF0!#pW^6v4@0^8;a^Oa#Bhsa-p@w%Vv^QnQON z9K*F~+T@y#hmeo=eFKzI;90ZaYBy;iWne19z1%0dLJakQASL+fc6iC%qZk?OlF=!{ zZe>4fpV=Ev8}@2iEu+_S)^1~GJO`T+b5%{x3kh@a;b@{On_{HCCg)FgSW_6Lv)h|y zQA$P3<%D?!78|QGDHU127noH>d)>%SlVNMCyM&$D)WUK$x_EwYuR61>tv-&2;NXoH zY}Y25JcQeq`Y0Ck2tH?13yV+S@?XVYZZYxr+lN=3MQnU3vEv*KST)O*tIji0UK!BNe3!JOA&YS02>N6)jb3Rqw_1#7oH$!3Kg?k z1-;sCCj2wOlzGr^=#8AwEZE!iDgEj21Y24?J1?cI#jB%0uRK9eeM-;ouaT~}2=~OV z+hr-kTg!>-5nS>}okPW+en z!*{E}+Xo)>YRq^WXuFxfjNeW=tcna_j^m&_U}AsripZ89vgEN5Xqx%Kn<`6w4*^S_ gV8n_Ku`Mfp0RJ=q%E?{~lK=n!07*qoM6N<$f|o|+_y7O^ diff --git a/collects/teachpack/2htdp/scribblings/img/957fe78565.png b/collects/teachpack/2htdp/scribblings/img/957fe78565.png index ada81569bff79b5d8a9e4e8d80296cdea4ebf838..65aa7da8d8f2971ddbce839484d307e084a2d040 100644 GIT binary patch literal 124 zcmeAS@N?(olHy`uVBq!ia0vp^nn0|@!2~21PJ7A^q?|on978JRyuERd_kaOUgTsnl z|4*G;t$ihkh5L?tY1$8a*NDyYS-)vpqk-RYze7tH!={~+V_*+H$QjO39D}E; KpUXO@geCy3A|~(v literal 130 zcmeAS@N?(olHy`uVBq!ia0vp^T0pGL!2~25|Mso~Ql6eJjv*Cu-riU!$l%Cx*uir0 zzvy$9kGuOUVY_x?r*)OCfpe@x>z}c^eddX+;BY<;E}}ee(r*HU9fw{n+qC1|hmkI^g<`_Kw{%Q|F+;7_FsW@@{Nr+M&n& UWNNBUBhYOOp00i_>zopr0G4T3jQ{`u literal 206 zcmeAS@N?(olHy`uVBq!ia0vp^CLqkg1SGwrdiDURsh%#5Ar*7p-dxDr;vnE~@u`!& zhDmM=w}eRQ0)s6Dd*>`#w3Ok*q#BN%AO8J6B#m$8OfB{cysEi0?bp7!g$c6t^S4WT z^(=0?zLkGrAyQR*ED!>pi!aLgp})Q4&DvOTglM?F%gv+T-CvxQbVrAw6Zc;< Z-#Lr#MaX=UNT355JYD@<);T3K0RVIqQH}rr diff --git a/collects/teachpack/2htdp/scribblings/img/9858b8d5d.png b/collects/teachpack/2htdp/scribblings/img/9858b8d5d.png index 7f5ee10885b5af08e600974a5596186e53437ba1..3fda459e1a08e0b01d9ba6bcdbda033dcfbb0ed9 100644 GIT binary patch literal 777 zcmV+k1NQuhP)*ll@>kz@4il7%A?4S%!8;b1ULGW)7MA+XT2wsLL>q&5GSqZmV6_)b=Hj_qio`FZmqakMH;U!kDHB_4A0a z(byJO>}UX>7HPB^>P;5vO&01+7V1qF>P;5vO%|_ua}D=2G$EHcmdnQF^?rGyzwoQO zSm-PkI`pD|4L>gN0DxExaYdhB@dwxa!L?xMhuFRE4NHs4<_kvQ8o;){*>!h>}U-CEvQ18G)Ye5n0=Z#2(v9}b@2;#c|Dm=E!_npOA4 z8hm=7eYjUtv$$1)H3@W~<2U@n*Z95ct9Ym8jdyoc`KvR=I}v-)$=iXx3solJE^ng% zZ*Hl}k2QjB`!jHvKRp%Tg1c^Rdn;-4#dW21Gw)xB472C&3qo{z`P%YU(&qDVSx!4Y zHuge{qS1s{R!0C}s4zFFxLFzi6&` zXNBq~nb0>S3;<|pM#Ck0H7*CiC39&;0|4~xCAqz@DOkeD4f~5NEMc$4-$?BBn7Sp5 zdd@YTIyizQjD{w7#I~#&-)s=e3{CI=fI=}eIPP=Wr(OofeW4fvD?Tw)cy>v4|CSjZ zU@txuxd4E*o^SyenHI#Tt0$-!MI+OKB@N|uP>3?42{9699rLP5WSHF<48s4AHs<_d2t!<)gda#C$aQIPtALz?(;Xw-6OW@Y_&dIQD?jP#a{P@&*vMdYaYmmk(KIo zO`GTQje9p4`d@*oq26Sn-ejTPWTD<E$GV0;Ui4`_4V3~Q00000NkvXX Hu0mjf%P4nG literal 793 zcmeAS@N?(olHy`uVBq!ia0vp^b|B2b1SJ0~wijk#V0z%`;uumf=j|--Y~etWhVyr3 z`ph~r!#$hRZ0%JO6IYgUt){#!7g~d2wrX5z^8Z@5US3IiW-}*zGdGVDlu!rMB8l>yH92}fBKd1FnmSC3r(?IUl%p- zn(KXJXo%n~be$euSbhD@z0mdV+a)5zc28&8d(z>B@^S6A!Qp0X`@PdQ&p-cUnt$#( zH=oUZKl*z040dg~U#EIM{BuX5PkjHC>L0l;Uc7dm7~bS7yzHQk=KMpK*6cG{zFyti z%>JUrK?!SvS6w~3|6FWqE0ir=(`d3&&PLtTJ@^RvAs9?{qB9^iMf&JcWsq4 zYeliQul==KPp=6$PyczjkpKDJvf|mhCK<-Zgh!bRes?Ztv8|66I26r&YZ_2=zW<4$ zwm%9tc@2Ax2_+rfw}(ek>x{4F+&8=oMQrDNHQS>0>8#d2a>%EEiN{CrnyTWp#U=xo=zR2>*-#aD<#x&CYYY@!os#!ed^(hEzopr03pb3ssI20 diff --git a/collects/teachpack/2htdp/scribblings/img/aac8b78b6e.png b/collects/teachpack/2htdp/scribblings/img/aac8b78b6e.png index f8c1b258afc52a8af12c9960db5b0210e15fe589..0a15fd5fb50abffe69e1a60e4454a350959bd934 100644 GIT binary patch literal 1394 zcmV-&1&#WNP)g+>w$7!!gq-cX}L zNkpIldZF*4IljC{rO=r;JmqdH(wPy0>pLV=xReH8th)`95B; zsH&J31HeQd+S~J z=H{kWtMycy5x%|)fBa&?j;R$>b+?}}RTB9UQ4}kciWyR4dqh#J*Xzg=zRhN{TCIjv z0RSkNgEcAI&ypmSN~LPGTB%e%+)9!pNm8@fY&M$!0D>S0f}m-drfF?|f+R`pY`9!5 z$i0eIpw5*b2(PcN#bU8oEW%$`SeEsAysE|+_Fc))i9a5|l1 zV`IT!(3rjMTosGOY&QG)`U-P~JI7+N3=R&4LLsl$+uea3>JtPZl}f$5ycm)P%h1pe z$8nvXw~kyrK0cnFp31Terws~X_V)Jd>A1>dGTN=CPiQuqnM_7^nvSbJ3|*Z_GU>iW`{C9o)+cl# zNyk+<943f9I-dkVgu`L|Y3+wyE*Hmfh$JC^<2aYgr918adKcC(VaN1=*}B_S%$7v{ zz*MR6OSFWqZP(OlHSHSa5(xX;eUrL%U4%dxm+%n%jNU=a=9#uA^^Z@ zwK|>7Kp+qd27|%i^z<}EL2aCT2Vz(E_xH!g$Ej4RlbvmbVK|OkSy>q$A4jMGAaup^ z{NCPPI-NFfY$Os{TU$feouP4cbab?{vm;58;R-ZOZ)|L=uCBt10Z3dW5{X12fkaI# z7K_DV@O5B2*JLt@$`Sw|kw_$yN%%TYuBz4Q_VzZsh*q|@x2x4EWDzJ=hlhvAKPai! z>xYMjkVT+eU0hs1E{~}!l&eCa0J%J-vVD|u5d!7P@Asq9fwnA^tJ&FE$mKDWg>n^* zMs+`;?G~HO7L7(Bi$J-u+wJjq98$p_#N%A|Kq}-ya#C}XF^TN&?;99G0!CLSCnpAmkbu$E<>jS;AtYdQ z_5A#7UJ4(&j-8+|O`ebTvFYY+wip7+uZG%orF#0!CL$OG^fZ z(15RP>0!t8)7^HDIg^NL%G9X#DB)w-jp;f601s55x12=LJOBUy07*qoM6N<$f~Xy& AJOBUy literal 1395 zcmV-(1&sQMP)p z!dqkQcDqn0+~41q%jF+Y2#eir9~~X_cswSPsq_8+7!w5H;^LyW-#2}*EITzd<#xMY z-}%>=q9{Di3xd!)Z3u9?-G0BHBuSteQxqkW$y6$pUJFBj&1MS*gCt230D$Z3Yh$+5R(0097adV1=$9+aqdh+fOU1pxpU931Sm43wyL2mpZ3=d;;tz1D*Uo6Y9) z`GCPs_pbwjAY5Kv)@rrhY17H47wA`vnNoFPv?TaFMk`xBM3SURrDBjm^J^qYs@Lnt zTLTQk&@>Gr47TT?s!?CdvRo>as?}M{pDz}R#bOcuG{bS6%jI&pTth=cpPd!DM5i%P6mz-U?d>hT ztAgEbA0Hq0dcFD_e%n~FSmb#=pU?kHL(*h24Gj(X{eG9r^}PeT*C&c%I-P!eeEhyV z1Pl)kheDz5cduJxcXxM3M@P+O6G9s-X0v%=VPR}+teeSQ8N0f=IzB#z7KVoT`T5Do zNzG~6g=VQ#N~hB(B%vXlPM1n0&1u@kve~S93F;GCtyVUh)tshntPhK{ZX_AH=kYb2 z)mxv?jU;Vjfk1#D`e=I2?{pD1<^18bYCv!{N}J_W!;>s~9t-dc}ZA za3=;VTi#%_Li0n^)_~gWsnu%g-y}3!11!s0tyY`O)?clG&uBKA=jZ3STrQW(Jv}{@ z%VkND001;i+wJzj!9lOr>-Bo4r>D(k*uKk$pf`4Nb8~QTkWQz&X_d1q8w!P1R#qk^ zCeX@2X-p7=-QC?xCZprnU@*A8zK$?`LuPD$e}8*>Tb5*!=_YpYtVLI!~~ zmP{s*--4;v>&aviG6<}()6-MP2$;gc8Y>hEkP$G2?W58dEwIKs9uE>7$iu=Ko1LA7 zjDRUDtg*GVHO--ThAwY4?KAh5=)R%;{@feiA7NF-vlS|NiVIC(5CE+R>SRKnr# z;^HEFoZlq43j{&f+1WWcIniC3(a6KxVpO9*M(*$ zJ#P(wHhvUEiN#_A0|NsC1F=|4QIsE8^e2o(qtVWfG8&Ekz@pfVB@&7EUz0>4fqPx- z#+H|t-y2(AUdFvHUSmAZfA-tvc^>Q1c*~Z(y*(X6NWg3C@bFN_5EAejJ3BkmF@yxX z#vUFXbPOQ@udy$l1;YK9&~MK}7hgPCg8QKpyv9aGMsy4z0k5%{nHe2JNWg1sX=zEv z5E`)NH9btJev@Fm7`AL_8@14E_oy|1tC`bt{sB!m!kwPN;Qasq002ovPDHLkV1fgR Bl^p;8 diff --git a/collects/teachpack/2htdp/scribblings/img/ab1841ea36.png b/collects/teachpack/2htdp/scribblings/img/ab1841ea36.png index 9eca803a59ecb68a727ca49d7fcd78af2bf09f10..4aab00dbf3ec99b6f14b46a3e043126d528d1c79 100644 GIT binary patch literal 383 zcmV-_0f7FAP)P000>X0ssI2ON$aT0003-NklMIpNK&@ru3T&oqvCQLKgY^>(iSHo%qaR zz!3_+Ki_}6GvLePo&SD+`S<(Fm&ZFF?+p0;`94;&Sg?ws8HX8b1l)xy6o>~Qq-Sp>^i#{d8S d6K@=T000f@y)T1%vf%ovPDHLkV1g@bsqp{+ literal 390 zcmV;10eSw3P)>tVVra;$}Byf_HE~U+Lu{s zz(G$(szY9|B`;WA@w(!?Us-sA1n8eVrDfH+L!yK-Yp7a?*E*uUdG(r kaK_E-hBI#F!F7Mz-;}?=GsPzy_y7O^07*qoM6N<$f*+r->;M1& diff --git a/collects/teachpack/2htdp/scribblings/img/aeddf66d5d.png b/collects/teachpack/2htdp/scribblings/img/aeddf66d5d.png index dfa4c9bb888ee20a7fc748c8c52079f1539fb1a7..0755ac22fc45aba90ab1115c8c8b4bc1934626c8 100644 GIT binary patch literal 460 zcmV;-0W7za;xL*cVFZ_J1(-~0*MZY3tCbanovaO4V)fG-_jQAGZ_T_EI&i^gb-l0 zvPc17_4#dgIRJcEUMIvUUIW1D=L7DC^KR2N z{C#aQ=(P|m}q66ZBmei$9tRnOVPY<S?q+qN_y>H@~Z)&+;&91Nat65Xa zQS-EuY-&kwk1|I7Bo1u5=pJF)#Yr4S%9qPTwQcu^YTI&|jFIP6&Z!0)r#=WB^EYhT z?XoFx{1S7^U$LQgJrFwNn_ANK+5pFp-KLL@Gt)k zY-nAC@%_-?*wDHNWAaXHXm^A$c_%isJHqI*|Lyz&E!uJvm1n(+00000NkvXXu0mjf DO3dK} diff --git a/collects/teachpack/2htdp/scribblings/img/b32ce6fcc5.png b/collects/teachpack/2htdp/scribblings/img/b32ce6fcc5.png index 006ee64d2483bd2741826cff8661caed4f2b8e82..b0fb28f34f61bcdc32fce69b80a9d1e8d2345bc0 100644 GIT binary patch literal 1239 zcmV;|1StE7P)YPh6vqbyQBoD!YFq14ZQZbGYAfIWOB7SPq?)v*5kX6>3$ol7+!&(>!!l3$+}z(Q z1!m6tnKR2d17?~gK*nq~0|3x8jn0Gxj;CFp|E9vM24*kA@!^9W$3y-9*=jgkH=$O*F!gF z5x$JkXk-}1?sda3(D_yPG8~)-onM74!!Qh4miOJ2W!bi)f)la~Ns=4}fUfJ3B!z3y zB4in^ZiC3L!jxf}rt8a=Bnd^l8Kw+bmNiXten!(Yhr#2UFl9hG3<|#rQwHSlMKQ`l zlQEf0AcG23Rkt>d!3j-dn&#{4>-+mV(j;P7U>H^`7B4O?Fbw>MIBo>Qt z9G6O^HZNjZuU}QwPN!oVF#HBGnM|!#BZ%!R;kFEme!t)A^$_hw{Xq~!rBXRPJ+-}S zF9QIeD2gBmi^T$E+h9p1lN`szv?GA@SG;M~f3P%4$yquKs3 z*QseR7`(i^pbMiNpeTytIEGWwTlMBCs+nL{aQ^yGZkYiA18=Y&wi)TfE5t04$eFK@h&a zzC4wJY6^zs^Z9bQ>^z$7%lg=Tn5Nn5_4@sOh&vaGq8g0`%d-B8`;lSs_V(86_579H zf?=5J>uZuEeb?YW-U!jJFboT#0r-}&oB9tz@M8m?GImq{K?r_q;8RBEQE0#l{m9st z`VT_DV*@`j_ND%V5b)T*j|@b4*dWzV*1J5#KS%!DwXfz75&9=~W-S-Rf z{OJpP6m@ub*l0AO(I|XKJRA;>kB_}J33!zOlllh$;5c3`m-G3&^|x3ovMdV|5?jXx zKDLJ5oN7ECyXF^Zn!dlkUu&>PCX+nRXEGV*vYMv(o65b(aP_EcHp}z;!NI}qErKAL z&1S7ui$o$pOxWVhsT@3tB*}Wc?&{guY?fgdhmhFcv4Mx)a7g{LEX(se_^>=LGL5A(}gyZ<-<>l?|Ek#ittm1gJTHP08_*e%6$)IWa?(VKoD0sDMkxr+1 zp5MyG+8S~NR)(S|%jI(O%GudjyWLJC5?)PiLQzz!)!NLB0|1uG<@(DwNMMKf<{KhO zvRbXW&YqB97*;BkSeET{I_ozjiefUEgs%j)H`X#3hJjfDykb>*bab?34iYFC)9G|R zpId8ltJU%}n&BZy^5*8IQmNoLKA+F0(X|9OtQ{{gKP%7={r9K@>&X zWz-g^1W&);&*gH?t8cjIy8iL;0Y3-&&r|&>{sD$Zcz2}L1Ofm6002ovPDHLkV1jLd BSb+cl literal 1238 zcmV;{1S$K8P)T@#iQB+*I-O3ZxUGOcKq5(!BuTiffPaaE!rJ&2?{=l&OPXZxL(^OTpf2*phX&OFT04s?kNvp-mvMk)gf|tbQZ{Wg3vRp35 zcrfF`Mo2H4+!LX3Hco9Aa3!cO@O+`_5T~!ptak$VGJc%sJE|bA93|W=~Hwti& z?DZc^4i+$pWm$V4xh%^#j@$v0D2k%%y8Au4uDeVm-wK!n(sOV)SimHZvl+*v50Yd& z9zz~NG)>#sU!p5W5>Gx8xPuXvWqo{nJUu<_ovA-l6h&1km6MYb!hRvnW;0O~?KsF^ zq+~M5^Sm9kA=VG5udlCfZ*PA^e3c-GLZNVRaX}Eoedw65!^)#!|*)Mvh3bFp-2D#)9Li#;oDluD&)wc7UNb`&fL0KhcO z=jZ2szmL#2ScO8NtE;O_CIer^1Boq3k~*CZ)@Wip9&a=nE|c3)o=E@zi^W0|#m~=A zuNC+Ah9GjeT&YxYpWM!M{q0RG%j$N!ysPni^<8~k zEX!VBU(+=0y9K24Nq`PU5CjSaKq1-AE1(EHC*hxDJFkEu^qho$lE9CzhzV#dcAe^+V#GS3nU;PQnj~qA2hV9S(u z_O8)rv^QEAi^cBm?^hVM5{ZN$2|HLdMbmVxR@>|4nM{UdS(mf4znp}(F>%Q&a2zKH0_0?k#bT{i>-_xO z@v6U^gf|k$m5U_F%gf8#+gpZVJQya)N~N;vOyXmSL?wyEVt03U`F!51VOyzGN)UvN z2(P1|z4Ab!s_J5~ST8v{J8QLC@p#;;)paop(`+`^qwWBJ#bUAgUJp_pX8ihdqG`HP zsqB5FLW&@WVzJ0^T)W*~JuFF*5{U$SBObd63O;3{>UNlYL+}xDQWs)Rkv)N=afv*eeU6Le4qfwscJ&m|OWwTk9WkpexB*}4w zbrfursMqUdvsw4GIanEn@&5h}|5ikbcl{{+2Jjz#J>V?J6951J07*qoM6N<$g2s58WnfR z5;AqT4i`w_XoiF&de;swl~SLrXMgWJU*2aD{qer1-^2Gl!zF&a-NhIW%sATE9)EuZ zEX(pdkH20Y+~#hsUfo@<`S$>>jioQkYyH*Kx8w@R`Z8Gb^=;cu2s=hPgAX66GTQAn z{2>~3beaf)KPMPNp@eb;hB^EC(pdEMYqi>hpLHuond1*}e1MBH@uxw6(-T~N#s1-J zHEaG36TQcfFH(jy>JtkdadC!5oibGO3sJ{~64Du}fE9m$PIIc!P7|&}m8%&s*70T* zh!JdO2K2dpSpX#{f{S zU^DxV8EP*_ucf`56G_L0iTy+D?1}%h8N<#V{iYa7wUzersLmROi8t?2cpaU?gi>v# zy*%3UWIBWLyGRq~OFX<>U1zXTAx=_CdwC@L@mvU{+A_TS^hA8<<6eGz0DnjsIvI64 z&KI?pbJXoPozY&-QMY4gFMmYoj@k~<+@`D#LUa}xmpf!^72Ht+m-rknyXfoN aw*3>L9YBjE7=~Y;B(|guN)2tL)^hL8^7(rvV}0Bw`IU9wGbrWzJ_yy(0pM-<&jXK4 zJKoym(!($e$8mzso1?qJ?e(ksn+^8?z>T)@Wp!h?p81wu&sOdjCx^H^4?pU8 zI6KAFR~#J8mNfBqSj5*1#jwBl%(R-38Be%8N2|%RDe;qtm`fF8bG&-2xg+%2QO6<4m(>tNG0B3~DSjF|7VG)k4J zO1b(vY>Rw7Kt{{}P_1D*|Bo8pzK%hMd_6!`%$kmaBkb*mKfM{l-ah{gGM0iX?duZf z4o%0K_b9!VCpNJZTxnmIK3-;XsJ@fkbdDs$*HyL%7?~J@mD0X0Yj2(lu@qc{ub-WU z&wzoipB%y+^K2T8(lHmyju2ju8g!wwfEQW;nI!)TbNRqFo qeBbZ)`$Av5T=e&Y7kz!xG=Bi0uTErbhFs+U0000U-miR;F;Po?wq-gr|@KdpC)9VxBd3pvfX!K)OUVUrA_a+BR8^n&nXWK1{%fS M>FVdQ&MBb@0H~xV?f?J) literal 130 zcmeAS@N?(olHy`uVBq!ia0vp^S|H591SGu{#_<3tPfr)ekcv5PZ#eQEP!M1^xY$v! zOlx7)ga%n1S$mzBS!bkX{NHw_XIGU=&3nC#&!zl1YYspDSYadAe;h{rKe_$Z+6soX X|2h4qgTe~DWM4f?7=T_ diff --git a/collects/teachpack/2htdp/scribblings/img/d47072011e.png b/collects/teachpack/2htdp/scribblings/img/d47072011e.png index 5e715010af71de9e20c4a39db0a1cc5a345dff6e..a25d217a3e9720c4a705540de32f3711f8079f23 100644 GIT binary patch literal 676 zcmV;V0$crwP)!{lI$aWYA!bS8kPz+T`cY7iR3{8z@p`k?=&Y4ReaL|~oT zGC;xK*FW%25JG{|=n$s~$(%lMW<+?mfbk1HR3Pz2_P>KySBAqnHnd=(`Reeo`TQwH zh*R|tJBDis!_^Wf1M@m(C-uA{xkJ9g86in;JBjc*XCM9<(f>dxC1mfP5#ycVrw2yC z&Q*tpZ#MKGknqU}$#m9Cv?+b}$(Wd-1h>S_XeD3MgN^~+C3eP&>|4=2zTejGt>k_f zA<+a1A=HU(Lvv3Iof%3%ODv44yB^tWl?7U2VHg&H5X$NgCYom%(ZkLdN=Weru*AfW z2*ubEjl?#ZP}zQ;+R}lcdS@pF zGKNdT*wCT|RMRPAzHn(6@T?umP=GZISHqRA9Vyru#K4Zd>`-&rHD$zPCtPl!<8Sqr zOc~1prL>~CM4I_c8Osb;syWMQO`J!JqPbMY>SmR8my8&$+j|Kkd?HXv8+zam4eFiI zO1_5mmIgJV+t$<5^Uhe)T-!Ul>M>k*#xq$9Wjt@VQc91F9L1w&R2?qZ#S4Q=z9u7I zdxq2LZPg@PJ;Rq7vkXY@?4+EXs9+<;9?&~GNk}<7tpjAcWGquMVfZyeDIUx_V6xrP z!aL*0KEFBX83~5=&aS#;S1@<|_QB{a37$FlY>a*#FHZkcFVjD?*1!Ma5kTqy0000< KMNUMnLSTZ{NIrW2 literal 667 zcmV;M0%ZM(P)_fz~91kfaysmQ%<9!~U<-(fMGlobW{m0oKpP^#=tl zZ}e+*CV^4Sm>o(eZ>OIh>US!bHzq)eiU9yx-o`lf z$EX@3W7!@vQ?>V;%&y0l?J+Z&TLA!^>kq;k56pHlWBTEOzge`$zz6_BXedi$`huA` z*EwX^z*w}$z~~zzlQlQvr5Kp)%#7(r2w@!7I)?DZa&a`)O~-`j%!Jia{}i*e-nfdU zEZh51#-cHg=x=D2xzg&|RI4*KLwU&P2HPy7+%7dK>32a(H%1=Gofx34o0^GnR$HvQ zV`hGFQ#1BMxgX6^t!7;NFLQ5EMy|FDbUYvTGdJE8Oo&c=>Erd>bB}^qRxz0!P6be0 zqJml0f0>$*bFC=&n8})3rCkJ#QO=$*<2v~lGQkrSlZo+#O-{T6h6=W~JFIHb@b*xT z_uK)q$Eos2?wV=c2Fx=<*@1b!|1w9MH)2qgj;UIhk((EW3ARUr9(Rn>&Tq`9ZXM&R zF*?TPNbZ!B6qu7SlUN+dox+9aZ}Y#5{vl>rqABCIF*0HA(l-DABIp5U-kF?yelyfD z5wty$yXG<8Hemj--v^U)%ro1iiTS;om;dwU{SSX(!m(b?fsp_J002ovPDHLkV1mE) BLeu~N diff --git a/collects/teachpack/2htdp/scribblings/img/d629961aee.png b/collects/teachpack/2htdp/scribblings/img/d629961aee.png index beb06b3c45a6f57843586dbcf14598cb96ca3244..1b5727c94177f6281eec0999fa4e5e54a8c6bbfe 100644 GIT binary patch literal 989 zcmV<310wv1P) zrSwuu>7|y^OD(0BT1qdqR8oJ^buiNmXGY@5;iy#;wTb}XN6wM&d_Jx0p18ZmUM#Zf zDUGD@s<~oeBA6e)sC(Bv8lGr)n7kD~xr4LF+4?%Tc~JFZCyTC*(@B4BJlNPD+&-+P>K?f$cnttc)4jQ|K&gR-*MEM$H#HKk?+wX~$tS7T0Pv!H z{^)j?u9>;9VA$)gb?cGfJvNiRAD5}a4m4F8#SE96cl z_o}&Kaq1$g_S&s*xx<)D?zJ!xBzYSqPp8S4OycD_m>)uGLuWgQVnZ)bvaHO?)b^}x5)v9U#CcFlw#Ot!^pgW8PCYAaZmw_qq@}vB= zdo0K#UPpee+hh7<60a|(=?k#w(rJdvgr|Rr*QXOVpMLzA4&muv; z=CY&%ZGCU({g1rY7FVG|mei{ctbMHS9D7=O^Pdoz{uL(jNI0uILng@xO#f;xzLHFN zp-^zLGz+UDlcijU7M3ji!o8SeH`?eFknE-#!=jO8u#qklSvG}-;*e!ls3{0pmW8b% zkY!v5w4N;c!s#!vBg15_o>K=ch2}^&t6jrnEA4X~WV#CTwvuT)$gq-3@4=6KWZDnP zEF;U~V9_SBoDO2GA2u%-H>Crer4XlXE09 zeE*&unfc!<@FFws1y*Dvyg-9&IRP0JFAyMmkbsPk7dVj7@&b7>a$cZKM$rpEB%IgX zIzcj`UI1bNf@E~PK$48K7wC~u_X06823{aT1}3BdnfN^%VJ3G%ayZ>{Wo&K`(_RJ)8gb*mBk_vzqub-N32AjNl^I^br8~CLp zQ%*^yoRUmAC7E(cGUb$H$|=c|Q<5pC($AM&2Q$rZW+a{*j#@QQs|Wyoi2k+3aYr zICa_ZdeToeD&qO1KQ|t191LzBRZ~2RVARM4fTii~+*qLWt%lco`LH`R60h$M$(hMV zfouSH)xLOgH%#}Wxv^l_>#gn9Bf-0qD$JNm)7{iwS9#ouR@&W)!+S`virl4))uhqp>ncTP5Y1G)kEcESM>?qVbntj)yuf_ zP&t_&<+mkdp(ZCg_H*4u(^r#|eLL%`a+@NZX1GjvHjtBjIdyYr$BlFd&jxa`y%X;u zG*ICp+e77KvB3KugE=(ic4+p{M2n2g!|HixW;xPnkyA?q;m6L#fteQ#^v1QM@6Ps7 zb?c|GBO+4cnnHJ5-yiz;EAIuzb?B%mkoADI&-I-XPhV^PA0o4X+Mpf@XLV=Dq#A+Q zKzSZ4)zT~-3a*xNwN+%b^b6F&s`a&|FQ!_*+n@rfWw3KBnp!rS?Lw(#R-Y)2T9zf9 zf~aL&1uKGD_Ju?1)wI-F|EL`sR&({7Sm-KGN5Wa%HLSMMzR;njv7&FQn%+YYE7i20 z8`-Cp$5ESQYB`-w+N74>fvz=bxt@XBp_ccx0SnX&+_d1XX6AAVYc*rni}|XVyphdR z&G035j%w!b{j*auPX=ykB*?%@jS3lPs4XW@BSZ!QYL61A(INu}HF9JiuSSs!wAF}` z0f>b2cDGJYjV>90Sb(4!X)=&hqfQ2TY7EFgOpON_$f$u48EB}17a0hsfgKqLsPQ9% zX*HH)FsjCt4Cd4rlfjT0Z!(xrV^40+SF_&gB~@@$)G{aelldORtPd=s^*k`kF1*CD|eUw$bcfZ P00000NkvXXu0mjf+v(#* diff --git a/collects/teachpack/2htdp/scribblings/img/d92d6a49f1.png b/collects/teachpack/2htdp/scribblings/img/d92d6a49f1.png index 178a528a7beb313bd0a5857028824a75708c6da9..879569394ebc2355fdfa6da1d2af6d6af6812ce5 100644 GIT binary patch literal 657 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 literal 1949 zcmV;O2V(e%P)H{?~000MMNkl& zTW=dh6vxlb-ki0Q*s){kCQvKAQMDzsTv`;Mq7NX^3UN`T5~-lRR^l`CjW2){iN}&E zAeBpnT5f_$1uDv=38Ae@dWjrJYKWaUP2#n8*Y@(T?%H1OCNn2a>XzSAG(LaL{C##V zJ2Nq7nkM}J5WGGp6wN>X%1ovg0iZh)c=VBwz;kQZu+@cg&32(^UbvE+Th#25U_kEM z5qn^q6W7w=8>wo~05G?x4c|zuNt4zB7u&aIvdNijeR*;wd)ux2e#B|p1h|^Wctu}L zWFCwG&}n-rwW#I|uV^)IOr;iAxk+n*)Ao3Berdt70rv$pwii?*v!Ho}T4WZq1=aI$ zxL>HTZOzilLK)V~)Y$%KMy1hEhBY%4+p1QWS9KcAysE2OVbz+n7F2Af=5q8hrr;)| zVmo~&PcLH%ZbB-yXXhE5FaNIIBDBE_tc+h~5G!JFl^I57f zyc&e0dAMtvZtAKAA!#1UwinnvASBI0*>*P1y!=2&ng;;@G^1E3G7rmzVo5Vfvgoo= zk^H-O?rc7BqW}Q$&BFczzSzV3%G=sN1OQO6c~kR-EXt0;-!AB%52>Y6c|YRXs6KYt zc%@%?vQJt`LmLYLfSiuBozshslFOHj(M%p0DxXVK6}-|AHJq~IiU<&Z5os9*>vgpRjM>zzgn10-}@d;0Kj0Mv@LAm z=+8Rk5u$0Dqd(vKYhw6nFzn?wz!Qc5@B>|HY z>g0ra?yKoTZ#}&C`3_t~t_T1i^2ljS ztE(OY0FsE@&6PyHh#ilsg%{4Hy*%5T{UmweTpC$f9RvU*0hw({ASJAATbTM+J2f~- zBRMrVnfkXe=Z!1P_R3pu`ok$hry3Uxy>$A+sg>6VmTjMeY`st73D&qJOx#j`|8n($ z7Vrni#5l5-qJ=i)M*G1+V->C_FJ}**$zjEu3^vKutJ-1qk{ov+rfYg z0PDJt*+vT+LfN(~@`}u`Xi;Rry0zj{xKNncKq$=n6i$+{?*dq%O-0|)=A)NY2S3uo zY}=BwwIkOHXrWETcBGxbc6D%kGjk&>Ni@b#V>M`@O~rO+u!UY$9lU89^OD|@Y}lx< z3N6q=n@WonS!h!vnk$uUic~!igd!vwB@XTeh`YfB*R7#Cz}kG(7C`60YmHOeQxrmiqF`v3K8v-MhQqdFPpD zpWR@6S~DbeM*=hz*N64)ktoj?IF9SxQ?@OL+^#(#8dWvB_JjnHGfg;t{M(~PKX&z8 z&+zcn(W4(9KmM(C;8$b2RS`q2&Rc~JLalQBO12|Hwrr>B;aj!~9g#|TUzNA@Z3vOqpKqk?zii%6;(dw|CP> z>am0_U-SB~KNj}am&d~X^={=hp)h&vh-biSNBp6%dsh4QN0#0CKk!DZZ+~SVICgAr ze}C`Nl6w04dygI43#;)X1&)i=06+*wbFsSqFv!B!!h0PCEir*Pa7SxV|8SC;QE|00000NkvXXu0mjf2AsfM diff --git a/collects/teachpack/2htdp/scribblings/img/fa1a9f17b6.png b/collects/teachpack/2htdp/scribblings/img/fa1a9f17b6.png index 3d53897ff08d5ee3bd916391b2e0eabc85cfe402..f8f50625d557c9baa80fd2fd103faafb40b7456b 100644 GIT binary patch literal 1315 zcmaJ>e^Al~6i0K*C;?|hQ^C_kIzceUSvh}UuniG^T`Q+SnmS3#O+$x(t)b)(+|ZoS zQcB#pnp$e5HVHX1A~h89%%-AeW}?7MLBTU>U-$R6clX}A_wK#Vy?39xPg!jA=T2Z( zFbD*4B7Z@Q2XgwRJK6(r0@-~T1aep;6A4FHb;ikQ^queBmCHifEe`hCn;Vi2OkGPy zUCZ705zNPz;!9sVta^9;qk&%#BLn-r2deIrk;^DP6N=3A6{%-b>L<0@tx~y#zx3KR zd0^VI(KI|;r=R<3EKu4hfV~PEObhVUIf47wniQF?jm}KK1+~Bt&jb)Xsbsa`zuW!q zYCVt$1oisJ0yC&45>?&L3PuW*sqG1PR~cYEJw5mCu~;l?)6G3^zQol;Donx3oPvUa z2iw!r(@`jtLZM*GLTe($Vle`N;P=hgY&NZyM!pDvLgkB4>$SN;i{0JCGr)9SULKW7 z1tN_mR-ANpNGU8V1geyjl&mcM`ue&wgIgB0Z_C+aarBr*Gm|exk;{o*z%|)jeNhs- zXL?jouRk9D(z3DThwu|8Jd`z#Ph#_Ec6RpAlPBTOg6*ep5v7rh;P;DMTwK(L>Ae#ISc8TUA&KR1J~hKW zT%;GnO8T6^{MW&$CznW$&ZPFn#`o9?9N5YoG8kG0=Xi9_zNxG;XH=OT5v`ReOLxW2b!9jCnhF}HW3C-2U0FN z$RaMtMB41>=g-g6B{0_?_w5#J~R@0h=zCd z^YJ;4T)`d}T4*$y$z&=c+Ota|Fj#D7M+c$R>eyh4gB2%WE-XGZ$UTERjQJaDYx$Vn zMaY$H7}=s;f9&Yd`eR%O1t(DO7P}3cHgiC&>YUtzt(b2!KV4wL;czuNw4@O}Y+7Kt z{?qN2%avyl8(R|C;<~!}!lV}{jI6V>^K_t_89c{0b;_CK%vN~AY+(;`j{EG)%*^B= zSDcA5M^B^CC=!YIe7^ed6u%knnUG_Vyd|zhg4P3w8e0{oD;(P)~VeW^ZS_FXTNGrwqI7g8Xq6Oa^*@>ldp{aZdNHA85xmErM0!SdcB_L zRV8bTSwn{YnPjV|sCctX*fojvCcu1seIo(3DHH)<<>j|6rnu(O$*@O{9=)|%(6h_i qp~SJ0pLzc$8UH3Q)yk>r-&R~QGG9=tYD!Un_<_izXyUDiWZvJpP?ysH literal 1348 zcmaJ>dr;C@6lSfIARp`cNY?O`X=;UxuY8~wnr5p>Ci%j0(QUQ0$*7d9O^u~QQgN*q zU3^wHri_+pxk|Vz^jjAdhinm$LQ&KNVQ_mH?Jxh{-7|CUy>rhubH4A~JKwcK@%znT z2p9wcF^`SG;lVxUb3#qP_0hl?e+Xm~JQjydDy(0YDZC&2=qS*QontL$2`dpypZXKK zJPvsK3nySZsh;tU?=0u87Vv#{3hM7W?v-ZYv(VZ7M>`G%gd>Lhq!o`fWpc%ZzQDnT z4|A8eocE!lI{nEP>F0j9dC(?m=+JSX?P{|pZQ41^$HD(b1tKn*;oib$CVmUFb&y3&?mFs&U`)&9a+xfhNaWAx_DITqSL~=6 zQNgICGeN9_d@i0yB&MdO;_>*5jE`$;#g{H2!5Z(SNF?I%N}Qn{9v+!`_}T?@qD?kh z(retph(3Je$Pog8keQiDAiNNZNvN%bY{m5Sv`hx}M^?_ORI0SVV%tO;UMK4No++@x zVmV-~T&th0t^Ep+Oj05@p(T0#{{8`V!ll*s#e=V29lt))Xs@EWOZM2&voBthYv0rf zbJV*YH^to$NhA&yG=V^%Dj?5C#MFEl>4y+%G@6MCYeUtWl^t$Zo~a7BitvySc-XAD z7=XIu_5@o&4F*GmB{0OUu*wRk+fV{wbDOMVqM@hz<;m@~l;MPl!ud*hzE-38iCFDk zLP|?Z6AFdn-rd`)d~9IP#o`FgGiF40VQ6P^dlP{a>zsncV!dih*TJ^7wxIrX@cn!D z7FJfQC{Z^yG8a}USgXd*U=~1{l1NI3I+*^!k3Ff|=);9<8d6`ganvZCnv&(8cdfpR zWKzQ<;zCl6I0j0T^ zb8~_GWN9hyHh%MGwPtf_wOXlE&dj(OsuVAaf8J?RPN&oP{Ajg{_Ei|l%+z#paL5$kAs44Ew^V}9u+kxAqNT&UhyPu3kV{L6M2@SH^ z*M`h)Z*R}Y$Qbv=lrBA;EyCE*o1XmfAtc@G4mcR8ls=p_z7JF4nGzQ_!snYB%Ew#| z zb^%31Ls@loQiWpw+peK472wx7*Dqfn=lUVkE_u*GSF$9`>J1Neo9J6*$V#NJ}D7M7Q( zl)M(t@=wZ1*UYHhHv& z>rN9v6vwBnFMu&o6D}5`(WoIxkjiJHK83!L51|7F_l%=FYDiXu{>wYU!<2WBQ`2ZI z?purbq{r-0aCU5Q+5cM1Crt;I)B(X||M&`X6xt!U>K|Wci-IBoCI9$UhA7A*Xzw4l zVTFPW0yX||OC~6^B2e!ix3@lpCInjj<6ai0aDjl#KkjQ~3K#*6e>{R^DL4^?e@Pal z;Cl1!6^MUHiTnX_px&N7r~wU7=QV;>S#B=4KD_^k94L`L036g>bHRxa^0>!5gTPB* z3(W=mMzAx5i_ZevQfT@(v?qnuZv-1skoi)y8wL6M0$Wi~yfv~9g?4v`Hlfhr2H6f2 zINkEa8ZHLga`@vxA5?)DG_Z6itwnh|76nW?~Jm8+7)OBNF8)6}T@ z1zC3`(NNHaAYaaT{S%e?Iax4C@l32x&YNd7r2)ao`H9y*Uapl0!nA1nc&k(`nS_E` z1gDjv*Z=9PdZsmik~Wg-yuh1*f+_^1TFDz2FII{~St-ipbeUm)p)-Q>dfDqAFO&-u zS;@#VI3`tncAY{81Qo90^-ttVS?a8s)bNj=c9lXq1U0@k6`07JrGc`-YVnURc8`K0 zf;wOS9GFZMk3qAN_m5xd5(Rk#oWRYjPaT~c!Y0(lKW@+s3Ni?Ik^d5$hOJOQD*WSS zhEr%oAc(?zaCR@d3!8*W|G2TS6q*o-NL&cb#WGRY@S6PNE(TI)La?~`HIn)Z8<@a9 z?r0Q+3j|By#jSr~*pS5jad$%~U<51M%b~*!*kF|Y@gVwBa3X}hM^@Jp0oX7g{_#*c zQ*gb0`|{V`PuKu}{w4MH^yybg=yW)s50|0+<6(7}3zC3KHFfeY33e_tQiUwl)YU%@ zp+l-*rJ4r#$AO?zg(=lE%s&nXnkqo4rosMkP`FfSOEtUVABP4?m8w*;i~ex}5UG-v zYIfZ}PJ=pC!ct9>_?JYPDoLrPsr*Z#NmX;HrV0H^B2HCXsitZDOCn2E)gOO0#xk>i iNd&1nRQ~-d!};tw^N(z>4p-^hCltN1{d+}jU zxU9SF?#$Wl?yTpDwli~1zLa)nHm3naQHbv&XntrkyAsW=*jI{!amD1gXm%wk06{o3 zZd*OhgsJz!MS`fn;X7im!bJjjhC7G>3jY$o^L#<{Q!pZcS2=<(ROn9tV|ankS1>~W zBe{UkQ7}&c3D72pom& za(ZcFQMc7XlzQ9c^wV3+~m=R^s%;4j8BU{P79DBu*@!vp!pjRj~ z3bSj|qSP}#<*-%TtL0wZc|)C4H`pO46-vj&nfO#!>{3iTsOMjY!gP6!f)Rp7q1voW z$EP}Chc0ElzF$5ry$QXgn{E^=5SA4VTeV1RvfVqS%cn-RBGg-l?%8x%Q#d+3io_;b z-6lmQO>7l6o1LahAS@^xw;PezyOYj|)f`5#o?nw>$qf)@6`I{_9HFGhkR zZa9xHrEuD7MPd{6R-Lvg{RrP3R~u9vhZwBT7Tb~7WUX0ct4bSZ1n|&Nhye;+sXHB? zteliFsyYu10X*p(L_dX|)O#PFDm99DRS{x9053TNVW=R=;_TXV;phOjralBPzzGO_ z1xb-UBxd#x_i(EjNC3lz4xytUEAm2OZnwIFTZc&k7(84Et%5?7#pJwD$>3ICi2$Yy z5kjl5wDB=r`i+~Lf&eBC3*wT(a%ySwPYO3HH33W?3dFg>=dDl4gLT||j0CWV{Sct= zE&XL}KaQITg#eba86rps`5}D&nOnupfk*%g+6fUPgaiWE_wTU@U|Aa=)WGj5wTS>0 zx2II(u2NeGAcYO3Vs@1dfdCR=mx|U^Iy3@EhgvF5SLu)mASqs{2wkO)5I}0AQdzr7 z9VCDPFiK_WDs`Ly%3v;)zN^$F1ZpsrO4(KFDgrfFN~P&4bs>Qo)TLVPDs?S^8g!+a q{l(L><=jl521TiX|GxoD2>A=V>n8TzU5pR_0000DY_di#^ni^>NVpD2Nqj6a{Q`EGVNygFM89kSEzZHrXCfL`Xui`wt2EoXCDR-~E2c zZub9MU{MqW=t7X=PVex9-{kh2Cj4d(Y4ehH4{7%WTx5_Sg9I7$1gSuf3Q&Lq0I&cD zve=Nt=0H9N;v9%`*&;qCjmJsjbEHB{A;6SEOeyAN;hc2ZsQ>`1=vxuwxY^x1PCT{} z2CL_Z!#n5?5KN980gR1HcsVluG8wK($CoPv+L(II(aPx?9(Hz(IJ;lC?z?=?8K zh`V@^=pB`~BuiW>=4M6SIdm(l$6y$5G1{+Li6`+1$p{&~Or7?=CcQ?+*M!{RjaC#0 z7{*(A%qPtgz4Mij5elKUNU>d$Uc&DynodSbiMHGIVBP2_1t4>34vE- zEQ+H1L07x+fYH{TxL^oSOLaQ+AqtBfugObTQFwrsM0@TPhCOQL3ChNdrRbz&rFwtSqkRd26 zRy6_uAO;2X`ORvnF42*gqL%9F^P4d!0JHAGKRdl63C%`_(0Adf7b&=6nodfsZfBEH zlSoJi(qeW$cr`T|9NwWgPmS3!z9ueHV`K=@;`EM8_+PmF<_W*qLt4G0gVuyE;d5j{ zOd-G<r(kr@}dM+Nok|MR*;iziyY_4?gNOzFYH1UsvLcsG9&b1N1_Q5`*h{C?#-=3YqnWW)F6MISRXfrF;r zlUMg6350}`SN9K^n65(E1@8sp_eDnoilUr^W%XP2OiW<^P$#NDs9+u`MW0*bWtSy7 z!%Ub*g0*FPAY{+I<9q=jyS8i(QsNCoQ9WLwf(}&TT z9zT89;j*Ijj0yItbxZE|-9~Fll7246)8?aG1jPir^WXJ&_{PaLO5liTARfMPvW=1y zeQu#r=ElP}PPS13i{Gw@hi{y0qXcfO*n#tfXiagxaAU;|w4N~mB_i3bhJ9#FcQx#j zh-7FzV*&yIbY+{j)$K;**ifg}m2F1lMvs(U-A*!Ue)ikBBVDv6kSQJIIK4`7^sb+@I@^wq~it2=9Vh#iV9QyOn zY$4>vg#zpw?d$08m@Rblcl3?+&3_;yz{@?C!)XzuBnRFy+zO{fkdho2;WS&oXW)n} z>_0_Ekdhqe^n`tw9zjZSQuMinm@f{eMUavlsFJF}X%VC(2Nq-&gwrBONe*1ASsPA^ zASF4lwx~9o7C}mKU_oXMm@S0dxKMxqfa(?1dfgj;9n|ae i3wO8zAhjp_6ytx6CBo``BZ{m50000$ zT})GF9LE2B+e3T$MN4VL0;5_aB5cu(4@DEYfgtGgLfLfgV&2S>n9beHEKB?#Sr&J* zxR`*uaTjwsKQ44Cg1AAVC?A_<10hNk1S+;bOTSJ_zji@IgtpM0x3tvX<#|q@^E^E# zJ@5MmhS%$bc!Wjs^OS4c>=?E>bvCEY>eSm^Mu%&{?wXi%TU;K><)K_2yT|MHc->xb z0RRJ7h`~e*CJS*`h-4u$fyw8v64|Uo4ok!%q+CMABV+=0D#=Qs6O0kk9iv?1dRzB6 z_1HjZ4E84`$Dq?q(YbsO2qr0Hr;9l&#iTNcTqWh^gj99@V&=)=VRO6I-0{NluVwN% zy|lF8CoEsae@8CJPZbmh5>kVo9I%+duF;G)^iTX{pq@k^BwfVhN=4%P%A|5JN9p&3 z*~Prz){HlF>Cfq{-HVctE>d1ju5`CDshk1Kna5u%_QZIzefWgg5zXf}^>;6Nrld zpi^5LAFTjj)Yj9ftpxxC02;%MXy?JnR2>xU7?A=2fKt3A+A(l4RR;k;p1eAln;q>u zcu3}E=gF&Ksu+Q|+p_8uB2|<_(MBOsZOf`75EuNtpnozuw9(5JCIMg2)5PbJY9{fv z2%by4ZCm_8xyJOihc7pp8k1uv!W+#rF-IAxjb?Bt*O=L%wK`weoO-KMZ+96SE>l>e z0U?Ja<`GgZA>|Rv1Z+9UlF$hj;vI9ChDUpKhJL-V-)J70uZ1>i zN`z@x++G#?=h3w@jo&z&HY~p3!6vwS%f5d%Yb$*#U$NG%-+#OLEqyyIe6snwqTG*Z znjioe)ODY`br?q^Je<3Acu+@orHTNczU`#PonURyTDvw|#EKb~o|1UupyjHB~&ZS>2{xIou zgl(5Vus_@Nb?L^PII_{=Rk8EeYcF0ug~hb0Qe9Q4#$pvVzHLi$+Z9}`0N}#)y5_bk zxZJ`60f5P3IDO$bUfr2_KH(Ji(^$ZCF0GiE|9pMdB|lMk+6=C?E*mnkoR_RB&;K3yFd^CY$@JDa(H-sNe*vI z@gBUMA%Oru$QSRcI)vAEU)3QYUyRo?Bz!*}s>1END)-|ut*TV33b*5O3y(Ko5j@3+ z{@JgWPqc@%Z7En=@@Z^tTc+t7=xVxs@!o?b8)cc-f=lw(uPrUzv@51Jnlo9_qXF=~ z#O-m{T&OrYOdC}J#Oz(=G7gmK2u%STsK`Q|R2cBR$BzARY_8__;8FnrK<`LzYhUYJt+lVUccgdGBjEu7Kz&zzAUTK> z;~)UItGOFU4kE=kzDF^TytE%htuf%gZ3mHJ90UMnd%yvG5Glrq>zRjuBM2l1kzyPK z0CJH$kQ_vcaS#BkPFWpD4kE=k2mm%HHw2P{NHGoqfQsCTKynZ%#_>IhMVUo&wW7?T zrTr)Zz>yD+%+>rJTq^jAm8~gLt6uvXq*|q3x|=b8H(@joXZ#P0IL~pkKI)eM0000< KMNUMnLSTZjuMtoH diff --git a/collects/teachpack/2htdp/scribblings/img/ff2fcb7b87.png b/collects/teachpack/2htdp/scribblings/img/ff2fcb7b87.png index 9448fa6c247fb39a1a82baef90b7bdfbd1a4b037..69a7750b4595508268f6005a2edc8382d6299b97 100644 GIT binary patch literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^#vshW1SGc}US12NCVIL!hE&XXdt)PSgMtV{py|2f z^s^G@5*{m+nenAQb=lF7#Fw;W$917It!(?=Zty$1Id_im>eCz3-}`bamfW1ZKTR?n z4PLMR{_@L|31wF7Pd4;y2Ex_b*Sz4<_<8&Ds(Z#DJ_uItWcIrENp%kMrif#aKzKF! h+A)d$c{|D(56=_0{9b+LU7+I_JYD@<);T3K0RZydRv-WX literal 207 zcmeAS@N?(olHy`uVBq!ia0vp^CLqkg1SGwrdiDURX`U{QAr*7p-rUIBY#`teD7?{s z)s?tr(To`?p|g0VY6;KeJ$K2zaovygrrY*qtZ7c|xwtASI{W;0F`JK-Zx6ou`1{e` zjrV>t=kIGQoPq|gRK0xpu|@E=wR6F-KoDH|c$2xyGwVwsFU`|sQo+!4zoJpGLz}Tn j6IgS|%N Date: Sun, 17 Jan 2010 08:50:47 +0000 Subject: [PATCH 003/113] Welcome to a new PLT day. svn: r17701 --- collects/repos-time-stamp/stamp.ss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/collects/repos-time-stamp/stamp.ss b/collects/repos-time-stamp/stamp.ss index 9a66d363f5..4b2ea25563 100644 --- a/collects/repos-time-stamp/stamp.ss +++ b/collects/repos-time-stamp/stamp.ss @@ -1 +1 @@ -#lang scheme/base (provide stamp) (define stamp "16jan2010") +#lang scheme/base (provide stamp) (define stamp "17jan2010") From 10b6388a059a2d757303e66c2efd261c13e280f8 Mon Sep 17 00:00:00 2001 From: Robby Findler Date: Sun, 17 Jan 2010 13:43:09 +0000 Subject: [PATCH 004/113] svn: r17702 --- doc/release-notes/drscheme/HISTORY.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/release-notes/drscheme/HISTORY.txt b/doc/release-notes/drscheme/HISTORY.txt index 247e2b7461..1985a6ce75 100644 --- a/doc/release-notes/drscheme/HISTORY.txt +++ b/doc/release-notes/drscheme/HISTORY.txt @@ -10,6 +10,7 @@ - overlay, beside, and above now line things up on centers, rather than upper lefts - added scene-related funtions (place-image, scene+line, etc) + - added support for drawing with various kinds of pens ------------------------------ Version 4.2.3 From 5af38568a5b9cf1d96a87fd5e9f8be92e646826d Mon Sep 17 00:00:00 2001 From: Robby Findler Date: Sun, 17 Jan 2010 13:53:44 +0000 Subject: [PATCH 005/113] removed my broken attempt to fix the test; this is (I believe) an actual bug in the library svn: r17703 --- collects/2htdp/tests/robby-optimization-gone.ss | 4 ---- 1 file changed, 4 deletions(-) diff --git a/collects/2htdp/tests/robby-optimization-gone.ss b/collects/2htdp/tests/robby-optimization-gone.ss index fb70329b00..528df04b92 100644 --- a/collects/2htdp/tests/robby-optimization-gone.ss +++ b/collects/2htdp/tests/robby-optimization-gone.ss @@ -17,8 +17,4 @@ (set! s (string-append "-" s)) (rectangle 1 1 'solid 'green))))) -(let ([s (make-semaphore)]) - (queue-callback (λ () (semaphore-post s))) - (yield s)) - (unless (string=? s "---") (error 'world-update-test "failed! ~s" s)) From ea92d688e83cec7a1eb307b100d3bc4f6ea88c68 Mon Sep 17 00:00:00 2001 From: Robby Findler Date: Mon, 18 Jan 2010 02:01:30 +0000 Subject: [PATCH 006/113] work on the porting guide svn: r17709 --- .../teachpack/2htdp/scribblings/image.scrbl | 2 +- .../teachpack/2htdp/scribblings/port.scrbl | 117 +++++++++++++++--- collects/teachpack/2htdp/scribblings/port.ss | 3 +- 3 files changed, 103 insertions(+), 19 deletions(-) diff --git a/collects/teachpack/2htdp/scribblings/image.scrbl b/collects/teachpack/2htdp/scribblings/image.scrbl index ac1899b94f..4a40b50c49 100644 --- a/collects/teachpack/2htdp/scribblings/image.scrbl +++ b/collects/teachpack/2htdp/scribblings/image.scrbl @@ -1003,7 +1003,7 @@ The baseline of an image is the place where the bottoms any letters line up, not Two images are equal if they draw exactly the same way, at their current size (not neccessarily at all sizes). -@section{The nitty gritty of pixels, pens, and lines} +@section[#:tag "nitty-gritty"]{The nitty gritty of pixels, pens, and lines} The image library treats coordinates as if they are in the upper-left corner of each pixel, and infinitesimally small. diff --git a/collects/teachpack/2htdp/scribblings/port.scrbl b/collects/teachpack/2htdp/scribblings/port.scrbl index b000d2c440..05153b817e 100644 --- a/collects/teachpack/2htdp/scribblings/port.scrbl +++ b/collects/teachpack/2htdp/scribblings/port.scrbl @@ -4,6 +4,7 @@ "port.ss" scribble/manual (for-label scheme + (only-in 2htdp/universe on-tick on-draw) (prefix-in htdp: teachpack/htdp/world) (prefix-in htdp: htdp/image) (prefix-in 2htdp: teachpack/2htdp/universe) @@ -143,8 +144,10 @@ For the image constant we switch from symbols to strings: ;; Scene (define UFO (htdp:overlay - (htdp:circle 10 'solid 'red) - (htdp:rectangle 40 4 'solid 'red))) + (htdp:circle + 10 'solid 'red) + (htdp:rectangle + 40 4 'solid 'red))) )) @; --------------------------------- @(begin @@ -153,8 +156,10 @@ For the image constant we switch from symbols to strings: ;; Scene (define UFO (htdp:overlay - (htdp:circle 10 "solid" "red") - (htdp:rectangle 40 4 "solid" "red"))) + (htdp:circle + 10 "solid" "red") + (htdp:rectangle + 40 4 "solid" "red"))) )) ] Strictly speaking, this isn't necessary, but we intend to replace symbols @@ -180,10 +185,14 @@ The most important change concerns the lines that launch the world program: as there are lines in the old program. As you can see, the @scheme[big-bang] expression from the universe teachpack no longer requires the specification of the size of the scene or the rate at which - the clock ticks (though it is possible to supply these dimensions if the - defaults don't work). Furthermore, the names of the clauses are similar to + the clock ticks (though it is possible to supply the clock rate if the default + is not satisfactory). + Furthermore, the names of the clauses are similar to the old names but shorter. + +@;{ + key events and mouse events are string: use key=? and mouse=? stuff from Todd: @@ -207,12 +216,21 @@ what previous students have done. Porting five or six old projects to the new version can eat up a couple of hours if you have to run them and just correct errors. That's not horrible unless you don't have a couple of hours to do it. +} @; ----------------------------------------------------------------------------- @section{Porting Image Programs} -using the new image library in isolation: +The universe library also comes with a new image library, @schememodname[2htdp/image]. +Using the old image +library still works fine with @schememodname[2htdp/universe], but the +new image library provides a number of improvements, including faster +image comparison (especially useful in @scheme[check-expect] expressions), +rotating images, scaling images, curves, a number of new polygon shapes, +and more control over line drawing. + +To use the new image library in isloation: @port[ @(begin @@ -228,7 +246,7 @@ using the new image library in isolation: )) ] -using the new image library with the universe teachpack +and to use the new image library with the universe teachpack: @port[ @(begin @@ -244,18 +262,85 @@ using the new image library with the universe teachpack (require #,(schememodname 2htdp/image)) ))] +@bold{Overlay vs Underlay} -why switch(?): faster image comparison, added rotate, scale, and curves, plus a bunch of new polygon primitives +The @scheme[htdp:overlay] function places its first argument +under its second (and subsequent) arguments and so in +@schememodname[2htdp/image], we decided to call that +function @scheme[2htdp:underlay]. -@schemeblock[(htdp:rectangle 10 10 "outline" "black") - (2htdp:rectangle 10 10 "outline" "black")] +@port[(schemeblock + (htdp:overlay + (htdp:rectangle + 10 20 "solid" "red") + (htdp:rectangle + 20 10 "solid" "blue"))) + (schemeblock + (2htdp:underlay + (2htdp:rectangle + 10 20 "solid" "red") + (2htdp:rectangle + 20 10 "solid" "blue")))] -changes: +@bold{No more pinholes} -no pinholes (although they will reappear in a different form, eventually) +The concept of pinholes from @schememodname[htdp/image] +has no correspondance in @schememodname[2htdp/image] +(we do expect to bring back pinholes in @schememodname[2htdp/image] +eventually, but they will not be as pervasive as they are +in @scheme[htdp/image]). -overlay arguments reversed (added underlay) +Instead of +a special position in the image that overlay operations +are sensitive to, +@schememodname[2htdp/image] has a family of overlay operations, +that overlay images based on their centers or their edges. -line drawing is slightly different (outlines are the same) (ellipses?) +Since the default position of the pinhole is in the center +for most images and the default for overlaying and underlaying +images in @scheme[2htdp/image] is based on the center, +simple examples (like the one above) behave the same +in both libraries. -star function is different (bring back old star function?) +But, consider this expression that overlays two images on +their upper-left corners, written using both libraries. + +@port[@schemeblock[(htdp:overlay + (htdp:put-pinhole + (htdp:rectangle 10 20 "solid" "red") + 0 0) + (htdp:put-pinhole + (htdp:rectangle 20 10 "solid" "blue") + 0 0))] + @schemeblock[(2htdp:underlay/align + "left" + "top" + (2htdp:rectangle + 10 20 "solid" "red") + (2htdp:rectangle + 20 10 "solid" "blue"))]] + +In the @schememodname[2htdp/image] version, the programmer +uses @scheme[2htdp:underlay/align] to specify where +the images should be lined up, instead of using the pinhole. + +@bold{Outlines in different places} + +The outline style shapes are now shifted by one pixel for @schememodname[2htdp/image] +images as compared to @schememodname[htdp/image]. +This means that these two rectangles draw the same sets of pixels. + +@port[@schemeblock[(htdp:rectangle + 11 11 "outline" "black")] + @schemeblock[(2htdp:rectangle + 10 10 "outline" "black")]] + +See also @secref["nitty-gritty"]. + +@bold{Star changed} + +The @scheme[2htdp:star] function is a completely different +function from @scheme[htdp:star]. Both produce stars based, +on polygons, but @scheme[2htdp:star] always produces a five-pointed +star. See also @scheme[2htdp:star-polygon] for more general star +shapes. diff --git a/collects/teachpack/2htdp/scribblings/port.ss b/collects/teachpack/2htdp/scribblings/port.ss index ea741da500..d6da930454 100644 --- a/collects/teachpack/2htdp/scribblings/port.ss +++ b/collects/teachpack/2htdp/scribblings/port.ss @@ -2,8 +2,7 @@ (require scribble/core) -(define-syntax-rule - (port old new) +(define (port old new) (make-table (make-style 'boxed '()) (list From b1abbab3ff63882e8654c225f40c1006583b7c92 Mon Sep 17 00:00:00 2001 From: Eli Barzilay Date: Mon, 18 Jan 2010 06:08:24 +0000 Subject: [PATCH 007/113] update version numbers for the v4.2.4 release svn: r17711 --- src/mzscheme/src/schvers.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/mzscheme/src/schvers.h b/src/mzscheme/src/schvers.h index 8c43150e18..8881496a34 100644 --- a/src/mzscheme/src/schvers.h +++ b/src/mzscheme/src/schvers.h @@ -13,12 +13,12 @@ consistently.) */ -#define MZSCHEME_VERSION "4.2.3.12" +#define MZSCHEME_VERSION "4.2.4.1" #define MZSCHEME_VERSION_X 4 #define MZSCHEME_VERSION_Y 2 -#define MZSCHEME_VERSION_Z 3 -#define MZSCHEME_VERSION_W 12 +#define MZSCHEME_VERSION_Z 4 +#define MZSCHEME_VERSION_W 1 #define MZSCHEME_VERSION_MAJOR ((MZSCHEME_VERSION_X * 100) + MZSCHEME_VERSION_Y) #define MZSCHEME_VERSION_MINOR ((MZSCHEME_VERSION_Z * 1000) + MZSCHEME_VERSION_W) From d8b7906fd5e3087d32786b97dc83a06da4708742 Mon Sep 17 00:00:00 2001 From: Eli Barzilay Date: Mon, 18 Jan 2010 06:11:51 +0000 Subject: [PATCH 008/113] f9 build moves to f12 svn: r17713 --- collects/meta/dist-specs.ss | 1 + 1 file changed, 1 insertion(+) diff --git a/collects/meta/dist-specs.ss b/collects/meta/dist-specs.ss index da8a2722ab..b96401b67b 100644 --- a/collects/meta/dist-specs.ss +++ b/collects/meta/dist-specs.ss @@ -91,6 +91,7 @@ i386-linux-fc6 :=tag unix i386-linux-f7 :=tag unix x86_64-linux-f7 :=tag unix i386-linux-f9 :=tag unix +i386-linux-f12 :=tag unix i386-linux-debian :=tag unix i386-linux-debian-testing :=tag unix i386-linux-debian-unstable :=tag unix From a6231d88e9e0f79f5399cfc5d5278f04f4b844b6 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Tue, 19 Jan 2010 08:00:50 +0000 Subject: [PATCH 009/113] fix (#%variable-reference) in let-syntax RHS (PR 10696) svn: r17745 --- src/mzscheme/src/eval.c | 9 +++++---- src/mzscheme/src/module.c | 5 +++-- src/mzscheme/src/schpriv.h | 3 ++- src/mzscheme/src/syntax.c | 4 ++-- 4 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/mzscheme/src/eval.c b/src/mzscheme/src/eval.c index 71f314cc91..0c3fb115a4 100644 --- a/src/mzscheme/src/eval.c +++ b/src/mzscheme/src/eval.c @@ -9723,7 +9723,7 @@ static void *eval_k(void) v = scheme_eval_clone(v); rp = scheme_prefix_eval_clone(top->prefix); - save_runstack = scheme_push_prefix(env, top->prefix, NULL, NULL, 0, env->phase); + save_runstack = scheme_push_prefix(env, top->prefix, NULL, NULL, 0, env->phase, NULL); if (as_tail) { /* Cons up a closure to capture the prefix */ @@ -11031,7 +11031,8 @@ int scheme_prefix_depth(Resolve_Prefix *rp) Scheme_Object **scheme_push_prefix(Scheme_Env *genv, Resolve_Prefix *rp, Scheme_Object *src_modidx, Scheme_Object *now_modidx, - int src_phase, int now_phase) + int src_phase, int now_phase, + Scheme_Env *dummy_env) { Scheme_Object **rs_save, **rs, *v, **a; int i, j; @@ -11056,8 +11057,8 @@ Scheme_Object **scheme_push_prefix(Scheme_Env *genv, Resolve_Prefix *rp, for (i = 0; i < rp->num_toplevels; i++) { v = rp->toplevels[i]; - if (genv) - v = link_toplevel(rp->toplevels, i, genv, src_modidx, now_modidx); + if (genv || SCHEME_FALSEP(v)) + v = link_toplevel(rp->toplevels, i, genv ? genv : dummy_env, src_modidx, now_modidx); a[i] = v; } diff --git a/src/mzscheme/src/module.c b/src/mzscheme/src/module.c index 292cce7c68..119ec66cbb 100644 --- a/src/mzscheme/src/module.c +++ b/src/mzscheme/src/module.c @@ -4399,7 +4399,7 @@ void *scheme_module_run_finish(Scheme_Env *menv, Scheme_Env *env) save_runstack = scheme_push_prefix(menv, m->prefix, m->me->src_modidx, menv->link_midx, - 0, menv->phase); + 0, menv->phase, NULL); p = scheme_current_thread; save_phase_shift = p->current_phase_shift; @@ -4782,7 +4782,8 @@ static void eval_exptime(Scheme_Object *names, int count, save_runstack = scheme_push_prefix(genv, rp, (shift ? genv->module->me->src_modidx : NULL), (shift ? genv->link_midx : NULL), - 1, genv->phase); + 1, genv->phase, + NULL); if (is_simple_expr(expr)) { vals = _scheme_eval_linked_expr_multi_wp(expr, scheme_current_thread); diff --git a/src/mzscheme/src/schpriv.h b/src/mzscheme/src/schpriv.h index 661b4f4709..7558bb6cba 100644 --- a/src/mzscheme/src/schpriv.h +++ b/src/mzscheme/src/schpriv.h @@ -2584,7 +2584,8 @@ void scheme_shadow(Scheme_Env *env, Scheme_Object *n, int stxtoo); int scheme_prefix_depth(Resolve_Prefix *rp); Scheme_Object **scheme_push_prefix(Scheme_Env *genv, Resolve_Prefix *rp, Scheme_Object *src_modix, Scheme_Object *now_modix, - int src_phase, int now_phase); + int src_phase, int now_phase, + Scheme_Env *dummy_env); void scheme_pop_prefix(Scheme_Object **rs); Scheme_Object *scheme_eval_clone(Scheme_Object *expr); diff --git a/src/mzscheme/src/syntax.c b/src/mzscheme/src/syntax.c index e401745dd1..53f4c9f491 100644 --- a/src/mzscheme/src/syntax.c +++ b/src/mzscheme/src/syntax.c @@ -700,7 +700,7 @@ define_execute_with_dynamic_state(Scheme_Object *vec, int delta, int defmacro, if (dm_env) { scheme_prepare_exp_env(dm_env); - save_runstack = scheme_push_prefix(dm_env->exp_env, rp, NULL, NULL, 1, 1); + save_runstack = scheme_push_prefix(dm_env->exp_env, rp, NULL, NULL, 1, 1, NULL); vals = scheme_eval_linked_expr_multi_with_dynamic_state(vals_expr, dyn_state); if (defmacro == 2) dm_env = NULL; @@ -5850,7 +5850,7 @@ static Scheme_Object *eval_letmacro_rhs(Scheme_Object *a, Scheme_Comp_Env *rhs_e return (Scheme_Object *)scheme_enlarge_runstack(depth, eval_letmacro_rhs_k); } - save_runstack = scheme_push_prefix(NULL, rp, NULL, NULL, phase, phase); + save_runstack = scheme_push_prefix(NULL, rp, NULL, NULL, phase, phase, rhs_env->genv); if (scheme_omittable_expr(a, 1, -1, 0, NULL)) { /* short cut */ From a86337375daf003238f13def92b813766bb5f7b8 Mon Sep 17 00:00:00 2001 From: Eli Barzilay Date: Tue, 19 Jan 2010 08:50:22 +0000 Subject: [PATCH 010/113] Welcome to a new PLT day. svn: r17746 --- collects/repos-time-stamp/stamp.ss | 2 +- src/worksp/mred/mred.manifest | 2 +- src/worksp/mred/mred.rc | 8 ++++---- src/worksp/mzcom/mzcom.rc | 8 ++++---- src/worksp/mzcom/mzobj.rgs | 6 +++--- src/worksp/mzscheme/mzscheme.rc | 8 ++++---- src/worksp/starters/start.rc | 8 ++++---- 7 files changed, 21 insertions(+), 21 deletions(-) diff --git a/collects/repos-time-stamp/stamp.ss b/collects/repos-time-stamp/stamp.ss index 4b2ea25563..2ff3f3f8f5 100644 --- a/collects/repos-time-stamp/stamp.ss +++ b/collects/repos-time-stamp/stamp.ss @@ -1 +1 @@ -#lang scheme/base (provide stamp) (define stamp "17jan2010") +#lang scheme/base (provide stamp) (define stamp "19jan2010") diff --git a/src/worksp/mred/mred.manifest b/src/worksp/mred/mred.manifest index 0535c75591..6626ef2caf 100644 --- a/src/worksp/mred/mred.manifest +++ b/src/worksp/mred/mred.manifest @@ -1,7 +1,7 @@ Date: Tue, 19 Jan 2010 21:03:51 +0000 Subject: [PATCH 011/113] syntax/parse: fixed bugs (thanks samth) Please propagate this to the release branch. svn: r17756 --- collects/syntax/private/stxparse/rep.ss | 2 +- .../syntax/scribblings/parse-patterns.scrbl | 12 +++++++++ collects/tests/stxparse/stxclass.ss | 26 ++++++++++++++++--- 3 files changed, 35 insertions(+), 5 deletions(-) diff --git a/collects/syntax/private/stxparse/rep.ss b/collects/syntax/private/stxparse/rep.ss index e5d993b059..b0a31a43c3 100644 --- a/collects/syntax/private/stxparse/rep.ss +++ b/collects/syntax/private/stxparse/rep.ss @@ -973,7 +973,7 @@ (define (check-sc-expr x) (syntax-case x () [sc (identifier? #'sc) (list #'sc null)] - [(sc arg ...) (identifier? #'sc) (list #'sc #'(arg ...))] + [(sc arg ...) (identifier? #'sc) (list #'sc (syntax->list #'(arg ...)))] [_ (raise-syntax-error #f "expected syntax class use" ctx x)])) (syntax-case stx () [(rx sc) diff --git a/collects/syntax/scribblings/parse-patterns.scrbl b/collects/syntax/scribblings/parse-patterns.scrbl index 17a999542f..81cdceb011 100644 --- a/collects/syntax/scribblings/parse-patterns.scrbl +++ b/collects/syntax/scribblings/parse-patterns.scrbl @@ -104,6 +104,7 @@ means specifically @tech{@Spattern}. (~not S-pattern) #((unsyntax @svar[pattern-part]) ...) #s(prefab-struct-key (unsyntax @svar[pattern-part]) ...) + #&@#,svar[S-pattern] (~rest S-pattern) (@#,ref[~describe s] expr S-pattern) A-pattern] @@ -515,6 +516,17 @@ key and whose sequence of fields, when considered as a list, match the ] } +@specsubform[#&@#,svar[S-pattern]]{ + +Matches a term that is a box whose contents matches the inner +@tech{@Spattern}. + +@myexamples[ +(syntax-parse #'#&5 + [#&n:nat 'ok]) +] +} + @specsubform[(#, @defhere[~rest] S-pattern)]{ Matches just like @scheme[S-pattern]. The @scheme[~rest] pattern form diff --git a/collects/tests/stxparse/stxclass.ss b/collects/tests/stxparse/stxclass.ss index d88d7fc9d5..7f93ec1260 100644 --- a/collects/tests/stxparse/stxclass.ss +++ b/collects/tests/stxparse/stxclass.ss @@ -182,13 +182,31 @@ (syntax-parse #'(+) #:literals ([plus +]) [(plus) (void)]) -(define-syntax-class (nat> n) - #:description (format "nat > ~s" n) +(define-syntax-class (Nat> n) + #:description (format "Nat > ~s" n) (pattern x:nat #:fail-unless (> (syntax-e #'x) n) #f)) (syntax-parse #'(1 2 3) [(a:nat b0:nat c0:nat) #:with b #'b0 - #:declare b (nat> (syntax-e #'a)) + #:declare b (Nat> (syntax-e #'a)) #:with c #'c0 - #:declare c (nat> (syntax-e #'b0)) + #:declare c (Nat> (syntax-e #'b0)) (void)]) + +(define-syntax-class (nat> bound) + #:opaque + #:description (format "natural number greater than ~s" bound) + (pattern n:nat + #:when (> (syntax-e #'n) bound))) + +(define-conventions nat-convs + [N (nat> 0)]) + +(syntax-parse #'(5 4) #:conventions (nat-convs) + [(N ...) (void)]) + +(let/ec escape + (with-handlers ([exn? (compose escape void)]) + (syntax-parse #'(4 -1) #:conventions (nat-convs) + [(N ...) (void)])) + (error 'test-conv1 "didn't work")) From ef922d8e0d3d1c62ae0aa61e32bee192c922e471 Mon Sep 17 00:00:00 2001 From: Eli Barzilay Date: Wed, 20 Jan 2010 08:50:24 +0000 Subject: [PATCH 012/113] Welcome to a new PLT day. svn: r17758 --- collects/repos-time-stamp/stamp.ss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/collects/repos-time-stamp/stamp.ss b/collects/repos-time-stamp/stamp.ss index 2ff3f3f8f5..5b4439c3f6 100644 --- a/collects/repos-time-stamp/stamp.ss +++ b/collects/repos-time-stamp/stamp.ss @@ -1 +1 @@ -#lang scheme/base (provide stamp) (define stamp "19jan2010") +#lang scheme/base (provide stamp) (define stamp "20jan2010") From 6220900756ef7b6d574348a1b167043abd1f3309 Mon Sep 17 00:00:00 2001 From: Matthias Felleisen Date: Wed, 20 Jan 2010 09:30:31 +0000 Subject: [PATCH 013/113] porting guide, please propagate to release svn: r17759 --- .../teachpack/2htdp/scribblings/port.scrbl | 70 ++++++++++++------- .../2htdp/scribblings/universe.scrbl | 6 +- 2 files changed, 49 insertions(+), 27 deletions(-) diff --git a/collects/teachpack/2htdp/scribblings/port.scrbl b/collects/teachpack/2htdp/scribblings/port.scrbl index 05153b817e..2942665eb0 100644 --- a/collects/teachpack/2htdp/scribblings/port.scrbl +++ b/collects/teachpack/2htdp/scribblings/port.scrbl @@ -191,33 +191,55 @@ The most important change concerns the lines that launch the world program: the old names but shorter. -@;{ - -key events and mouse events are string: use key=? and mouse=? +The other big change concerns key event handling and mouse event + handling. The respective handlers no longer accept symbols and chars but + strings only. Here is the first key event handler from the documentation + of the world teachpack: -stuff from Todd: +@port[ +@schemeblock[ + (define (change w a-key-event) + (cond + [(key=? a-key-event 'left) + (world-go w -DELTA)] + [(key=? a-key-event 'right) + (world-go w +DELTA)] + [(char? a-key-event) + w] + [(key=? a-key-event 'up) + (world-go w -DELTA)] + [(key=? a-key-event 'down) + (world-go w +DELTA)] + [else + w]))] +@; --------------------------------- +@schemeblock[ + (define (change w a-key-event) + (cond + [(key=? a-key-event "left") + (world-go w -DELTA)] + [(key=? a-key-event "right") + (world-go w +DELTA)] + [(= (string-length a-key-event) 1) + w] + [(key=? a-key-event "up") + (world-go w -DELTA)] + [(key=? a-key-event "down") + (world-go w +DELTA)] + [else + w])) +]] + Note how the @scheme[char?] clause changed. Since all chars are now + represented as strings containing one ``letter'', the program on the right + just checks the length of the string. Otherwise, we simply change all + symbols into strings. -I'm not actually worried about me--I try to stay up to date, and I -teach three intro classes, so enough of my time is devoted to the HtDP -languages that I can stay on top of things. I'm worried about people -like Renee Ciezki in Arizona who pushes other teachers in her county -to use HtDP only to discover that the lessons she's given them to use -don't quite work anymore. At least she emails and asks what's going -on--I'm afraid other people just throw up their hands in frustration. - -And it's not just that one change to go from world to universe--key -events became strings instead of symbols, for example, and there are a -number of other small changes. Having a checklist that explains how to -get from X to Y would make the transition less complicated. - -Also, being unable to show previous student projects as examples is a -major downer. It's incredibly motivational to current students to see -what previous students have done. Porting five or six old projects to -the new version can eat up a couple of hours if you have to run them -and just correct errors. That's not horrible unless you don't have a -couple of hours to do it. -} +If you ever recorded your programs' work via an animated gif, you can still + do so. Instead of adding a fifth argument to @scheme[big-bang], however, + you will need to add a clause of the shape @scheme[(record? x)]. +Finally, the universe teachpack implements a richer functionality than the + world teachpack. @; ----------------------------------------------------------------------------- @section{Porting Image Programs} diff --git a/collects/teachpack/2htdp/scribblings/universe.scrbl b/collects/teachpack/2htdp/scribblings/universe.scrbl index 1c410660a4..a5d0d4d615 100644 --- a/collects/teachpack/2htdp/scribblings/universe.scrbl +++ b/collects/teachpack/2htdp/scribblings/universe.scrbl @@ -430,11 +430,11 @@ All @tech{MouseEvent}s are represented via strings: @item{ -@defproc[(stop-with [w (unsyntax @tech{WorldState})]) (stop-with (unsyntax @tech{WorldState}))]{signals to -DrScheme that the current world program should shut down. That is, any +@defstruct[stop-with ([w (unsyntax @tech{WorldState})])]{signals to +DrScheme that the world program should shut down. That is, any handler may return @scheme[(stop-with w)] provided @scheme[w] is a @tech{WorldState}. If it does, the state of the world becomes @scheme[w] -but @scheme[big-bang] will close down all event handling.} +and @scheme[big-bang] will close down all event handling.} } From 8f4853a3ae35e9c4799c9a798bad2cfcdfb2cd00 Mon Sep 17 00:00:00 2001 From: Jon Rafkind Date: Thu, 21 Jan 2010 00:06:21 +0000 Subject: [PATCH 014/113] replace ; with semicolon svn: r17760 --- collects/honu/main.ss | 5 +++-- collects/honu/private/honu-typed-scheme.ss | 19 +++++++++++++++---- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/collects/honu/main.ss b/collects/honu/main.ss index 4f4d51080f..da234767f7 100644 --- a/collects/honu/main.ss +++ b/collects/honu/main.ss @@ -4,13 +4,14 @@ "private/macro.ss") (provide (rename-out (#%dynamic-honu-module-begin #%module-begin) - (honu-top #%top)) + (honu-top #%top) + (semicolon \;) + ) #%datum true false display newline - \; else (rename-out (honu-if if) diff --git a/collects/honu/private/honu-typed-scheme.ss b/collects/honu/private/honu-typed-scheme.ss index bf7f30046b..853849731c 100644 --- a/collects/honu/private/honu-typed-scheme.ss +++ b/collects/honu/private/honu-typed-scheme.ss @@ -22,7 +22,8 @@ "this is a literal and cannot be used outside a macro")))) (define-literal honu-return) -(define-literal \;) +(define-literal semicolon) +(define-literal honu-+) ;; (define-syntax (\; stx) (raise-syntax-error '\; "out of context" stx)) @@ -338,6 +339,13 @@ [else (call-values parse-one (extract-until body (list #'\; )))])) +#| +(define-honu-macro (e ... * e ... \;)) + +(foo . bar ()) +x(2) +|# + (define (parse-block-one/2 stx context) (define (parse-one stx context) (define-syntax-class block @@ -353,10 +361,13 @@ [pattern (~seq e:expr (#%parens args ...)) #:with call #'(e args ...)]) (define-syntax-class expression - #:literals (\;) - [pattern (call:call \; . rest) #:with result #'call.call] - [pattern (x:number \; . rest) #:with result #'x] + [pattern (call:call semicolon . rest) #:with result #'call.call] + [pattern (x:number semicolon . rest) #:with result #'x] ) + #; + (define-syntax-class expression + #:literals (semicolon +) + [pattern (expression1)]) ;; (printf "~a\n" (syntax-class-parse function stx)) (syntax-parse stx [function:function (values #'function.result #'function.rest)] From 94f0edd8d20a13ff81435e32445e5c9a8552550d Mon Sep 17 00:00:00 2001 From: Jon Rafkind Date: Thu, 21 Jan 2010 00:19:23 +0000 Subject: [PATCH 015/113] parse + expressions svn: r17761 --- collects/honu/main.ss | 1 + collects/honu/private/honu-typed-scheme.ss | 24 +++++++++++++--------- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/collects/honu/main.ss b/collects/honu/main.ss index da234767f7..05694c6f6e 100644 --- a/collects/honu/main.ss +++ b/collects/honu/main.ss @@ -6,6 +6,7 @@ (provide (rename-out (#%dynamic-honu-module-begin #%module-begin) (honu-top #%top) (semicolon \;) + (honu-+ +) ) #%datum true diff --git a/collects/honu/private/honu-typed-scheme.ss b/collects/honu/private/honu-typed-scheme.ss index 853849731c..bf0855b899 100644 --- a/collects/honu/private/honu-typed-scheme.ss +++ b/collects/honu/private/honu-typed-scheme.ss @@ -358,20 +358,24 @@ x(2) (define-syntax-class expr [pattern f]) (define-splicing-syntax-class call - [pattern (~seq e:expr (#%parens args ...)) - #:with call #'(e args ...)]) - (define-syntax-class expression - [pattern (call:call semicolon . rest) #:with result #'call.call] - [pattern (x:number semicolon . rest) #:with result #'x] + [pattern (~seq e:expr (#%parens arg:expression)) + #:with call #'(e arg.result)]) + (define-splicing-syntax-class expression1 + [pattern (~seq call:call) #:with result #'call.call] + [pattern (~seq x:number) #:with result #'x] ) - #; - (define-syntax-class expression - #:literals (semicolon +) - [pattern (expression1)]) + (define-splicing-syntax-class expression + #:literals (semicolon honu-+) + [pattern (~seq exp-left:expression1 honu-+ exp-right:expression) + #:with result #'(+ exp-left.result exp-right.result)] + [pattern (~seq exp:expression1) #:with result #'exp.result]) + (define-syntax-class expression-top + [pattern (e:expression semicolon . rest) + #:with result #'e.result]) ;; (printf "~a\n" (syntax-class-parse function stx)) (syntax-parse stx [function:function (values #'function.result #'function.rest)] - [expr:expression (values #'expr.result #'expr.rest)] + [expr:expression-top (values #'expr.result #'expr.rest)] [(x:number . rest) (values #'x #'rest)] )) (cond From 21aab7e99c4b9df7aeb3cf91cc2d05e804046f39 Mon Sep 17 00:00:00 2001 From: Jon Rafkind Date: Thu, 21 Jan 2010 00:53:13 +0000 Subject: [PATCH 016/113] generalize infix operator definition svn: r17762 --- collects/honu/main.ss | 3 + collects/honu/private/honu-typed-scheme.ss | 73 ++++++++++++++++++---- 2 files changed, 65 insertions(+), 11 deletions(-) diff --git a/collects/honu/main.ss b/collects/honu/main.ss index 05694c6f6e..276d7b890a 100644 --- a/collects/honu/main.ss +++ b/collects/honu/main.ss @@ -7,6 +7,9 @@ (honu-top #%top) (semicolon \;) (honu-+ +) + (honu-* *) + (honu-/ /) + (honu-- -) ) #%datum true diff --git a/collects/honu/private/honu-typed-scheme.ss b/collects/honu/private/honu-typed-scheme.ss index bf0855b899..c29dd39234 100644 --- a/collects/honu/private/honu-typed-scheme.ss +++ b/collects/honu/private/honu-typed-scheme.ss @@ -12,18 +12,21 @@ ) ;; "typed-utils.ss" ) +(require (for-meta 2 scheme/base)) (provide (all-defined-out)) ;; macro for defining literal tokens that can be used in macros -(define-syntax-rule (define-literal name) - (define-syntax name (lambda (stx) +(define-syntax-rule (define-literal name ...) + (begin + (define-syntax name (lambda (stx) (raise-syntax-error 'name - "this is a literal and cannot be used outside a macro")))) + "this is a literal and cannot be used outside a macro"))) + ...)) (define-literal honu-return) (define-literal semicolon) -(define-literal honu-+) +(define-literal honu-+ honu-* honu-/ honu--) ;; (define-syntax (\; stx) (raise-syntax-error '\; "out of context" stx)) @@ -358,19 +361,67 @@ x(2) (define-syntax-class expr [pattern f]) (define-splicing-syntax-class call - [pattern (~seq e:expr (#%parens arg:expression)) + [pattern (~seq e:expr (#%parens arg:expression-1)) #:with call #'(e arg.result)]) - (define-splicing-syntax-class expression1 + (define-splicing-syntax-class expression-last [pattern (~seq call:call) #:with result #'call.call] [pattern (~seq x:number) #:with result #'x] ) - (define-splicing-syntax-class expression - #:literals (semicolon honu-+) - [pattern (~seq exp-left:expression1 honu-+ exp-right:expression) + (define-splicing-syntax-class expression-3 + [pattern (~seq e:expression-last) #:with result #'e.result]) + + (define-syntax (syntax-lambda stx) + (syntax-case stx () + [(_ (arg ...) body) + (with-syntax ([(temp ...) (generate-temporaries #'(arg ...))]) + #'(lambda (temp ...) + (with-syntax ([arg temp] ...) + body)))])) + + (define-syntax-rule (define-infix-operator name next [operator reducer] ...) + (define-splicing-syntax-class name + #:literals (operator ...) + [pattern (~seq (~var left next) operator (~var right name)) + #:with result (reducer #'left.result #'right.result)] + ... + [pattern (~seq (~var exp next)) + #:with result #'exp.result] + )) + + (define-infix-operator expression-2 expression-3 + [honu-* (syntax-lambda (left right) + #'(* left right))] + [honu-/ (syntax-lambda (left right) + #'(/ left right))]) + + #; + (define-splicing-syntax-class expression-2 + #:literals (honu-* honu-/) + [pattern (~seq exp-left:expression-3 honu-* exp-right:expression-2) + #:with result #'(* exp-left.result exp-right.result)] + [pattern (~seq exp-left:expression-3 honu-/ exp-right:expression-2) + #:with result #'(/ exp-left.result exp-right.result)] + [pattern (~seq exp:expression-3) #:with result #'exp.result]) + + + + (define-infix-operator expression-1 expression-2 + [honu-+ (syntax-lambda (left right) + #'(+ left right))] + [honu-- (syntax-lambda (left right) + #'(- left right))]) + + #; + (define-splicing-syntax-class expression-1 + #:literals (honu-+ honu--) + [pattern (~seq exp-left:expression-2 honu-+ exp-right:expression-1) #:with result #'(+ exp-left.result exp-right.result)] - [pattern (~seq exp:expression1) #:with result #'exp.result]) + [pattern (~seq exp-left:expression-2 honu-- exp-right:expression-1) + #:with result #'(- exp-left.result exp-right.result)] + [pattern (~seq exp:expression-2) #:with result #'exp.result]) + (define-syntax-class expression-top - [pattern (e:expression semicolon . rest) + [pattern (e:expression-1 semicolon . rest) #:with result #'e.result]) ;; (printf "~a\n" (syntax-class-parse function stx)) (syntax-parse stx From 25fb4d9ac0abe78812e314029aabb8f2319ab1e9 Mon Sep 17 00:00:00 2001 From: Eli Barzilay Date: Thu, 21 Jan 2010 08:50:36 +0000 Subject: [PATCH 017/113] Welcome to a new PLT day. svn: r17763 --- collects/repos-time-stamp/stamp.ss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/collects/repos-time-stamp/stamp.ss b/collects/repos-time-stamp/stamp.ss index 5b4439c3f6..7776ac5328 100644 --- a/collects/repos-time-stamp/stamp.ss +++ b/collects/repos-time-stamp/stamp.ss @@ -1 +1 @@ -#lang scheme/base (provide stamp) (define stamp "20jan2010") +#lang scheme/base (provide stamp) (define stamp "21jan2010") From 03368f8fc64c02f0e3a703f91b6ef8c94139a136 Mon Sep 17 00:00:00 2001 From: John Clements Date: Thu, 21 Jan 2010 18:34:43 +0000 Subject: [PATCH 018/113] added index for unsafe context term svn: r17764 --- collects/web-server/scribblings/stateless-usage.scrbl | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/collects/web-server/scribblings/stateless-usage.scrbl b/collects/web-server/scribblings/stateless-usage.scrbl index 85df06777f..5f8f1d9e04 100644 --- a/collects/web-server/scribblings/stateless-usage.scrbl +++ b/collects/web-server/scribblings/stateless-usage.scrbl @@ -51,7 +51,9 @@ because parameterizations are not serializable. Fourth, and related, this process only runs on your code, not on the code you @scheme[require]. Thus, your continuations---to be serializable---must not -be in the context of another module. For example, the following will not work: +be in the context of another module. For example, the following will fail with an @as-index{"unsafe context"} +exception: + @schemeblock[ (define requests (map (lambda (rg) (send/suspend/url rg)) From 178777234d8e1f0e235202cd4faeb36459003ed6 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Thu, 21 Jan 2010 18:51:08 +0000 Subject: [PATCH 019/113] notes on improving 2htdp/universe svn: r17766 --- collects/2htdp/universe.ss | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/collects/2htdp/universe.ss b/collects/2htdp/universe.ss index 4fd00f1823..2d41d5960c 100644 --- a/collects/2htdp/universe.ss +++ b/collects/2htdp/universe.ss @@ -1,6 +1,11 @@ #lang scheme/gui #| TODO: + -- yield instead of sync + -- run callbacks in user eventspace + -- make timer fire just once; restart after on-tick callback finishes + -- take out counting; replace by 0.25 delay + -- make window resizable :: why -- what if clauses are repeated in world and/or universe descriptions? -- what if the initial world or universe state is omitted? the error message is bad then. From b3b63bf25f68c6c436bb94283e3fb6471d55b4a7 Mon Sep 17 00:00:00 2001 From: Eli Barzilay Date: Fri, 22 Jan 2010 08:50:27 +0000 Subject: [PATCH 020/113] Welcome to a new PLT day. svn: r17769 --- collects/repos-time-stamp/stamp.ss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/collects/repos-time-stamp/stamp.ss b/collects/repos-time-stamp/stamp.ss index 7776ac5328..970a139c39 100644 --- a/collects/repos-time-stamp/stamp.ss +++ b/collects/repos-time-stamp/stamp.ss @@ -1 +1 @@ -#lang scheme/base (provide stamp) (define stamp "21jan2010") +#lang scheme/base (provide stamp) (define stamp "22jan2010") From 91e3bc001ffb0459c2c7a09d7105bebb7aacddc9 Mon Sep 17 00:00:00 2001 From: Jon Rafkind Date: Fri, 22 Jan 2010 19:55:02 +0000 Subject: [PATCH 021/113] use a macro for generating infix precedence table svn: r17770 --- collects/honu/private/honu-typed-scheme.ss | 74 ++++++++++++++++++---- collects/honu/private/util.ss | 1 - 2 files changed, 61 insertions(+), 14 deletions(-) diff --git a/collects/honu/private/honu-typed-scheme.ss b/collects/honu/private/honu-typed-scheme.ss index c29dd39234..2b25c0c9a0 100644 --- a/collects/honu/private/honu-typed-scheme.ss +++ b/collects/honu/private/honu-typed-scheme.ss @@ -6,13 +6,17 @@ syntax/name syntax/define syntax/parse + scheme/list "contexts.ss" "util.ss" "ops.ss" ) ;; "typed-utils.ss" ) -(require (for-meta 2 scheme/base)) +(require (for-meta 2 scheme/base + scheme/list + )) +(require (for-meta 3 scheme/base)) (provide (all-defined-out)) @@ -367,16 +371,18 @@ x(2) [pattern (~seq call:call) #:with result #'call.call] [pattern (~seq x:number) #:with result #'x] ) + + #; (define-splicing-syntax-class expression-3 [pattern (~seq e:expression-last) #:with result #'e.result]) (define-syntax (syntax-lambda stx) (syntax-case stx () - [(_ (arg ...) body) + [(_ (arg ...) body ...) (with-syntax ([(temp ...) (generate-temporaries #'(arg ...))]) #'(lambda (temp ...) (with-syntax ([arg temp] ...) - body)))])) + body ...)))])) (define-syntax-rule (define-infix-operator name next [operator reducer] ...) (define-splicing-syntax-class name @@ -388,6 +394,58 @@ x(2) #:with result #'exp.result] )) + (define (drop-last lst) + (take lst (sub1 (length lst)))) + + ;; TODO: maybe just have a precedence macro that creates all these constructs + ;; (infix-operators ([honu-* ...] + ;; [honu-- ...]) + ;; ([honu-+ ...] + ;; [honu-- ...])) + ;; Where operators defined higher in the table have higher precedence. + (define-syntax (infix-operators stx) + (define (drop-last lst) + (take lst (sub1 (length lst)))) + (define-syntax (syntax-lambda stx) + (syntax-case stx () + [(_ (arg ...) body ...) + (with-syntax ([(temp ...) (generate-temporaries #'(arg ...))]) + #'(lambda (temp ...) + (with-syntax ([arg temp] ...) + body ...)))])) + (define (create-stuff names operator-stuff) + (define make (syntax-lambda (expression next-expression operator-stuff) + #; + (printf "Make infix ~a ~a\n" (syntax->datum #'expression) (syntax->datum #'next-expression)) + (with-syntax ([(ops ...) #'operator-stuff]) + #'(define-infix-operator expression next-expression ops ...)))) + (for/list ([name1 (drop-last names)] + [name2 (cdr names)] + [operator operator-stuff]) + (make name1 name2 operator))) + (syntax-case stx () + [(_ first last operator-stuff ...) + (with-syntax ([(name ...) (generate-temporaries #'(operator-stuff ...))]) + (with-syntax ([(result ...) (create-stuff (cons #'first + (append + (drop-last (syntax->list #'(name ...))) + (list #'last))) + + (syntax->list #'(operator-stuff ...)))]) + #'(begin + result ...)))])) + + (infix-operators expression-1 expression-last + ([honu-+ (syntax-lambda (left right) + #'(+ left right))] + [honu-- (syntax-lambda (left right) + #'(- left right))]) + ([honu-* (syntax-lambda (left right) + #'(* left right))] + [honu-/ (syntax-lambda (left right) + #'(/ left right))])) + + #; (define-infix-operator expression-2 expression-3 [honu-* (syntax-lambda (left right) #'(* left right))] @@ -395,16 +453,6 @@ x(2) #'(/ left right))]) #; - (define-splicing-syntax-class expression-2 - #:literals (honu-* honu-/) - [pattern (~seq exp-left:expression-3 honu-* exp-right:expression-2) - #:with result #'(* exp-left.result exp-right.result)] - [pattern (~seq exp-left:expression-3 honu-/ exp-right:expression-2) - #:with result #'(/ exp-left.result exp-right.result)] - [pattern (~seq exp:expression-3) #:with result #'exp.result]) - - - (define-infix-operator expression-1 expression-2 [honu-+ (syntax-lambda (left right) #'(+ left right))] diff --git a/collects/honu/private/util.ss b/collects/honu/private/util.ss index fe11586a0f..08347691a0 100644 --- a/collects/honu/private/util.ss +++ b/collects/honu/private/util.ss @@ -1,6 +1,5 @@ #lang scheme - (provide delim-identifier=? extract-until call-values) From 3e4221b410590a930aa4fc8ed87e6b7dc469a904 Mon Sep 17 00:00:00 2001 From: Jon Rafkind Date: Fri, 22 Jan 2010 21:11:26 +0000 Subject: [PATCH 022/113] cleanup svn: r17771 --- collects/honu/private/honu-typed-scheme.ss | 88 +++++++--------------- collects/honu/private/util.ss | 19 ++++- 2 files changed, 46 insertions(+), 61 deletions(-) diff --git a/collects/honu/private/honu-typed-scheme.ss b/collects/honu/private/honu-typed-scheme.ss index 2b25c0c9a0..48c0fe5aff 100644 --- a/collects/honu/private/honu-typed-scheme.ss +++ b/collects/honu/private/honu-typed-scheme.ss @@ -6,16 +6,15 @@ syntax/name syntax/define syntax/parse - scheme/list + scheme/splicing "contexts.ss" "util.ss" "ops.ss" ) ;; "typed-utils.ss" ) -(require (for-meta 2 scheme/base - scheme/list - )) + +(require (for-meta 2 scheme/base "util.ss")) (require (for-meta 3 scheme/base)) (provide (all-defined-out)) @@ -364,6 +363,7 @@ x(2) body.result)]) (define-syntax-class expr [pattern f]) + (define-splicing-syntax-class call [pattern (~seq e:expr (#%parens arg:expression-1)) #:with call #'(e arg.result)]) @@ -372,18 +372,6 @@ x(2) [pattern (~seq x:number) #:with result #'x] ) - #; - (define-splicing-syntax-class expression-3 - [pattern (~seq e:expression-last) #:with result #'e.result]) - - (define-syntax (syntax-lambda stx) - (syntax-case stx () - [(_ (arg ...) body ...) - (with-syntax ([(temp ...) (generate-temporaries #'(arg ...))]) - #'(lambda (temp ...) - (with-syntax ([arg temp] ...) - body ...)))])) - (define-syntax-rule (define-infix-operator name next [operator reducer] ...) (define-splicing-syntax-class name #:literals (operator ...) @@ -394,9 +382,6 @@ x(2) #:with result #'exp.result] )) - (define (drop-last lst) - (take lst (sub1 (length lst)))) - ;; TODO: maybe just have a precedence macro that creates all these constructs ;; (infix-operators ([honu-* ...] ;; [honu-- ...]) @@ -404,15 +389,6 @@ x(2) ;; [honu-- ...])) ;; Where operators defined higher in the table have higher precedence. (define-syntax (infix-operators stx) - (define (drop-last lst) - (take lst (sub1 (length lst)))) - (define-syntax (syntax-lambda stx) - (syntax-case stx () - [(_ (arg ...) body ...) - (with-syntax ([(temp ...) (generate-temporaries #'(arg ...))]) - #'(lambda (temp ...) - (with-syntax ([arg temp] ...) - body ...)))])) (define (create-stuff names operator-stuff) (define make (syntax-lambda (expression next-expression operator-stuff) #; @@ -434,43 +410,35 @@ x(2) (syntax->list #'(operator-stuff ...)))]) #'(begin result ...)))])) - + + #; (infix-operators expression-1 expression-last - ([honu-+ (syntax-lambda (left right) - #'(+ left right))] - [honu-- (syntax-lambda (left right) - #'(- left right))]) - ([honu-* (syntax-lambda (left right) - #'(* left right))] - [honu-/ (syntax-lambda (left right) - #'(/ left right))])) - - #; - (define-infix-operator expression-2 expression-3 - [honu-* (syntax-lambda (left right) - #'(* left right))] - [honu-/ (syntax-lambda (left right) - #'(/ left right))]) - - #; - (define-infix-operator expression-1 expression-2 - [honu-+ (syntax-lambda (left right) - #'(+ left right))] - [honu-- (syntax-lambda (left right) - #'(- left right))]) - - #; - (define-splicing-syntax-class expression-1 - #:literals (honu-+ honu--) - [pattern (~seq exp-left:expression-2 honu-+ exp-right:expression-1) - #:with result #'(+ exp-left.result exp-right.result)] - [pattern (~seq exp-left:expression-2 honu-- exp-right:expression-1) - #:with result #'(- exp-left.result exp-right.result)] - [pattern (~seq exp:expression-2) #:with result #'exp.result]) + ([honu-+ (syntax-lambda (left right) + #'(+ left right))] + [honu-- (syntax-lambda (left right) + #'(- left right))]) + ([honu-* (syntax-lambda (left right) + #'(* left right))] + [honu-/ (syntax-lambda (left right) + #'(/ left right))])) + (define-syntax-class expression-top [pattern (e:expression-1 semicolon . rest) #:with result #'e.result]) + + + (splicing-let-syntax ([sl (make-rename-transformer #'syntax-lambda)]) + (infix-operators expression-1 expression-last + ([honu-+ (sl (left right) + #'(+ left right))] + [honu-- (sl (left right) + #'(- left right))]) + ([honu-* (sl (left right) + #'(* left right))] + [honu-/ (sl (left right) + #'(/ left right))]))) + ;; (printf "~a\n" (syntax-class-parse function stx)) (syntax-parse stx [function:function (values #'function.result #'function.rest)] diff --git a/collects/honu/private/util.ss b/collects/honu/private/util.ss index 08347691a0..5120dd3cfa 100644 --- a/collects/honu/private/util.ss +++ b/collects/honu/private/util.ss @@ -1,10 +1,14 @@ #lang scheme +(provide (except-out (all-defined-out) test)) + +#; (provide delim-identifier=? extract-until call-values) -(require syntax/stx) +(require syntax/stx + scheme/list) (define (delim-identifier=? a b) (eq? (syntax-e a) (syntax-e b))) @@ -32,6 +36,19 @@ (define-syntax-rule (call-values function values-producing) (call-with-values (lambda () values-producing) function)) +;; shortcut for treating arguments as syntax objects +(define-syntax (syntax-lambda stx) + (syntax-case stx () + [(_ (arg ...) body ...) + (with-syntax ([(temp ...) (generate-temporaries #'(arg ...))]) + #'(lambda (temp ...) + (with-syntax ([arg temp] ...) + body ...)))])) + +;; removes the last element of a list +(define (drop-last lst) + (take lst (sub1 (length lst)))) + (define (test) (let* ([original #'(a b c d e)] [delimiter #'c] From e0fff18e683a03ac634ea0272721c18405dec4d1 Mon Sep 17 00:00:00 2001 From: Kevin Tew Date: Fri, 22 Jan 2010 21:17:21 +0000 Subject: [PATCH 023/113] don't use stdout for cstartup generation svn: r17772 --- src/mzscheme/Makefile.in | 3 +-- src/mzscheme/src/sstoinc.ss | 15 +++++++++------ 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/mzscheme/Makefile.in b/src/mzscheme/Makefile.in index 97d3fbe380..f9d7425895 100644 --- a/src/mzscheme/Makefile.in +++ b/src/mzscheme/Makefile.in @@ -221,8 +221,7 @@ $(collectsdir)/scheme/private/kernstruct.ss: $(srcdir)/src/makeexn $(srcdir)/src/$(CSTARTUPDEST): $(srcdir)/src/startup.ss $(srcdir)/src/schvers.h $(srcdir)/src/schminc.h - ./mzscheme@CGC@ -cqu $(srcdir)/src/sstoinc.ss $(CSTARTUPEXTRA) < $(srcdir)/src/startup.ss > $(srcdir)/src/$(CSTARTUPDEST) - + ./mzscheme@CGC@ -cqu $(srcdir)/src/sstoinc.ss $(CSTARTUPEXTRA) $(srcdir)/src/$(CSTARTUPDEST) < $(srcdir)/src/startup.ss $(srcdir)/src/mzmark.c: $(srcdir)/src/mzmarksrc.c $(srcdir)/src/mkmark.ss mzscheme -cu $(srcdir)/src/mkmark.ss < $(srcdir)/src/mzmarksrc.c > $(srcdir)/src/mzmark.c diff --git a/src/mzscheme/src/sstoinc.ss b/src/mzscheme/src/sstoinc.ss index 15dacd12a3..d29cb79c92 100644 --- a/src/mzscheme/src/sstoinc.ss +++ b/src/mzscheme/src/sstoinc.ss @@ -7,6 +7,9 @@ (namespace-require ''#%kernel) +(call-with-output-file (vector-ref (current-command-line-arguments) 0) #:exists 'replace + (lambda (outfile) + (let loop () (let ([expr (read)]) (unless (eof-object? expr) @@ -14,17 +17,17 @@ [p (open-output-bytes)]) (write c p) (let ([s (get-output-bytes p)]) - (printf " {~n SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {") + (fprintf outfile " {~n SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {") (let loop ([chars (bytes->list s)][pos 0]) (unless (null? chars) (let ([char (car chars)]) - (printf "~a," char)) + (fprintf outfile "~a," char)) (loop (cdr chars) (if (= pos DIGS-PER-LINE) (begin - (newline) + (newline outfile) 0) (add1 pos))))) - (printf "0};~n EVAL_ONE_SIZED_STR((char *)expr, ~a);~n" (bytes-length s)) - (printf " }~n"))) - (loop)))) + (fprintf outfile "0};~n EVAL_ONE_SIZED_STR((char *)expr, ~a);~n" (bytes-length s)) + (fprintf outfile " }~n"))) + (loop)))))) From bee5af120b09d3056768ba214a9b80e46bf61ef8 Mon Sep 17 00:00:00 2001 From: Jon Rafkind Date: Fri, 22 Jan 2010 22:14:28 +0000 Subject: [PATCH 024/113] add more operators svn: r17773 --- collects/honu/private/honu-typed-scheme.ss | 43 +++++++++++++++++----- 1 file changed, 33 insertions(+), 10 deletions(-) diff --git a/collects/honu/private/honu-typed-scheme.ss b/collects/honu/private/honu-typed-scheme.ss index 48c0fe5aff..1c767b9618 100644 --- a/collects/honu/private/honu-typed-scheme.ss +++ b/collects/honu/private/honu-typed-scheme.ss @@ -29,7 +29,10 @@ (define-literal honu-return) (define-literal semicolon) -(define-literal honu-+ honu-* honu-/ honu--) +(define-literal honu-+ honu-* honu-/ honu-- honu-|| honu-% + honu-= honu-+= honu--= honu-*= honu-/= honu-%= + honu-&= honu-^= honu-\|= honu-<<= honu->>= honu->>>= + honu->> honu-<< honu->>> honu-< honu-> honu-<= honu->=) ;; (define-syntax (\; stx) (raise-syntax-error '\; "out of context" stx)) @@ -428,16 +431,36 @@ x(2) #:with result #'e.result]) + ;; infix operators in the appropriate precedence level + ;; things defined lower in the table have a higher precedence. + ;; the first set of operators is `expression-1' (splicing-let-syntax ([sl (make-rename-transformer #'syntax-lambda)]) - (infix-operators expression-1 expression-last - ([honu-+ (sl (left right) - #'(+ left right))] - [honu-- (sl (left right) - #'(- left right))]) - ([honu-* (sl (left right) - #'(* left right))] - [honu-/ (sl (left right) - #'(/ left right))]))) + (infix-operators expression-1 expression-last + ([honu-= (sl (left right) #'(= left right))] + [honu-+= (sl (left right) #'(+ left right))] + [honu--= (sl (left right) #'(- left right))] + [honu-*= (sl (left right) #'(* left right))] + [honu-/= (sl (left right) #'(/ left right))] + [honu-%= (sl (left right) #'(modulo left right))] + [honu-&= (sl (left right) #'(+ left right))] + [honu-^= (sl (left right) #'(+ left right))] + [honu-\|= (sl (left right) #'(+ left right))] + [honu-<<= (sl (left right) #'(+ left right))] + [honu->>= (sl (left right) #'(+ left right))] + [honu->>>= (sl (left right) #'(+ left right))]) + ([honu-|| (sl (left right) #'(+ left right))]) + ([honu->> (sl (left right) #'(+ left right))] + [honu-<< (sl (left right) #'(+ left right))] + [honu->>> (sl (left right) #'(+ left right))] + [honu-< (sl (left right) #'(< left right))] + [honu-> (sl (left right) #'(> left right))] + [honu-<= (sl (left right) #'(<= left right))] + [honu->= (sl (left right) #'(>= left right))]) + ([honu-+ (sl (left right) #'(+ left right))] + [honu-- (sl (left right) #'(- left right))]) + ([honu-* (sl (left right) #'(* left right))] + [honu-% (sl (left right) #'(modulo left right))] + [honu-/ (sl (left right) #'(/ left right))]))) ;; (printf "~a\n" (syntax-class-parse function stx)) (syntax-parse stx From a6c1b9256e43d837870617c932a028ccaf9bfe0e Mon Sep 17 00:00:00 2001 From: Kevin Tew Date: Fri, 22 Jan 2010 23:32:32 +0000 Subject: [PATCH 025/113] Places added place local module path table for uninterned symbols svn: r17774 --- src/mzscheme/include/schthread.h | 2 ++ src/mzscheme/src/module.c | 33 ++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/src/mzscheme/include/schthread.h b/src/mzscheme/include/schthread.h index 5d53e414b8..1426d83959 100644 --- a/src/mzscheme/include/schthread.h +++ b/src/mzscheme/include/schthread.h @@ -260,6 +260,7 @@ typedef struct Thread_Local_Variables { int gensym_counter_; Scheme_Object *dummy_input_port_; Scheme_Object *dummy_output_port_; + Scheme_Bucket_Table *place_local_modpath_table_; /*KPLAKE1*/ } Thread_Local_Variables; @@ -505,6 +506,7 @@ XFORM_GC_VARIABLE_STACK_THROUGH_THREAD_LOCAL; #define gensym_counter XOA (scheme_get_thread_local_variables()->gensym_counter_) #define dummy_input_port XOA (scheme_get_thread_local_variables()->dummy_input_port_) #define dummy_output_port XOA (scheme_get_thread_local_variables()->dummy_output_port_) +#define place_local_modpath_table XOA (scheme_get_thread_local_variables()->place_local_modpath_table_) /*KPLAKE2*/ /* **************************************** */ diff --git a/src/mzscheme/src/module.c b/src/mzscheme/src/module.c index 119ec66cbb..f8f526d521 100644 --- a/src/mzscheme/src/module.c +++ b/src/mzscheme/src/module.c @@ -199,6 +199,9 @@ READ_ONLY static Scheme_Object *empty_self_modidx; READ_ONLY static Scheme_Object *empty_self_modname; THREAD_LOCAL_DECL(static Scheme_Bucket_Table *starts_table); +#if defined(MZ_USE_PLACES) && defined(MZ_PRECISE_GC) +THREAD_LOCAL_DECL(static Scheme_Bucket_Table *place_local_modpath_table); +#endif /* FIXME eventually theses initial objects should be shared, but work required */ THREAD_LOCAL_DECL(static Scheme_Env *initial_modules_env); @@ -408,6 +411,10 @@ void scheme_init_module_resolver(void) REGISTER_SO(starts_table); starts_table = scheme_make_weak_equal_table(); +#if defined(MZ_USE_PLACES) && defined(MZ_PRECISE_GC) + REGISTER_SO(place_local_modpath_table); + place_local_modpath_table = scheme_make_weak_equal_table(); +#endif config = scheme_current_config(); @@ -2870,10 +2877,36 @@ Scheme_Object *scheme_intern_resolved_module_path_worker(Scheme_Object *o) return return_value; } +#if defined(MZ_USE_PLACES) && defined(MZ_PRECISE_GC) +static Scheme_Object *scheme_intern_local_resolved_module_path_worker(Scheme_Object *o) +{ + Scheme_Object *rmp; + Scheme_Bucket *b; + Scheme_Object *return_value; + + rmp = scheme_alloc_small_object(); + rmp->type = scheme_resolved_module_path_type; + SCHEME_PTR_VAL(rmp) = o; + + scheme_start_atomic(); + b = scheme_bucket_from_table(place_local_modpath_table, (const char *)rmp); + scheme_end_atomic_no_swap(); + if (!b->val) + b->val = scheme_true; + + return_value = (Scheme_Object *)HT_EXTRACT_WEAK(b->key); + + return return_value; +} +#endif + Scheme_Object *scheme_intern_resolved_module_path(Scheme_Object *o) { #if defined(MZ_USE_PLACES) && defined(MZ_PRECISE_GC) void *return_payload; + if (SCHEME_SYMBOLP(o) && SCHEME_SYM_UNINTERNEDP(o)) { + return scheme_intern_local_resolved_module_path_worker(o); + } return_payload = scheme_master_fast_path(1, o); return (Scheme_Object*) return_payload; #endif From 57868b0bc79eb569214f54e13c188b3f8ccbd952 Mon Sep 17 00:00:00 2001 From: Eli Barzilay Date: Sat, 23 Jan 2010 08:50:40 +0000 Subject: [PATCH 026/113] Welcome to a new PLT day. svn: r17775 --- collects/repos-time-stamp/stamp.ss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/collects/repos-time-stamp/stamp.ss b/collects/repos-time-stamp/stamp.ss index 970a139c39..df4650e6ca 100644 --- a/collects/repos-time-stamp/stamp.ss +++ b/collects/repos-time-stamp/stamp.ss @@ -1 +1 @@ -#lang scheme/base (provide stamp) (define stamp "22jan2010") +#lang scheme/base (provide stamp) (define stamp "23jan2010") From b5138ffbe46f90a705df078090252e4e8cc755d4 Mon Sep 17 00:00:00 2001 From: Robby Findler Date: Sat, 23 Jan 2010 16:00:10 +0000 Subject: [PATCH 027/113] svn: r17776 --- doc/release-notes/drscheme/HISTORY.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/release-notes/drscheme/HISTORY.txt b/doc/release-notes/drscheme/HISTORY.txt index 1985a6ce75..070dbe5653 100644 --- a/doc/release-notes/drscheme/HISTORY.txt +++ b/doc/release-notes/drscheme/HISTORY.txt @@ -17,6 +17,7 @@ ------------------------------ . minor bug fixes + . added first draft of the 2htdp/image library ------------------------------ Version 4.2.2 From 5dfed472c75fd4842bbbae91c6ee5bb96897d608 Mon Sep 17 00:00:00 2001 From: Robby Findler Date: Sat, 23 Jan 2010 16:03:50 +0000 Subject: [PATCH 028/113] svn: r17777 --- collects/tests/drscheme/README.ss | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/collects/tests/drscheme/README.ss b/collects/tests/drscheme/README.ss index 6b7ff39f55..004199c8a5 100644 --- a/collects/tests/drscheme/README.ss +++ b/collects/tests/drscheme/README.ss @@ -8,11 +8,12 @@ load run-test.ss. It will return a function that accepts the names of tests. Those names must be listed here. If no arguments are passed to the function, all tests will be run. -|# stepper-test.ss #| + stepper-test.ss runs the stepper on the sample solutions and checks the results. - + (this test suite is not being maintained) + |# io.ss #| This tests the drscheme's io implementation. From ebb815cc68f87f601a9577fde9e4bbaa1e487082 Mon Sep 17 00:00:00 2001 From: Robby Findler Date: Sat, 23 Jan 2010 16:43:08 +0000 Subject: [PATCH 029/113] added a comment to describe all-string-snips svn: r17778 --- collects/framework/private/text.ss | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/collects/framework/private/text.ss b/collects/framework/private/text.ss index c531f0bfb3..8f3f76e4c4 100644 --- a/collects/framework/private/text.ss +++ b/collects/framework/private/text.ss @@ -1758,6 +1758,9 @@ WARNING: printf is rebound in the body of the unit to always (define clever-file-format-mixin (mixin ((class->interface text%)) (clever-file-format<%>) (inherit get-file-format set-file-format find-first-snip) + + ;; all-string-snips : -> boolean + ;; returns #t when it is safe to save this file in 'text mode. (define/private (all-string-snips) (let loop ([s (find-first-snip)]) (cond @@ -1765,6 +1768,7 @@ WARNING: printf is rebound in the body of the unit to always [(is-a? s string-snip%) (loop (send s next))] [else #f]))) + (define/augment (on-save-file name format) (let ([all-strings? (all-string-snips)]) (cond From 69482b3ceb2ca6f6f896889dcb82bba6feb0945b Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Sat, 23 Jan 2010 16:51:24 +0000 Subject: [PATCH 030/113] updated mz & mr notes for 4.2.4 (merge to 4.2.4) svn: r17779 --- doc/release-notes/mred/HISTORY.txt | 6 ++++++ doc/release-notes/mzscheme/HISTORY.txt | 25 +++++-------------------- 2 files changed, 11 insertions(+), 20 deletions(-) diff --git a/doc/release-notes/mred/HISTORY.txt b/doc/release-notes/mred/HISTORY.txt index 4675ac45d7..cd20d38c70 100644 --- a/doc/release-notes/mred/HISTORY.txt +++ b/doc/release-notes/mred/HISTORY.txt @@ -1,3 +1,9 @@ +Version 4.2.4, January 2010 + +Minor bug fixes + +---------------------------------------------------------------------- + Version 4.2.3, November 2009 Minor bug fixes diff --git a/doc/release-notes/mzscheme/HISTORY.txt b/doc/release-notes/mzscheme/HISTORY.txt index dbd1aa21cb..6c5c211139 100644 --- a/doc/release-notes/mzscheme/HISTORY.txt +++ b/doc/release-notes/mzscheme/HISTORY.txt @@ -1,26 +1,11 @@ -Version 4.2.3.12 -Added module->imports and module->exports - -Version 4.2.3.10 -Added more fl and fx operations - -Version 4.2.3.8 -Added scheme/flonum; moved flvector operations to scheme/flonum - -Version 4.2.3.6 +Version 4.2.4, January 2010 +Added scheme/flonum and scheme/fixnum +Extended scheme/unsafe/ops Changed JIT to support unboxed local binding of known-flonum arguments to unsafe-fl functions -Added unsafe-flsqrt - -Version 4.2.3.5 -Added #:save-errno option for foreign-function types - -Version 4.2.3.4 -Added flvectors - -Version 4.2.3.3 -Added unsafe-f64vector-ref and unsafe-f64vector-set! Changed JIT to inline numeric ops with more than 2 arguments +Added #:save-errno option for foreign-function types +Added module->imports and module->exports Version 4.2.3, November 2009 Changed _pointer (in scheme/foreign) to mean a pointer that does not From 3c1d7e9acad060f9dab7b62f1a9c46d39355a31d Mon Sep 17 00:00:00 2001 From: Robby Findler Date: Sat, 23 Jan 2010 20:36:54 +0000 Subject: [PATCH 031/113] simple fix to deal with performance problem noticed by jpr (this is not a complete fix, but should work in the common case of lots of repeated place-image calls) svn: r17783 --- collects/mrlib/image-core.ss | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/collects/mrlib/image-core.ss b/collects/mrlib/image-core.ss index ceee10e07c..96f65a87f0 100644 --- a/collects/mrlib/image-core.ss +++ b/collects/mrlib/image-core.ss @@ -387,7 +387,16 @@ has been moved out). (let loop ([crops crops]) (cond [(null? crops) shape] - [else (make-crop (car crops) (loop (cdr crops)))]))) + [(null? (cdr crops)) + (make-crop (car crops) shape)] + [else + (let ([fst (car crops)] + [snd (cadr crops)]) + (cond + [(equal? fst snd) + (loop (cdr crops))] + [else + (make-crop (car crops) (loop (cdr crops)))]))]))) (cond [(translate? shape) (loop (translate-shape shape) From bfa543bd11401b6fe398fa7f406a722daae65569 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Sat, 23 Jan 2010 22:37:07 +0000 Subject: [PATCH 032/113] fix problem initializing tail buffer; fix JIT checking of unsafe-f{l,64}vector-ref unboxing; fix error message for unbound variables (merge to 4.2.4) svn: r17788 --- src/mzscheme/src/eval.c | 8 +++++--- src/mzscheme/src/jit.c | 5 +++-- src/mzscheme/src/thread.c | 3 +++ 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/mzscheme/src/eval.c b/src/mzscheme/src/eval.c index 0c3fb115a4..6c88404a6f 100644 --- a/src/mzscheme/src/eval.c +++ b/src/mzscheme/src/eval.c @@ -6994,7 +6994,7 @@ static Scheme_Object *check_top(const char *when, Scheme_Object *form, Scheme_Co if (bad || !scheme_lookup_in_table(env->genv->toplevel, (const char *)SCHEME_STX_SYM(c))) { GC_CAN_IGNORE const char *reason; if (env->genv->phase == 1) { - reason = "unbound identifier in module (transformer environment)"; + reason = "unbound identifier in module (in phase 1, transformer environment)"; /* Check in the run-time environment */ if (scheme_lookup_in_table(env->genv->template_env->toplevel, (const char *)SCHEME_STX_SYM(c))) { reason = ("unbound identifier in module (in the transformer environment, which does" @@ -7004,9 +7004,11 @@ static Scheme_Object *check_top(const char *when, Scheme_Object *form, Scheme_Co reason = ("unbound identifier in module (in the transformer environment, which does" " not include the macro definition that is visible to run-time expressions)"); } - } else + } else if (env->genv->phase == 0) reason = "unbound identifier in module"; - scheme_wrong_syntax(when, NULL, c, reason); + else + reason = "unbound identifier in module (in phase %d)"; + scheme_wrong_syntax(when, NULL, c, reason, env->genv->phase); } } } diff --git a/src/mzscheme/src/jit.c b/src/mzscheme/src/jit.c index edfa649a1a..54d941fb42 100644 --- a/src/mzscheme/src/jit.c +++ b/src/mzscheme/src/jit.c @@ -4217,8 +4217,9 @@ static int can_unbox_inline(Scheme_Object *obj, int fuel, int regs, int unsafely Scheme_App3_Rec *app = (Scheme_App3_Rec *)obj; if (!is_inline_unboxable_op(app->rator, SCHEME_PRIM_IS_BINARY_INLINED, unsafely, 0)) return 0; - if (IS_NAMED_PRIM(app->rator, "unsafe-f64vector-ref") - || IS_NAMED_PRIM(app->rator, "unsafe-flvector-ref")) { + if ((SCHEME_PRIM_PROC_FLAGS(app->rator) & SCHEME_PRIM_IS_BINARY_INLINED) + && (IS_NAMED_PRIM(app->rator, "unsafe-f64vector-ref") + || IS_NAMED_PRIM(app->rator, "unsafe-flvector-ref"))) { if (is_unboxing_immediate(app->rand1, 1) && is_unboxing_immediate(app->rand1, 2)) { return 1; diff --git a/src/mzscheme/src/thread.c b/src/mzscheme/src/thread.c index 50376edce3..db2bde86dc 100644 --- a/src/mzscheme/src/thread.c +++ b/src/mzscheme/src/thread.c @@ -2296,6 +2296,9 @@ static Scheme_Thread *make_thread(Scheme_Config *config, scheme_first_thread = process; } + if (!buffer_init_size) /* => before place init */ + buffer_init_size = INIT_TB_SIZE; + { Scheme_Object **tb; tb = MALLOC_N(Scheme_Object *, buffer_init_size); From 5f9a77488058e027e2003eb171e53068f5755659 Mon Sep 17 00:00:00 2001 From: Robby Findler Date: Sat, 23 Jan 2010 23:07:34 +0000 Subject: [PATCH 033/113] fixed error message reporting bugs (merge to release branch) svn: r17790 --- collects/2htdp/private/image-more.ss | 2 +- collects/2htdp/private/img-err.ss | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/collects/2htdp/private/image-more.ss b/collects/2htdp/private/image-more.ss index 4af533fb28..291d358e6f 100644 --- a/collects/2htdp/private/image-more.ss +++ b/collects/2htdp/private/image-more.ss @@ -117,7 +117,7 @@ (overlay/internal 'middle 'middle image (cons image2 image3))) ;; underlay : image image image ... -> image -(define (underlay image image2 . image3) +(define/chk (underlay image image2 . image3) (let ([imgs (reverse (list* image image2 image3))]) (overlay/internal 'middle 'middle (car imgs) (cdr imgs)))) diff --git a/collects/2htdp/private/img-err.ss b/collects/2htdp/private/img-err.ss index 2b072c8ac7..78ed2ca40e 100644 --- a/collects/2htdp/private/img-err.ss +++ b/collects/2htdp/private/img-err.ss @@ -49,7 +49,7 @@ [(define/chk (fn-name args ... . final-arg) body ...) (identifier? #'final-arg) (let ([len (length (syntax->list #'(args ...)))]) - (with-syntax ([(i ...) (build-list len values)]) + (with-syntax ([(i ...) (build-list len add1)]) #`(define (fn-name args ... . final-arg) (let ([args (check/normalize 'fn-name 'args args i)] ... [final-arg (map/i (λ (x j) (check/normalize 'fn-name 'final-arg x (+ #,len j))) From c0cea4817088477496a8f1392539d429f23b6465 Mon Sep 17 00:00:00 2001 From: Robby Findler Date: Sun, 24 Jan 2010 02:02:56 +0000 Subject: [PATCH 034/113] random testing found bugs (please include in release) svn: r17792 --- collects/2htdp/private/image-more.ss | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/collects/2htdp/private/image-more.ss b/collects/2htdp/private/image-more.ss index 291d358e6f..d97cd4c798 100644 --- a/collects/2htdp/private/image-more.ss +++ b/collects/2htdp/private/image-more.ss @@ -367,7 +367,7 @@ (cond [(overlay? shape) (let ([top-shape (rotate-normalized-shape angle (overlay-top shape))] - [bottom-shape (rotate-simple angle (overlay-bottom shape))]) + [bottom-shape (rotate-cropped-simple angle (overlay-bottom shape))]) (make-overlay top-shape bottom-shape))] [else (rotate-cropped-simple angle shape)])) @@ -430,7 +430,7 @@ (cond [(overlay? shape) (let ([top-ltrb (normalized-shape-bb (overlay-top shape))] - [bottom-ltrb (simple-bb (overlay-bottom shape))]) + [bottom-ltrb (cropped-simple-bb (overlay-bottom shape))]) (union-ltrb top-ltrb bottom-ltrb))] [else (cropped-simple-bb shape)])) From ba18a93fa6a712b6c1e8208735ff90219de5e519 Mon Sep 17 00:00:00 2001 From: John Clements Date: Sun, 24 Jan 2010 07:01:25 +0000 Subject: [PATCH 035/113] fixed bug involving certificates appearing in different places svn: r17793 --- collects/stepper/private/annotate.ss | 64 ++++++++++++++-------------- collects/stepper/private/shared.ss | 4 +- 2 files changed, 35 insertions(+), 33 deletions(-) diff --git a/collects/stepper/private/annotate.ss b/collects/stepper/private/annotate.ss index 0ba963bdc5..c729133e38 100644 --- a/collects/stepper/private/annotate.ss +++ b/collects/stepper/private/annotate.ss @@ -18,6 +18,7 @@ [(_ body bindings) (syntax/loc stx (letrec bindings body))])) + ; CONTRACTS @@ -215,7 +216,7 @@ (stepper-syntax-property #`(#%plain-app #,put-into-xml-table #,rewritten) 'stepper-skipto (list syntax-e cdr car)) - (syntax-recertify rewritten stx (current-code-inspector) #f)))))) + (stepper-recertify rewritten stx)))))) ; @@ -769,7 +770,7 @@ (let*-2vals ([(new-exp bindings) vals]) (2vals (stepper-recertify new-exp exp) (map (lambda (b) - (syntax-recertify b exp (current-code-inspector) #f)) + (stepper-recertify b exp)) bindings))))] ;; this is a terrible hack... until some other language form needs it. It wraps the @@ -1094,10 +1095,6 @@ [else (error 'annotate "unexpected syntax for expression: ~v" (syntax->datum exp))]))))]))) - (define (stepper-recertify new-stx old-stx) - (syntax-recertify new-stx old-stx (current-code-inspector) #f)) - - ;; annotate/top-level : syntax-> syntax ;; expansion of teaching level language programs produces two kinds of ;; expressions: modules containing all of the code in the def'ns window, and @@ -1115,19 +1112,16 @@ ; the 'require' form is used for the test harness [(require module-name) exp] ; the 'dynamic-require' form is used by the actual expander - [(let-values ([(done-already?) . rest1]) (#%plain-app dynamic-wind - void - (#%plain-lambda () . rest2) - (#%plain-lambda () . rest3))) + void + (#%plain-lambda () . rest2) + (#%plain-lambda () . rest3))) exp] [else - ;; I think we can re-enable this error now. I don't want to do it right before a release, though. 2009-05-20 - #; (error `annotate/top-level "unexpected top-level expression: ~a\n" (syntax->datum exp)) - (annotate/module-top-level exp)]))) + #;(annotate/module-top-level exp)]))) #;(define/contract annotate/top-level/acl2 (syntax? . -> . syntax?) @@ -1191,17 +1185,25 @@ [(begin . bodies) #`(begin #,@(map annotate/module-top-level (syntax->list #`bodies)))] [(#%plain-app call-with-values (#%plain-lambda () body) print-values) - (stepper-recertify - #`(#%plain-app - call-with-values - (#%plain-lambda () #,(top-level-annotate/inner (top-level-rewrite #`body) exp #f)) - (#%plain-lambda vals - (begin - (#,exp-finished-break (#%plain-app list (#%plain-app list #,(lambda () exp) #f (#%plain-lambda () vals)))) - (#%plain-app - call-with-values (#%plain-lambda () vals) - print-values)))) - exp)] + ;; re-extract the plain-lambda term, to use in recertification: + (let ([lam-for-cert (syntax-case exp (#%plain-app call-with-values) + [(#%plain-app call-with-values lam print-values) #'lam] + [other (error 'annotate/module-top-level "unreachable 2010-01-23 22:14")])]) + ;; this recertify looks to be superfluous now that it has the "transparent" certificate-mode tag, + ;; but it can't hurt, and I'd rather just leave it in here. + (stepper-recertify + #`(#%plain-app + call-with-values + #,(stepper-recertify + #`(#%plain-lambda () #,(top-level-annotate/inner (top-level-rewrite #`body) exp #f)) + lam-for-cert) + (#%plain-lambda vals + (begin + (#,exp-finished-break (#%plain-app list (#%plain-app list #,(lambda () exp) #f (#%plain-lambda () vals)))) + (#%plain-app + call-with-values (#%plain-lambda () vals) + print-values)))) + exp))] [any (stepper-syntax-property exp 'stepper-test-suite-hint) (top-level-annotate/inner (top-level-rewrite exp) exp #f)] @@ -1211,14 +1213,12 @@ ;; which produce arbitrary expressions at the top level. #;(error `annotate/module-top-level "unexpected module-top-level expression to annotate: ~a\n" (syntax->datum exp))])])) + ; body of local - (let* ([annotated-exp (cond - ;; support for ACL2 is commented out. - #;[(and (not (eq? language-level 'testing)) - (string=? (language-level->name language-level) "ACL2 Beginner (beta 8)")) - (annotate/top-level/acl2 main-exp)] - [else - (annotate/top-level main-exp)])]) - annotated-exp)) + (annotate/top-level main-exp)) +(define saved-code-inspector (current-code-inspector)) + +(define (stepper-recertify new-stx old-stx) + (syntax-recertify new-stx old-stx saved-code-inspector #f)) \ No newline at end of file diff --git a/collects/stepper/private/shared.ss b/collects/stepper/private/shared.ss index d5617d1d55..7cb9e0ab37 100644 --- a/collects/stepper/private/shared.ss +++ b/collects/stepper/private/shared.ss @@ -386,10 +386,12 @@ (define (queue-length queue) (length (unbox queue))) + (define saved-code-inspector (current-code-inspector)) + (define (rebuild-stx new old) (syntax-recertify (datum->syntax old new old old) old - (current-code-inspector) + saved-code-inspector #f)) (define break-kind? From a18447e9700ba89e14f4c570507c6b850659369c Mon Sep 17 00:00:00 2001 From: John Clements Date: Sun, 24 Jan 2010 07:23:09 +0000 Subject: [PATCH 036/113] srfi 19 tests, not for release svn: r17794 --- collects/tests/srfi/19/tests.ss | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/collects/tests/srfi/19/tests.ss b/collects/tests/srfi/19/tests.ss index c12248d6bf..977f9ed70e 100644 --- a/collects/tests/srfi/19/tests.ss +++ b/collects/tests/srfi/19/tests.ss @@ -4,6 +4,7 @@ ;; John Clements -- 2004-08-16 ;; Dave Gurnell (string->date, date->string) -- 2007-09-14 ;; Dave Gurnell (time{=,<,>,<=,>=}?) -- 2009-11-26 +;; John Clements (nanoseconds off by x100) -- 2009-12-15 (require srfi/19/time) @@ -187,10 +188,22 @@ (check = 365 (- (date->modified-julian-day (srfi:make-date 0 0 0 0 1 1 2004 0)) (date->modified-julian-day (srfi:make-date 0 0 0 0 1 1 2003 0)))) (let ([test-date (srfi:make-date 0 0 0 0 1 1 2003 -7200)]) - (check tm:date= test-date (modified-julian-day->date (date->modified-julian-day test-date) -7200)))))) + (check tm:date= test-date (modified-julian-day->date (date->modified-julian-day test-date) -7200)))) + + ;; nanosecnds off by a factor of 100... + (test-case "nanosecond order-of-magnitude" + ;; half a second should be within 1/10th of 10^9 / 2 nanoseconds (currently off by a factor of 100) + (check-within (let ([t (date-nanosecond (current-date))]) + (sleep 0.5) + (abs (- (date-nanosecond (current-date)) t))) + (* 1/2 (expt 10 9)) + (* 1/10 (expt 10 9)))))) ; Helper checks and procedures ----------------- +(define-simple-check (check-within actual expected epsilon) + (< (abs (- actual expected)) epsilon)) + (define-check (check-one-utc-tai-edge utc tai-diff tai-last-diff) (let* (;; right on the edge they should be the same (utc-basic (make-time 'time-utc 0 utc)) From 25cd6766faf6ed9f1f8649dba89c8c84254516f7 Mon Sep 17 00:00:00 2001 From: John Clements Date: Sun, 24 Jan 2010 07:23:59 +0000 Subject: [PATCH 037/113] test files, for release if it matters.. svn: r17795 --- collects/tests/stepper/automatic-tests.ss | 20 +++++++++++--------- collects/tests/stepper/manual-tests.txt | 2 ++ collects/tests/stepper/test-engine.ss | 14 ++++++++++---- collects/tests/stepper/through-tests.ss | 7 ++++++- 4 files changed, 29 insertions(+), 14 deletions(-) diff --git a/collects/tests/stepper/automatic-tests.ss b/collects/tests/stepper/automatic-tests.ss index c2c6709cd6..8287fadee4 100644 --- a/collects/tests/stepper/automatic-tests.ss +++ b/collects/tests/stepper/automatic-tests.ss @@ -1,9 +1,11 @@ -(module automatic-tests mzscheme - (require "through-tests.ss" - "test-engine.ss") - - (parameterize ([display-only-errors #t] - [current-output-port (open-output-string)]) - (if (run-all-tests-except '(bad-and bad-cons check-error begin-let-bug prims qq-splice time set! local-set! lazy1 lazy2 lazy3)) - (exit 1) - (exit 0)))) +#lang scheme + +(require "through-tests.ss" + "test-engine.ss") + +(parameterize ([display-only-errors #t] + [current-output-port (open-output-string)] + [current-namespace (make-base-namespace)]) + (if (run-all-tests-except '(bad-and bad-cons check-error begin-let-bug prims qq-splice time set! local-set! lazy1 lazy2 lazy3)) + (exit 1) + (exit 0))) diff --git a/collects/tests/stepper/manual-tests.txt b/collects/tests/stepper/manual-tests.txt index b72d6949d7..cde635e56c 100644 --- a/collects/tests/stepper/manual-tests.txt +++ b/collects/tests/stepper/manual-tests.txt @@ -17,3 +17,5 @@ Try programs which print snips (print-convert-test.ss) try programs that contain test cases; make sure that the popups behave sensibly. Try jumping to the end on a program with an error. +** jumping to end when already at end doesn't behave properly ("no step + matching that criterion") diff --git a/collects/tests/stepper/test-engine.ss b/collects/tests/stepper/test-engine.ss index fee8189a79..5bdc1895b3 100644 --- a/collects/tests/stepper/test-engine.ss +++ b/collects/tests/stepper/test-engine.ss @@ -6,8 +6,10 @@ lang/run-teaching-program (only-in srfi/13 string-contains) scheme/contract - #;(file "/Users/clements/clements/scheme-scraps/eli-debug.ss") - "language-level-model.ss") + (file "/Users/clements/clements/scheme-scraps/eli-debug.ss") + "language-level-model.ss" + ;; temp: + stepper/private/annotate) ;; A SIMPLE EXAMPLE OF USING THIS FRAMEWORK: @@ -110,6 +112,8 @@ )) + + ;; test-sequence/many : model-or-models/c string? steps? -> (void) ;; run a given test through a bunch of language models (or just one). @@ -167,7 +171,6 @@ (show-result result error-box) (car all-steps))) (set! all-steps (cdr all-steps)))))] - [dc1 (display (expanded-thunk))] [iter-caller (lambda (init iter) (init) @@ -187,7 +190,7 @@ (define (call-iter-on-each stx-thunk iter) (let* ([next (stx-thunk)] [followup-thunk (if (eof-object? next) void (lambda () (call-iter-on-each stx-thunk iter)))]) - (iter next followup-thunk))) + (iter (expand next) followup-thunk))) (define (warn error-box who fmt . args) @@ -275,3 +278,6 @@ (lambda () (expand-teaching-program p2 read-syntax namespace-spec teachpack-specs #f module-id enable-testing?))]) (display (expanded-thunk)) (test-sequence/core render-settings show-lambdas-as-lambdas? expanded-thunk '() (box #f)))]) + + + diff --git a/collects/tests/stepper/through-tests.ss b/collects/tests/stepper/through-tests.ss index 1a02656461..8287a11c62 100755 --- a/collects/tests/stepper/through-tests.ss +++ b/collects/tests/stepper/through-tests.ss @@ -13,6 +13,7 @@ ) + (provide run-test run-tests run-all-tests run-all-tests-except) (define list-of-tests null) @@ -1442,7 +1443,11 @@ #;[show-all-steps #t]) #;(run-tests '(check-expect forward-ref check-within check-within-bad check-error check-error-bad)) #;(run-tests '(teachpack-universe)) - #;(run-tests '(check-expect check-within)) + #;(run-tests '(simple-if)) (run-all-tests))) + + + + \ No newline at end of file From edc04eaf15b1a78afd3e6a428c3eecfcbc7196b3 Mon Sep 17 00:00:00 2001 From: John Clements Date: Sun, 24 Jan 2010 07:25:46 +0000 Subject: [PATCH 038/113] history, for release svn: r17796 --- doc/release-notes/stepper/HISTORY.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/doc/release-notes/stepper/HISTORY.txt b/doc/release-notes/stepper/HISTORY.txt index 670fa93772..85223adce9 100644 --- a/doc/release-notes/stepper/HISTORY.txt +++ b/doc/release-notes/stepper/HISTORY.txt @@ -1,6 +1,10 @@ Stepper ------- +Changes for v4.2.4: + +Bug fixes. + Changes for v4.2.3: Bug fixes, show first step as soon as it appears. From efc980768bbc8ec509c5ee62984c6610463fd4e7 Mon Sep 17 00:00:00 2001 From: Eli Barzilay Date: Sun, 24 Jan 2010 08:50:21 +0000 Subject: [PATCH 039/113] Welcome to a new PLT day. svn: r17797 --- collects/repos-time-stamp/stamp.ss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/collects/repos-time-stamp/stamp.ss b/collects/repos-time-stamp/stamp.ss index df4650e6ca..a5fbd371e9 100644 --- a/collects/repos-time-stamp/stamp.ss +++ b/collects/repos-time-stamp/stamp.ss @@ -1 +1 @@ -#lang scheme/base (provide stamp) (define stamp "23jan2010") +#lang scheme/base (provide stamp) (define stamp "24jan2010") From f71ff300b2e7be175c2c4c705fe13176bc21d52e Mon Sep 17 00:00:00 2001 From: Casey Klein Date: Sun, 24 Jan 2010 10:45:30 +0000 Subject: [PATCH 040/113] v4.2.4 note svn: r17798 --- doc/release-notes/redex/HISTORY.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/doc/release-notes/redex/HISTORY.txt b/doc/release-notes/redex/HISTORY.txt index db4fa58971..df047febe0 100644 --- a/doc/release-notes/redex/HISTORY.txt +++ b/doc/release-notes/redex/HISTORY.txt @@ -1,3 +1,7 @@ +v4.2.4 + + * minor bug fixes + v4.2.3 * added support for collecting metafunction coverage, using the From bbc654c69e2a0030ffc31cf7f4d557a950adaf13 Mon Sep 17 00:00:00 2001 From: Casey Klein Date: Sun, 24 Jan 2010 11:36:29 +0000 Subject: [PATCH 041/113] Typesetting now recognizes carets (^) in the underscore component of a non-terminal reference, applying the non-terminal-superscript-style to the text following the caret. svn: r17801 --- collects/redex/pict.ss | 1 + collects/redex/private/bitmap-test.ss | 4 +++ .../private/bmps-macosx/superscripts.png | Bin 0 -> 944 bytes collects/redex/private/core-layout.ss | 24 ++++++++--------- collects/redex/redex.scrbl | 25 +++++++++++++----- 5 files changed, 36 insertions(+), 18 deletions(-) create mode 100644 collects/redex/private/bmps-macosx/superscripts.png diff --git a/collects/redex/pict.ss b/collects/redex/pict.ss index c511e1f375..0d636a934f 100644 --- a/collects/redex/pict.ss +++ b/collects/redex/pict.ss @@ -59,6 +59,7 @@ [default-style (parameter/c text-style/c)] [non-terminal-style (parameter/c text-style/c)] [non-terminal-subscript-style (parameter/c text-style/c)] + [non-terminal-superscript-style (parameter/c text-style/c)] [linebreaks (parameter/c (or/c false/c (listof boolean?)))] [curly-quotes-for-strings (parameter/c boolean?)] [white-bracket-sizing (parameter/c diff --git a/collects/redex/private/bitmap-test.ss b/collects/redex/private/bitmap-test.ss index 8a8aefe9c7..e5f73397d9 100644 --- a/collects/redex/private/bitmap-test.ss +++ b/collects/redex/private/bitmap-test.ss @@ -159,5 +159,9 @@ ;; make sure two metafunctions simultaneously rewritten line up properly (test (render-metafunctions S T TL) "metafunctions-multiple.png") +;; Non-terminal superscripts +(test (render-lw lang (to-lw (x_^abcdef x_q^abcdef))) + "superscripts.png") + (printf "bitmap-test.ss: ") (done) diff --git a/collects/redex/private/bmps-macosx/superscripts.png b/collects/redex/private/bmps-macosx/superscripts.png new file mode 100644 index 0000000000000000000000000000000000000000..69484218f2decdc0365848277dc928f7cc4c18c9 GIT binary patch literal 944 zcmV;h15f;kP)YD6?l8alP2{3(=0l3lo97gL&&T5h?P3vxjTS6GKKiO^aZn^vo7 ztuafpwIpXXbJ$kH?Ah_W7kgV`?|R>D@AvNceV^aw`Td^r^y>ihMIRp@=+A->s#L1i z*Vlxu%jGf}jo*S+tM%#WDG4(jxXEOS!!ZB=03Z^HEH5uZ2*IDlX0r_j1DDH9=-%Dk zJv=;ojVvuK;W!=&g_1DSfj>SzYBZYP=>Px-;rRIY{QNwQ<3ADW>+8kE#YUrXW@aWB z46dxK1OkDnsj024EeyjdD=V|IvbguXWrMkJfaXOv1x3?`VEhi@@VzIcUrY1@C z>A)8j7Tj*PQmGsn8NmPmBuO?lHWn2X{X9mkR+pETb2yyp>S~k8#OL$na=FD~(Q36k z9&d1PkRXWN-Q9tK0UXEk^71w}H^bp@XJ;pl<2^k+b#-+~dPpDM*VnhPu@MS|Foe+T z?5sp0NqEx1!9hnyhgz*}Zf@3UwZp^1I-O1|7Vqrrw70kC9x?)Fu~@CGt!ry*n8)L}zrU}jr~m*&qtTTsQ3xS~FlN2KzsI-5$66#3 zVHhSFjmClu!@Rw{EiNu5oH-eXYcv`@pAQZX55KiRl4M(3Tf!p#Mt;A4dwZLv>4a{^ z;pgY)xw*MmZEda3=VKTq{`F~^b~>HOpLG)D=jThM(!#>Rgzh&uNs>C9PN7hw41a!p zE-Nd;s;a88v$K6ZUo2`c7`nT=IUJ7NZg)5wsrHgs-{5Am830gHQc_S*kTTQj^$LYT zjLl{%6bg&Qa&~qm5{V#$LZMJ1kxWldV;GjH1`@)RN@ah4|Nj1dS65d$ zgF{0@2%$hA5PNV8!zBMPNkKp1GMQ{|Z%-?l9>YkS{D}=b8~Z%NF;?^o6Qy<*1rHx&>Y4f S+EAqc0000string atom))) + (regexp-match #rx"^([^_^]*)_([^^]*)\\^?(.*)$" (symbol->string atom))) => - (λ (m) - (let* ([first-part (cadr m)] - [second-part (caddr m)] - [first-span (- span (string-length first-part))]) - (list - (non-terminal->token col first-span first-part) - (make-string-token (+ col first-span) - (- span first-span) - second-part - (non-terminal-subscript-style)))))] + (match-lambda + [(list _ nt sub sup) + (let* ([sub-pict (basic-text sub (non-terminal-subscript-style))] + [sup-pict (basic-text sup (non-terminal-superscript-style))] + [sub+sup (lbl-superimpose sub-pict sup-pict)]) + (list (non-terminal->token col span nt) + (make-pict-token (+ col span) 0 sub+sup)))])] [(or (memq atom all-nts) (memq atom '(number variable variable-except variable-not-otherwise-mentioned))) (list (non-terminal->token col span (format "~s" atom)))] @@ -747,6 +746,7 @@ (define (unksc str) (pink-background ((current-text) str 'modern (default-font-size)))) (define non-terminal-style (make-parameter '(italic . roman))) (define non-terminal-subscript-style (make-parameter `(subscript . ,(non-terminal-style)))) + (define non-terminal-superscript-style (make-parameter `(superscript . ,(non-terminal-style)))) (define default-style (make-parameter 'roman)) (define metafunction-style (make-parameter 'swiss)) (define (metafunction-text str) ((current-text) str (metafunction-style) (metafunction-font-size))) diff --git a/collects/redex/redex.scrbl b/collects/redex/redex.scrbl index fb34a26e47..a66ca1287a 100644 --- a/collects/redex/redex.scrbl +++ b/collects/redex/redex.scrbl @@ -1865,6 +1865,7 @@ cases appear. If it is a list of numbers, then only the selected cases appear (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[non-terminal-superscript-style style text-style/c]{} @defparam[default-style style text-style/c]{}]]{ These parameters determine the font used for various text in @@ -1875,15 +1876,27 @@ useful things it can be is one of the symbols @scheme['roman], monospaced font, respectively. (It can also encode style information, too.) -The label-style is used for the reduction rule label -names. The literal-style is used for names that aren't +The @scheme[label-style] is used for the reduction rule label +names. The @scheme[literal-style] is used for names that aren't non-terminals that appear in patterns. The -metafunction-style is used for the names of -metafunctions. The non-terminal-style is for non-terminals -and non-terminal-subscript-style is used for the portion +@scheme[metafunction-style] is used for the names of +metafunctions. + +The @scheme[non-terminal-style] is used for the names of non-terminals. +Two parameters style the text in the (optional) "underscore" component +of a non-terminal reference. The first, @scheme[non-terminal-subscript-style], +applies to the segment between the underscore and the first caret (@scheme[^]) +to follow it; the second, @scheme[non-terminal-superscript-style], applies +to the segment following that caret. For example, in the non-terminal +reference @scheme[x_y_z], @scheme[x] has style @scheme[non-terminal-style], +@scheme[y] has style @scheme[non-terminal-subscript-style], and @scheme[z] +has style @scheme[non-terminal-superscript-style]. + +The +@scheme[non-terminal-subscript-style] is used for the portion after the underscore in non-terminal references. -The default-style is used for parenthesis, the dot in dotted +The @scheme[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. From 4ce8dfa7da24056425a7ce3ce3c54f51e124c230 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Sun, 24 Jan 2010 15:30:16 +0000 Subject: [PATCH 042/113] fix problems with having a struct implement both prop:evt and prop:procedure; merge to 4.2.4 svn: r17802 --- .../scribblings/reference/custom-ports.scrbl | 10 +-- collects/scribblings/reference/evts.scrbl | 8 +- collects/tests/mzscheme/sync.ss | 76 +++++++++++-------- src/mzscheme/src/portfun.c | 27 +++---- src/mzscheme/src/struct.c | 16 +++- src/mzscheme/src/thread.c | 10 +-- 6 files changed, 86 insertions(+), 61 deletions(-) diff --git a/collects/scribblings/reference/custom-ports.scrbl b/collects/scribblings/reference/custom-ports.scrbl index fe8bda671f..866e1ef36a 100644 --- a/collects/scribblings/reference/custom-ports.scrbl +++ b/collects/scribblings/reference/custom-ports.scrbl @@ -72,11 +72,11 @@ The arguments implement the port as follows: @scheme[peek] is called again; or} @item{a @tech{synchronizable event} (see @secref["sync"]) other - than a pipe input port that becomes ready when the read is - complete (roughly): the event's value can one of the above three - results or another event like itself; in the last case, a - reading process loops with @scheme[sync] until it gets a - non-event result.} + than a pipe input port or procedure of arity four; the event + becomes ready when the read is complete (roughly): the event's + value can one of the above three results or another event like + itself; in the last case, a reading process loops with + @scheme[sync] until it gets a non-event result.} ] diff --git a/collects/scribblings/reference/evts.scrbl b/collects/scribblings/reference/evts.scrbl index 05fd41bffc..b423652918 100644 --- a/collects/scribblings/reference/evts.scrbl +++ b/collects/scribblings/reference/evts.scrbl @@ -324,13 +324,13 @@ A @tech{structure type property} that identifies structure types whose @itemize[ - @item{An event @scheme[evt]: In this case, using the structure as an - event is equivalent to using @scheme[evt].} + @item{An event @scheme[_evt]: In this case, using the structure as an + event is equivalent to using @scheme[_evt].} - @item{A procedure @scheme[proc] of one argument: In this case, the + @item{A procedure @scheme[_proc] of one argument: In this case, the structure is similar to an event generated by @scheme[guard-evt], except that the would-be guard - procedure @scheme[proc] receives the structure as an argument, instead + procedure @scheme[_proc] receives the structure as an argument, instead of no arguments.} @item{An exact, non-negative integer between @scheme[0] (inclusive) diff --git a/collects/tests/mzscheme/sync.ss b/collects/tests/mzscheme/sync.ss index 1216bdacef..cc416bac7f 100644 --- a/collects/tests/mzscheme/sync.ss +++ b/collects/tests/mzscheme/sync.ss @@ -465,12 +465,20 @@ (define-values (struct:wt make-wt wt? wt-ref wt-set!) (make-struct-type 'wt #f 2 0 #f (list (cons prop:evt 1)) (make-inspector) #f '(1))) -(let ([always-ready (make-wt #f (lambda (self) #t))] - [always-stuck (make-wt 1 2)]) - (test always-ready sync always-ready) - (test always-ready sync/timeout 0 always-ready) - (test #f sync/timeout 0 always-stuck) - (test #f sync/timeout SYNC-SLEEP-DELAY always-stuck)) +(define-values (struct:wt2 make-wt2 wt2? wt2-ref wt2-set!) + (make-struct-type 'wt2 #f 2 0 #f (list (cons prop:evt 1)) + (make-inspector) 0 '(1))) + +(let ([test-wt + (lambda (make-wt) + (let ([always-ready (make-wt (lambda () 10) (lambda (self) #t))] + [always-stuck (make-wt 1 2)]) + (test always-ready sync always-ready) + (test always-ready sync/timeout 0 always-ready) + (test #f sync/timeout 0 always-stuck) + (test #f sync/timeout SYNC-SLEEP-DELAY always-stuck)))]) + (test-wt make-wt) + (test-wt make-wt2)) ;; Check whether something that takes at least SYNC-SLEEP-DELAY ;; seconds in fact takes roughly that much CPU time. We @@ -496,7 +504,7 @@ (equal? "" Section-prefix)) (test busy? (lambda (a ax b c d) (> b c)) 'busy-wait? go took boundary real-took))))) -(define (test-good-waitable wrap-sema) +(define (test-good-waitable wrap-sema make-wt) (let ([sema (make-semaphore)]) (letrec-values ([(sema-ready-part get-sema-result) (wrap-sema sema sema (lambda () sema-ready))] [(sema-ready) (make-wt 1 sema-ready-part)]) @@ -530,13 +538,18 @@ [(wrapped) (make-wt 3 wrapped-part)]) (non-busy-wait (get-wrapped-result) get-wrapped-result)))))) -(test-good-waitable (lambda (x x-result get-self) - (values x (lambda () x-result)))) -(test-good-waitable (lambda (x x-result get-self) - (let ([ws (choice-evt - x - (make-wt 99 (lambda (self) (make-semaphore))))]) - (values ws (lambda () x-result))))) +(map + (lambda (make-wt) + (test-good-waitable (lambda (x x-result get-self) + (values x (lambda () x-result))) + make-wt) + (test-good-waitable (lambda (x x-result get-self) + (let ([ws (choice-evt + x + (make-wt 99 (lambda (self) (make-semaphore))))]) + (values ws (lambda () x-result)))) + make-wt)) + (list make-wt make-wt2)) (check-busy-wait (letrec ([s (make-semaphore)] @@ -592,22 +605,25 @@ (test bad-stuck-port sync bad-stuck-port)) #t))) -(test-stuck-port (make-semaphore 1) semaphore-try-wait? semaphore-post) -(let ([ready? #t]) - (test-stuck-port (make-wt 77 (lambda (self) - (if ready? - #t - (make-semaphore)))) - (lambda (wt) (set! ready? #f)) - (lambda (wt) (set! ready? #t)))) -(let ([s (make-semaphore 1)]) - (test-stuck-port (make-wt 77 s) - (lambda (wt) (semaphore-try-wait? s)) - (lambda (wt) (semaphore-post s)))) -(let ([s (make-semaphore 1)]) - (test-stuck-port (make-wt 177 (lambda (self) s)) - (lambda (wt) (semaphore-try-wait? s)) - (lambda (wt) (semaphore-post s)))) +(map + (lambda (make-wt) + (test-stuck-port (make-semaphore 1) semaphore-try-wait? semaphore-post) + (let ([ready? #t]) + (test-stuck-port (make-wt 77 (lambda (self) + (if ready? + #t + (make-semaphore)))) + (lambda (wt) (set! ready? #f)) + (lambda (wt) (set! ready? #t)))) + (let ([s (make-semaphore 1)]) + (test-stuck-port (make-wt 77 s) + (lambda (wt) (semaphore-try-wait? s)) + (lambda (wt) (semaphore-post s)))) + (let ([s (make-semaphore 1)]) + (test-stuck-port (make-wt 177 (lambda (self) s)) + (lambda (wt) (semaphore-try-wait? s)) + (lambda (wt) (semaphore-post s))))) + (list make-wt make-wt2)) ;; ---------------------------------------- diff --git a/src/mzscheme/src/portfun.c b/src/mzscheme/src/portfun.c index 19b3d81d90..3aa208d11d 100644 --- a/src/mzscheme/src/portfun.c +++ b/src/mzscheme/src/portfun.c @@ -769,22 +769,17 @@ static long user_read_result(const char *who, Scheme_Input_Port *port, "returned #f when no progress evt was supplied: ", val); return 0; - } else if (SCHEME_PROCP(val)) { - Scheme_Object *orig = val; - a[0] = val; - if (scheme_check_proc_arity(NULL, 4, 0, 1, a)) { - if (!special_ok) { - scheme_arg_mismatch(who, - "the port has no specific peek procedure, so" - " a special read result is not allowed: ", - orig); - return 0; - } - port->special = a[0]; - return SCHEME_SPECIAL; - } else - val = NULL; - n = 0; + } else if (SCHEME_PROCP(val) + && scheme_check_proc_arity(NULL, 4, 0, 1, a)) { + if (!special_ok) { + scheme_arg_mismatch(who, + "the port has no specific peek procedure, so" + " a special read result is not allowed: ", + val); + return 0; + } + port->special = val; + return SCHEME_SPECIAL; } else if (evt_ok && pipe_input_p(val)) { ((User_Input_Port *)port->port_data)->prefix_pipe = val; return 0; diff --git a/src/mzscheme/src/struct.c b/src/mzscheme/src/struct.c index 876102c473..72fcd4835d 100644 --- a/src/mzscheme/src/struct.c +++ b/src/mzscheme/src/struct.c @@ -285,6 +285,10 @@ scheme_init_struct (Scheme_Env *env) (Scheme_Ready_Fun)evt_struct_is_ready, NULL, is_evt_struct, 1); + scheme_add_evt(scheme_proc_struct_type, + (Scheme_Ready_Fun)evt_struct_is_ready, + NULL, + is_evt_struct, 1); } { @@ -1055,6 +1059,11 @@ static Scheme_Object *check_evt_property_value_ok(int argc, Scheme_Object *argv[ return v; } +static Scheme_Object *return_wrapped(void *data, int argc, Scheme_Object *argv[]) +{ + return (Scheme_Object *)data; +} + static int evt_struct_is_ready(Scheme_Object *o, Scheme_Schedule_Info *sinfo) { Scheme_Object *v; @@ -1099,7 +1108,12 @@ static int evt_struct_is_ready(Scheme_Object *o, Scheme_Schedule_Info *sinfo) return 0; } - /* non-evt => ready and result is self */ + /* non-evt => ready and result is self; if self is a procedure, + we need to wrap it, so that self is not treated as a `wrap-evt' + procedure. */ + if (SCHEME_PROCP(o)) { + o = scheme_make_closed_prim_w_arity(return_wrapped, (void *)o, "wrapper", 1, 1); + } scheme_set_sync_target(sinfo, o, o, NULL, 0, 0, NULL); return 1; diff --git a/src/mzscheme/src/thread.c b/src/mzscheme/src/thread.c index db2bde86dc..a25ff5b945 100644 --- a/src/mzscheme/src/thread.c +++ b/src/mzscheme/src/thread.c @@ -5881,7 +5881,7 @@ static Scheme_Object *do_sync(const char *name, int argc, Scheme_Object *argv[], if (syncing->result) { /* Apply wrap functions to the selected evt: */ Scheme_Object *o, *l, *a, *to_call = NULL, *args[1]; - int to_call_is_cont = 0; + int to_call_is_handle = 0; o = evt_set->argv[syncing->result - 1]; if (SAME_TYPE(SCHEME_TYPE(o), scheme_channel_syncer_type)) { @@ -5908,7 +5908,7 @@ static Scheme_Object *do_sync(const char *name, int argc, Scheme_Object *argv[], if (SCHEME_BOXP(a) || SCHEME_PROCP(a)) { if (SCHEME_BOXP(a)) { a = SCHEME_BOX_VAL(a); - to_call_is_cont = 1; + to_call_is_handle = 1; } to_call = a; } else if (SAME_TYPE(scheme_thread_suspend_type, SCHEME_TYPE(a)) @@ -5921,9 +5921,9 @@ static Scheme_Object *do_sync(const char *name, int argc, Scheme_Object *argv[], if (to_call) { args[0] = o; - /* If to_call is still a wrap-evt (not a cont-evt), + /* If to_call is still a wrap-evt (not a handle-evt), then set the config one more time: */ - if (!to_call_is_cont) { + if (!to_call_is_handle) { scheme_push_break_enable(&cframe, 0, 0); tailok = 0; } @@ -5932,7 +5932,7 @@ static Scheme_Object *do_sync(const char *name, int argc, Scheme_Object *argv[], return _scheme_tail_apply(to_call, 1, args); } else { o = scheme_apply(to_call, 1, args); - if (!to_call_is_cont) + if (!to_call_is_handle) scheme_pop_break_enable(&cframe, 1); return o; } From 100fe8520da8f388ea18685f44399d8d0f0a0cda Mon Sep 17 00:00:00 2001 From: John Clements Date: Sun, 24 Jan 2010 18:21:56 +0000 Subject: [PATCH 043/113] took bad require out svn: r17803 --- collects/tests/stepper/test-engine.ss | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/collects/tests/stepper/test-engine.ss b/collects/tests/stepper/test-engine.ss index 5bdc1895b3..50734a02c3 100644 --- a/collects/tests/stepper/test-engine.ss +++ b/collects/tests/stepper/test-engine.ss @@ -6,10 +6,8 @@ lang/run-teaching-program (only-in srfi/13 string-contains) scheme/contract - (file "/Users/clements/clements/scheme-scraps/eli-debug.ss") - "language-level-model.ss" - ;; temp: - stepper/private/annotate) + #;(file "/Users/clements/clements/scheme-scraps/eli-debug.ss") + "language-level-model.ss") ;; A SIMPLE EXAMPLE OF USING THIS FRAMEWORK: From 2098a19291e31d314082519c5abce693dd65a66d Mon Sep 17 00:00:00 2001 From: John Clements Date: Sun, 24 Jan 2010 19:28:57 +0000 Subject: [PATCH 044/113] fixed dmda stepper bug: goes in 4.2.4 release svn: r17805 --- collects/stepper/private/annotate.ss | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/collects/stepper/private/annotate.ss b/collects/stepper/private/annotate.ss index c729133e38..77b7b03e95 100644 --- a/collects/stepper/private/annotate.ss +++ b/collects/stepper/private/annotate.ss @@ -1171,11 +1171,13 @@ [defined-name (if (and (pair? name-list) (null? (cdr name-list))) (car name-list) #f)]) - #`(begin - (define-values (new-var ...) - #,(top-level-annotate/inner (top-level-rewrite #`e) exp defined-name)) - ;; this next expression should deliver the newly computed values to an exp-finished-break - (#%plain-app #,exp-finished-break (#%plain-app list (#%plain-app list #,(lambda () exp) #f (#%plain-lambda () (#%plain-app list new-var ...)))))))] + (stepper-recertify + #`(begin + (define-values (new-var ...) + #,(top-level-annotate/inner (top-level-rewrite #`e) exp defined-name)) + ;; this next expression should deliver the newly computed values to an exp-finished-break + (#%plain-app #,exp-finished-break (#%plain-app list (#%plain-app list #,(lambda () exp) #f (#%plain-lambda () (#%plain-app list new-var ...)))))) + #'e))] [(define-syntaxes (new-vars ...) e) exp] [(#%require specs ...) From bef818b2be5ca8481c8d026e838a2e20e33d0bba Mon Sep 17 00:00:00 2001 From: John Clements Date: Sun, 24 Jan 2010 19:31:29 +0000 Subject: [PATCH 045/113] test changes, goes in release 4.2.4 svn: r17806 --- collects/tests/stepper/automatic-tests.ss | 4 ++-- collects/tests/stepper/language-level-model.ss | 5 +++++ collects/tests/stepper/test-engine.ss | 6 ++++-- collects/tests/stepper/through-tests.ss | 16 +++++++++++++++- 4 files changed, 26 insertions(+), 5 deletions(-) diff --git a/collects/tests/stepper/automatic-tests.ss b/collects/tests/stepper/automatic-tests.ss index 8287fadee4..cfb6039499 100644 --- a/collects/tests/stepper/automatic-tests.ss +++ b/collects/tests/stepper/automatic-tests.ss @@ -7,5 +7,5 @@ [current-output-port (open-output-string)] [current-namespace (make-base-namespace)]) (if (run-all-tests-except '(bad-and bad-cons check-error begin-let-bug prims qq-splice time set! local-set! lazy1 lazy2 lazy3)) - (exit 1) - (exit 0))) + (exit 0) + (exit 1))) diff --git a/collects/tests/stepper/language-level-model.ss b/collects/tests/stepper/language-level-model.ss index f7983f888e..5a4c84ff57 100644 --- a/collects/tests/stepper/language-level-model.ss +++ b/collects/tests/stepper/language-level-model.ss @@ -32,6 +32,11 @@ (make-ll-model `(lib "lazy.ss" "lazy") `() fake-mz-render-settings #f #f)) +;; unsure about the render-settings, here: +(define dmda-a + (make-ll-model `(lib "DMdA-beginner.ss" "deinprogramm") '() fake-beginner-render-settings #f #t)) + + ;; SUPPORT FOR TESTING A BUNCH OF LANGUAGES AT ONCE: ;; built-in multi-language bundles: diff --git a/collects/tests/stepper/test-engine.ss b/collects/tests/stepper/test-engine.ss index 50734a02c3..ac77a32b55 100644 --- a/collects/tests/stepper/test-engine.ss +++ b/collects/tests/stepper/test-engine.ss @@ -187,8 +187,10 @@ ;; back to us by calling the followup-thunk. (define (call-iter-on-each stx-thunk iter) (let* ([next (stx-thunk)] - [followup-thunk (if (eof-object? next) void (lambda () (call-iter-on-each stx-thunk iter)))]) - (iter (expand next) followup-thunk))) + [followup-thunk (if (eof-object? next) void (lambda () (call-iter-on-each stx-thunk iter)))] + [expanded (expand next)]) + ;;(printf "~v\n" expanded) + (iter expanded followup-thunk))) (define (warn error-box who fmt . args) diff --git a/collects/tests/stepper/through-tests.ss b/collects/tests/stepper/through-tests.ss index 8287a11c62..b841de6745 100755 --- a/collects/tests/stepper/through-tests.ss +++ b/collects/tests/stepper/through-tests.ss @@ -1131,6 +1131,21 @@ (9 (check-error (+ (hilite 7) (rest empty)) "bogus"))) (before-after (9 false (check-expect (hilite (+ 3 1)) 4)) (9 false (check-expect (hilite 4) 4))))) + + ;;;;;;;;;;;; + ;; + ;; DMdA TESTS + ;; + ;;;;;;;;;;; + + (t1 'dmda-certificate-bug + m:dmda-a + "(: apply-nim-move (integer? -> integer?)) + (define apply-nim-move + (lambda (s) + (if s s s)))" + '()) + ; ;;;;;;;;;;;;; ; ;; @@ -1254,7 +1269,6 @@ ((hilite true))) (finished-stepping))) - ;;;;;;;;;;;;; ;; ;; Set! From cf4294a28033788548f0057410b373f5f72b7c36 Mon Sep 17 00:00:00 2001 From: Robby Findler Date: Sun, 24 Jan 2010 20:22:58 +0000 Subject: [PATCH 046/113] changed the internal representation of normalized images so that crop structs do no have to be duplicated, improved test suites svn: r17808 --- collects/2htdp/private/image-more.ss | 43 +- .../2htdp/tests/image-equality-performance.ss | 908 ++++++++++++++++++ collects/2htdp/tests/test-image.ss | 97 +- collects/mrlib/image-core.ss | 122 +-- 4 files changed, 1093 insertions(+), 77 deletions(-) create mode 100644 collects/2htdp/tests/image-equality-performance.ss diff --git a/collects/2htdp/private/image-more.ss b/collects/2htdp/private/image-more.ss index d97cd4c798..5068aa47e4 100644 --- a/collects/2htdp/private/image-more.ss +++ b/collects/2htdp/private/image-more.ss @@ -2,6 +2,7 @@ (require "../../mrlib/image-core.ss" "img-err.ss" + scheme/match scheme/contract scheme/class scheme/gui/base @@ -279,9 +280,10 @@ (crop/internal x1 y1 width height image)) (define (crop/internal x1 y1 width height image) - (let ([iw (min width (get-right image))] - [ih (min height (get-bottom image))]) - (make-image (make-crop (rectangle-points iw ih) + (let* ([iw (min width (get-right image))] + [ih (min height (get-bottom image))] + [points (rectangle-points iw ih)]) + (make-image (make-crop points (make-translate (- x1) (- y1) (image-shape image))) (make-bb iw ih @@ -363,26 +365,28 @@ (- (ltrb-bottom ltrb) (ltrb-top ltrb))) #f))) -(define (rotate-normalized-shape angle shape) +(define/contract (rotate-normalized-shape angle shape) + (-> number? normalized-shape? normalized-shape?) (cond [(overlay? shape) (let ([top-shape (rotate-normalized-shape angle (overlay-top shape))] - [bottom-shape (rotate-cropped-simple angle (overlay-bottom shape))]) + [bottom-shape (rotate-cn-or-simple-shape angle (overlay-bottom shape))]) (make-overlay top-shape bottom-shape))] [else - (rotate-cropped-simple angle shape)])) + (rotate-cn-or-simple-shape angle shape)])) -;; rotate-cropped-simple : angle cropped-simple-shape -> cropped-simple-shape -(define (rotate-cropped-simple angle shape) +(define/contract (rotate-cn-or-simple-shape angle shape) + (-> number? cn-or-simple-shape? cn-or-simple-shape?) (cond [(crop? shape) (make-crop (rotate-points angle (crop-points shape)) - (rotate-cropped-simple angle (crop-shape shape)))] - [else + (rotate-normalized-shape angle (crop-shape shape)))] + [else (rotate-simple angle shape)])) ;; rotate-simple : angle simple-shape -> simple-shape (define (rotate-simple θ simple-shape) + (-> number? simple-shape? simple-shape?) (cond [(line-segment? simple-shape) (make-line-segment (rotate-point (line-segment-start simple-shape) @@ -425,21 +429,21 @@ (min (ltrb-right ltrb1) (ltrb-right ltrb2)) (min (ltrb-bottom ltrb1) (ltrb-bottom ltrb2)))) -;; normalized-shape-bb : normalized-shape -> ltrb -(define (normalized-shape-bb shape) +(define/contract (normalized-shape-bb shape) + (-> normalized-shape? ltrb?) (cond [(overlay? shape) (let ([top-ltrb (normalized-shape-bb (overlay-top shape))] - [bottom-ltrb (cropped-simple-bb (overlay-bottom shape))]) + [bottom-ltrb (cn-or-simple-shape-bb (overlay-bottom shape))]) (union-ltrb top-ltrb bottom-ltrb))] [else - (cropped-simple-bb shape)])) + (cn-or-simple-shape-bb shape)])) -;; cropped-simple-bb : cropped-simple-shape -> ltrb -(define (cropped-simple-bb shape) +(define/contract (cn-or-simple-shape-bb shape) + (-> cn-or-simple-shape? ltrb?) (cond [(crop? shape) - (let ([ltrb (cropped-simple-bb (crop-shape shape))] + (let ([ltrb (normalized-shape-bb (crop-shape shape))] [crop-ltrb (points->ltrb (crop-points shape))]) (intersect-ltrb crop-ltrb ltrb))] [else @@ -448,7 +452,8 @@ ;; simple-bb : simple-shape -> ltrb ;; returns the bounding box of 'shape' ;; (only called for rotated shapes, so bottom=baseline) -(define (simple-bb simple-shape) +(define/contract (simple-bb simple-shape) + (-> simple-shape? ltrb?) (cond [(line-segment? simple-shape) (let ([x1 (point-x (line-segment-start simple-shape))] @@ -484,6 +489,7 @@ (make-ltrb left top right bottom))) (define (np-atomic-bb atomic-shape) + (-> np-atomic-shape? (values number? number? number? number?)) (cond [(ellipse? atomic-shape) (let ([θ (ellipse-angle atomic-shape)]) @@ -554,6 +560,7 @@ ;; rotate-atomic : angle np-atomic-shape -> np-atomic-shape (define (rotate-atomic θ atomic-shape) + (-> number? np-atomic-shape? np-atomic-shape?) (cond [(ellipse? atomic-shape) (cond diff --git a/collects/2htdp/tests/image-equality-performance.ss b/collects/2htdp/tests/image-equality-performance.ss new file mode 100644 index 0000000000..79960d210e --- /dev/null +++ b/collects/2htdp/tests/image-equality-performance.ss @@ -0,0 +1,908 @@ +#lang scheme + +#| + +This is a file from Guillaume that ran very slowly with the +htdp/image library; here it is used as a performance test. +Porting to #lang scheme +2htdp/image consisted of adding requires, +changing overlay/xy to underlay/xy, defining empty-scene, and +adding the check-expect macro (and related code). +Also added the timing code at the end. + +|# + + +(require 2htdp/image + (only-in mrlib/image-core + skip-image-equality-fast-path)) + +(define-syntax (check-expect stx) + (syntax-case stx () + [(_ a b) + (with-syntax ([line (syntax-line stx)]) + #'(set! tests (cons (list (λ () a) (λ () b) line) + tests)))])) +(define tests '()) +(define (run-tests) + (for-each + (λ (l) + (let ([a-res ((list-ref l 0))] + [b-res ((list-ref l 1))] + [line (list-ref l 2)]) + (unless (equal? a-res b-res) + (error 'test "test failed; expected ~s and ~s to be equal, but they weren't, line ~a" + a-res + b-res + line)))) + tests)) + +(define (empty-scene w h) + (overlay + (rectangle w h 'solid 'white) + (rectangle w h 'outline 'black))) + +;;Program for creating game of croos-circle game +;;contract :image->image + +;;defining a union square +;;A square is either +;;A square is blank +;;A square is cross +;;A square is Circle + +;;defining width of square +(define square-width 150) + +;;defining th height and width of scene +(define width (* square-width 3)) +(define height (* square-width 3)) + + +;;defining the image circle +(define Circle (underlay/xy (circle 20 'solid 'orange) 0 0 (circle 10 'solid 'white))) +;;defining the image cross +(define cross (underlay/xy (rectangle 10 30 'solid 'green) 0 0 (rectangle 30 10 'solid 'green))) +;;defining the blank image +(define blank (underlay/xy (rectangle square-width square-width 'solid 'red) 0 0 + (rectangle (- square-width 8) (- square-width 8) 'solid 'white))) + +;;Given a square returns +;;the image of square +;;draw-square :square ->image +(define (draw-square square) + (cond[(equal? 'Circle square)(underlay/xy blank 0 0 Circle)] + [(equal? 'cross square)(underlay/xy blank 0 0 cross)] + [(equal? 'blank square)blank] + )) + + +;;test +(check-expect(draw-square 'Circle)(underlay/xy blank 0 0 Circle)) +(check-expect(draw-square 'cross)(underlay/xy blank 0 0 cross)) +(check-expect(draw-square 'blank)blank) + +;;== Cross and circles, part #3 == + + +;;define a structure for ROW +;;ROW structure used for creating a ROW in the board +;;contract ROW:image image image->image +(define-struct ROW (left middle right) #:transparent) + + +;; defining a blank row + +(define blank-ROW (make-ROW 'blank 'blank 'blank)) +;;defining the cross row +(define cross-ROW (make-ROW 'blank 'cross 'blank)) + +;;defineing the cross-row-blank secoend combination +(define cross-ROW-blank (make-ROW 'cross 'cross 'blank )) +;;defining a row cross-row +(define cross-row (make-ROW 'cross 'cross 'cross )) +;;defining a row blank-circle +(define blank-circle (make-ROW 'Circle 'blank 'blank)) +;;defining a row cross-circle +(define cross-circle (make-ROW 'cross 'cross 'Circle )) +;;defining a row circle-cross +(define circle-cross (make-ROW 'cross 'Circle 'Circle )) +;;defining a row cross-blank +(define cross-blank (make-ROW 'cross 'blank 'blank )) +;;function for creating ROW with the square +;;contract:square square square->ROW +;template: for draw-row +;template for ROW +;(define (a-row-function a-row) +; ... (row-left a-row) ;; is a square +; ... (row-mid a-row) ;; is a square +; ... (row-right a-row)) ;; is a square + + + +(define (draw-row row) + (underlay/xy (draw-square(ROW-left row)) (image-width blank) 0 + (underlay/xy (draw-square(ROW-middle row)) (image-width blank) 0 (draw-square(ROW-right row)) ))) + +;;test + +(check-expect (draw-row (make-ROW 'Circle 'cross 'blank)) + (underlay/xy (draw-square 'Circle) (image-width blank) 0 + (underlay/xy (draw-square 'cross ) (image-width blank) 0 (draw-square 'blank) ))) + +(check-expect (draw-row (make-ROW 'Circle 'cross 'blank)) + (underlay/xy (draw-square 'Circle) (image-width blank) 0 + (underlay/xy (draw-square 'cross ) (image-width blank) 0 (draw-square 'blank) ))) + +(check-expect (draw-row (make-ROW 'Circle 'blank 'cross)) + (underlay/xy (draw-square 'Circle) (image-width blank) 0 + (underlay/xy (draw-square 'blank ) (image-width blank) 0 (draw-square 'cross) ))) + +(check-expect (draw-row cross-ROW-blank) + (underlay/xy (draw-square 'cross) (image-width blank) 0 + (underlay/xy (draw-square 'cross ) (image-width blank) 0 (draw-square 'blank) ))) + +(check-expect (draw-row cross-row ) + (underlay/xy (draw-square 'cross) (image-width blank) 0 + (underlay/xy (draw-square 'cross ) (image-width blank) 0 (draw-square 'cross) ))) + +;;define a structure for BOARD +;;contract make-BOARD :image image image->image +(define-struct BOARD (top-row center-row bottom-row) #:transparent) + +;; purpose : defining an empty board +(define empty-board (make-BOARD blank-ROW + blank-ROW + blank-ROW)) + +;;function for creating board with the row + +;template: for draw-board +;(define (a-board-function a-row) +; ... (top-row a-row) ;; is a square +; ... (center-row a-row) ;; is a square +; ... (bottom-row a-row)) ;; is a square + +;;defining the background +(define background (empty-scene width height)) + + +;;this function will reusing the fuction draw-row for creating row +;;contract:row row row->board + +;;test +(check-expect (draw-board (make-BOARD cross-ROW-blank + cross-ROW + cross-row )) + (underlay/xy (draw-row cross-ROW-blank) + 0 (image-height (draw-row cross-ROW)) + (underlay/xy (draw-row cross-ROW) + 0 (image-height (draw-row cross-ROW)) + (draw-row cross-row )))) + +(check-expect (draw-board (make-BOARD cross-circle + (make-ROW 'Circle 'cross 'blank) + circle-cross)) + (underlay/xy (draw-row cross-circle) + 0 (image-height (draw-row cross-circle)) + (underlay/xy (draw-row (make-ROW 'Circle 'cross 'blank)) + 0 (image-height (draw-row(make-ROW 'Circle 'cross 'blank))) + (draw-row circle-cross)))) + +(check-expect(draw-board (make-BOARD cross-circle + (make-ROW 'Circle 'cross 'Circle) + circle-cross)) + (underlay/xy (draw-row cross-circle) + 0 (image-height (draw-row cross-circle)) + (underlay/xy (draw-row (make-ROW 'Circle 'cross 'Circle)) + 0 (image-height (draw-row (make-ROW 'Circle 'cross 'Circle))) + (draw-row circle-cross)))) + +(check-expect (draw-board (make-BOARD (make-ROW 'blank 'cross 'Circle) + (make-ROW 'Circle 'cross 'cross) + circle-cross)) + (underlay/xy (draw-row (make-ROW 'blank 'cross 'Circle)) + 0 (image-height (draw-row (make-ROW 'blank 'cross 'Circle))) + (underlay/xy (draw-row (make-ROW 'Circle 'cross 'cross)) + 0 (image-height (draw-row (make-ROW 'Circle 'cross 'cross))) + (draw-row circle-cross))) ) + +(check-expect (draw-board (make-BOARD (make-ROW 'blank 'cross 'Circle) + (make-ROW 'Circle 'blank 'cross) + (make-ROW 'cross 'blank 'Circle))) + (underlay/xy (draw-row (make-ROW 'blank 'cross 'Circle)) + 0 (image-height (draw-row (make-ROW 'blank 'cross 'Circle))) + (underlay/xy (draw-row (make-ROW 'Circle 'blank 'cross)) + 0 (image-height (draw-row (make-ROW 'Circle 'blank 'cross))) + (draw-row (make-ROW 'cross 'blank 'Circle))))) + + + + +(define (draw-board board) + (underlay/xy (draw-row (BOARD-top-row board)) + 0 (image-height (draw-row (BOARD-top-row board))) + (underlay/xy (draw-row (BOARD-center-row board)) + 0 (image-height (draw-row(BOARD-center-row board))) + (draw-row (BOARD-bottom-row board))))) + +;;purpose: given the x coordinate of the mouse click and returns +;;the symbol 'L, the symbol 'M, or the symbol 'R, +;;depending on whether that X position falls on the right, the middle or the left of the board. +;;contract: which-column:: number -> symbol + +;;test + +(check-expect (which-column (* square-width .5)) 'L) +(check-expect (which-column (* square-width 1.5)) 'M) +(check-expect (which-column (* square-width 2.3)) 'R) + +(define (which-column x-pos) + (cond[(and (>= x-pos 0)(<= x-pos square-width))'L] + [(and (>= x-pos (+ square-width 1))(<= x-pos (* 2 square-width)))'M] + [(and (>= x-pos (+ (* 2 square-width) 1))(<= x-pos (* 3 square-width)))'R] + [else "play in the board,you played outside the square"])) + + + +;;purpose: given the y coordinate of the mouse click and returns +;;the symbol 'T, the symbol 'C, or the symbol 'B, +;;depending on whether that Y position falls on the top, the center or the bottom of the board. +;;contract: which-row:: number -> symbol + +;;test + +(check-expect (which-row (* square-width .6)) 'T) +(check-expect (which-row (* square-width 1.3)) 'C) +(check-expect (which-row (* square-width 2.7)) 'B) + +(define (which-row y-pos) + (cond[(and (>= y-pos 0)(<= y-pos square-width))'T] + [(and (>= y-pos (+ square-width 1))(<= y-pos (* 2 square-width)))'C] + [(and (>= y-pos (+ (* 2 square-width) 1))(<= y-pos (* 3 square-width)))'B] + [else "play in the board,you played outside the square"])) + + + +;;purpose: give the row and the square to be played and returns a new row replacing the left square +;; play-on-left : row square ->row + +;;test +(check-expect (play-on-left (make-ROW 'blank 'cross 'Circle) 'Circle) + (make-ROW 'Circle 'cross 'Circle)) + +(check-expect (play-on-left (make-ROW 'blank 'cross 'Circle) 'cross) + cross-circle) + +(check-expect (play-on-left cross-ROW 'Circle) + (make-ROW 'Circle 'cross 'blank)) +(define (play-on-left row play) + (make-ROW play (ROW-middle row) (ROW-right row))) + + +;;purpose: give the row and the square to be played and returns a new row replacing the middle square +;; play-on-middle : row square ->row + +;;test +(check-expect (play-on-middle (make-ROW 'blank 'blank 'Circle) 'Circle) + (make-ROW 'blank 'Circle 'Circle)) + +(check-expect (play-on-middle (make-ROW 'blank 'blank 'Circle) 'cross) + (make-ROW 'blank 'cross 'Circle)) + +(check-expect (play-on-middle blank-ROW 'Circle) + (make-ROW 'blank 'Circle 'blank)) + +(define (play-on-middle row play) + (make-ROW (ROW-left row) play (ROW-right row))) + + +;;purpose: give the row and the square to be played and returns a new row replacing the right square +;; play-on-right : row square ->row + +;;test +(check-expect (play-on-right blank-ROW 'Circle) + (make-ROW 'blank 'blank 'Circle)) + +(check-expect (play-on-right (make-ROW 'blank 'Circle 'blank) 'cross) + (make-ROW 'blank 'Circle 'cross)) + +(check-expect (play-on-right blank-ROW 'Circle) + (make-ROW 'blank 'blank 'Circle)) + +(define (play-on-right row play) + (make-ROW (ROW-left row) (ROW-middle row) play )) + +;;purpose : given the row, which column ,square to be played returns new row replacing the column +;; play-on-row : row square symbol -> row + +(check-expect (play-on-row blank-ROW 'L 'Circle) + (make-ROW 'Circle 'blank 'blank)) +(check-expect (play-on-row blank-ROW 'M 'Circle) + (make-ROW 'blank 'Circle 'blank)) +(check-expect (play-on-row blank-ROW 'R 'Circle) + (make-ROW 'blank 'blank 'Circle)) + +(define (play-on-row row column-label play) + (cond [(equal? column-label 'L) (make-ROW play (ROW-middle row) (ROW-right row))] + [(equal? column-label 'M) (make-ROW (ROW-left row) play (ROW-right row))] + [(equal? column-label 'R) (make-ROW (ROW-left row) (ROW-middle row) play)] + [else row])) + +;;purpose given a board, a square to be played and the label of the position to be played +;;returns a new board with the square to be played at the labeled position on the top row + +;; play-on-board-at-top : board square symbol -> board +;;test +(check-expect (play-on-board-at-top empty-board 'Circle 'L) + (make-BOARD (make-ROW 'Circle 'blank 'blank) + blank-ROW + blank-ROW)) + + +(check-expect (play-on-board-at-top empty-board 'Circle 'M) + (make-BOARD (make-ROW 'blank 'Circle 'blank) + blank-ROW + blank-ROW)) + + +(check-expect (play-on-board-at-top empty-board 'cross 'R) + (make-BOARD (make-ROW 'blank 'blank 'cross) + blank-ROW + blank-ROW)) + + +(define (play-on-board-at-top board play column-label) + (make-BOARD(play-on-row (BOARD-top-row board) column-label play) + (BOARD-center-row board)(BOARD-bottom-row board)) + ) + + + +;;purpose given a board, a square to be played and the label of the position to be played +;;returns a new board with the square to be played at the labeled position on the middle row + +;; play-on-board-at-top : board square symbol -> board +;;test +(check-expect (play-on-board-at-middle empty-board 'Circle 'L) + (make-BOARD blank-ROW + (make-ROW 'Circle 'blank 'blank) + blank-ROW)) + + +(check-expect (play-on-board-at-middle empty-board 'Circle 'M) + (make-BOARD blank-ROW + (make-ROW 'blank 'Circle 'blank) + blank-ROW)) + + +(check-expect (play-on-board-at-middle empty-board 'cross 'R) + (make-BOARD blank-ROW + (make-ROW 'blank 'blank 'cross) + blank-ROW)) + + +(define (play-on-board-at-middle board play column-label) + (make-BOARD (BOARD-top-row board) (play-on-row (BOARD-center-row board) column-label play) + (BOARD-bottom-row board)) + ) +;;purpose given a board, a square to be played and the label of the position to be played +;;returns a new board with the square to be played at the labeled position on the bottom row + +;; play-on-board-at-top : board square symbol -> board +;;test +(check-expect (play-on-board-at-bottom empty-board 'Circle 'L) + (make-BOARD blank-ROW + blank-ROW + (make-ROW 'Circle 'blank 'blank))) + + +(check-expect (play-on-board-at-bottom empty-board 'Circle 'M) + (make-BOARD blank-ROW + blank-ROW + (make-ROW 'blank 'Circle 'blank))) + + +(check-expect (play-on-board-at-bottom empty-board 'cross 'R) + (make-BOARD blank-ROW + blank-ROW + (make-ROW 'blank 'blank 'cross))) + + +(define (play-on-board-at-bottom board play column-label) + (make-BOARD (BOARD-top-row board) (BOARD-center-row board) + (play-on-row (BOARD-bottom-row board) column-label play) + ) + ) + + +;;purpose :given the board ,square to be played,column and row label and returns a new board +;;with the square to be played at the position reffered +;; play-on-board : board square symbol symbol -> board + +;;test +(check-expect (play-on-board empty-board 'cross 'R 'T) + (make-BOARD (make-ROW 'blank 'blank 'cross ) + blank-ROW + blank-ROW)) + + +(check-expect (play-on-board empty-board 'cross 'L 'C) + (make-BOARD blank-ROW + cross-blank + blank-ROW)) + + +(check-expect (play-on-board empty-board 'cross 'M 'B) + (make-BOARD blank-ROW + blank-ROW + cross-ROW)) + + +(define (play-on-board board play column-label row-label) + (cond [(equal? row-label 'T) (play-on-board-at-top board play column-label)] + [(equal? row-label 'C) (play-on-board-at-middle board play column-label)] + [(equal? row-label 'B) (play-on-board-at-bottom board play column-label)] + [else board])) + + +;;purpose : Given a board structure, a return the image of that board centered on the scene. +;;create-board:board->scene + +;;test +(check-expect (create-board (make-BOARD blank-ROW + blank-ROW + cross-ROW)) + (place-image (draw-board (make-BOARD blank-ROW + blank-ROW + cross-ROW)) + (/ square-width 2)(/ square-width 2) background)) + +(check-expect (create-board (make-BOARD (make-ROW 'Circle 'cross 'Circle) + blank-ROW + cross-ROW)) + (place-image (draw-board (make-BOARD (make-ROW 'Circle 'cross 'Circle) + blank-ROW + cross-ROW)) + (/ square-width 2)(/ square-width 2) background)) + +(check-expect (create-board (make-BOARD (make-ROW 'Circle 'cross 'blank) + blank-ROW + cross-ROW)) + (place-image (draw-board (make-BOARD (make-ROW 'Circle 'cross 'blank) + blank-ROW + cross-ROW)) + (/ square-width 2)(/ square-width 2) background)) + +(define (create-board board) + (place-image (draw-board board)(/ square-width 2)(/ square-width 2) background) + ) + +;; clack1 : Mouse handler. Plays a cross (always a cross) where the mouse is clicked, on button-up. +;; clack1 : board number number symbol -> board + +(define (clack1 board x y event) + (cond [(symbol=? event 'button-up) + (play-on-board board 'cross (which-column x) (which-row y))] + [else board])) + +(check-expect (clack1 (make-BOARD blank-ROW + blank-ROW + cross-ROW) 40 68 'button-up) + (make-BOARD cross-blank + blank-ROW + cross-ROW)) + +(check-expect (clack1 (make-BOARD blank-ROW + blank-ROW + cross-ROW) 160 168 'button-up) + (make-BOARD blank-ROW + (make-ROW 'blank 'cross 'blank) + cross-ROW)) + +(check-expect (clack1 (make-BOARD blank-ROW + blank-ROW + blank-ROW) 310 365 'button-up) + (make-BOARD blank-ROW + blank-ROW + (make-ROW 'blank 'blank 'cross) + )) +;; purpose : Given the current player, return which player goes next. +;; other-player : square -> square + +(define (other-player play) + (cond [(equal? play 'Circle) 'cross] + [(equal? play 'cross) 'Circle])) + +(check-expect (other-player 'cross) 'Circle) +(check-expect (other-player 'Circle) 'cross) + +;; purpose : Given a horz. pos (either 'L, 'M or 'R), finds the content of that square. +;; lookup-square : row symbol -> square + +(define (lookup-square column-label row) + (cond [(equal? column-label 'L)(ROW-left row)] + [(equal? column-label 'M)(ROW-middle row)] + [(equal? column-label 'R)(ROW-right row)])) + +(check-expect(lookup-square 'L (make-ROW 'blank 'Circle 'cross)) 'blank) +(check-expect(lookup-square 'M (make-ROW 'blank 'Circle 'cross)) 'Circle) +(check-expect(lookup-square 'R (make-ROW 'blank 'Circle 'cross)) 'cross) + +;; lookup-row : Given a vert. pos (either 'T, 'C or 'B), finds that row. +;; lookup-row : board symbol -> row + +(define(lookup-row row-label board) + (cond [(equal? row-label 'T)(BOARD-top-row board)] + [(equal? row-label 'C)(BOARD-center-row board)] + [(equal? row-label 'B)(BOARD-bottom-row board)])) + + +(check-expect(lookup-row 'T (make-BOARD (make-ROW 'cross 'blank 'Circle) + blank-ROW + blank-ROW)) (make-ROW 'cross 'blank 'Circle)) + +(check-expect(lookup-row 'C (make-BOARD blank-ROW + (make-ROW 'cross 'blank 'Circle) + blank-ROW)) (make-ROW 'cross 'blank 'Circle)) + +(check-expect(lookup-row 'B (make-BOARD blank-ROW + blank-ROW + (make-ROW 'cross 'blank 'Circle) + )) (make-ROW 'cross 'blank 'Circle)) + +;; lookup : Given a horz. and a vert. pos, finds that square. +;; lookup : board symbol symbol -> square + +(define (lookup board column-label row-label) + (lookup-square column-label (lookup-row row-label board))) + +(check-expect(lookup(make-BOARD (make-ROW 'cross 'blank 'Circle) + blank-ROW + blank-ROW) 'L 'T) 'cross) + +(check-expect(lookup(make-BOARD blank-ROW + (make-ROW 'cross 'blank 'Circle) + blank-ROW) 'M 'C) 'blank) + +(check-expect(lookup(make-BOARD blank-ROW + blank-ROW + (make-ROW 'cross 'blank 'Circle) + ) 'R 'B) 'Circle) + + +;; move-legal? : Return true if the square at horizondal and vertical position is blank. +;; move-legal? : board symbol symbol -> boolean + +(define(move-legal? board column-label row-label) + (equal? (lookup board column-label row-label) 'blank)) + +(check-expect (move-legal? empty-board 'L 'C) true) +(check-expect (move-legal? (make-BOARD blank-ROW + (make-ROW 'Circle 'cross cross) + blank-ROW) + 'M 'C) false) +;;define a structure for game +;;contract make-game :square board number->game +(define-struct GAME (next-player board move-count) #:transparent) + +;;defining the initial-game +(define initial-game (make-GAME 'cross empty-board 0)) + +;;purpose: Given a game and a horz. and vert. position, the next player plays in that square, if legal. The move-count goes up by 1,and the next-player switches hand. +;; play-on-game : game symbol symbol -> game + +(check-expect(play-on-game initial-game 'L 'T) + (make-GAME 'Circle + (make-BOARD cross-blank blank-ROW blank-ROW) 1)) + +(check-expect(play-on-game (make-GAME 'Circle + (make-BOARD cross-blank blank-ROW blank-ROW) 1) + 'M 'C ) + (make-GAME 'cross + (make-BOARD cross-blank + (make-ROW 'blank 'Circle 'blank) + blank-ROW) 2)) +(check-expect(play-on-game(make-GAME 'cross + (make-BOARD cross-blank + (make-ROW 'blank 'Circle 'blank) + blank-ROW) 2) + 'R 'B) + (make-GAME 'Circle + (make-BOARD cross-blank + (make-ROW 'blank 'Circle 'blank) + (make-ROW 'blank 'blank 'cross)) 3)) + +(define (play-on-game game column-label row-label) + (cond [ (move-legal? (GAME-board game) column-label row-label) + (make-GAME (other-player (GAME-next-player game)) + (play-on-board (GAME-board game) (GAME-next-player game) column-label row-label) + (+ (GAME-move-count game) 1))] + [else game])) + +;; game-over? : Returns true when the game is over. +;; game-over? : game -> boolean +(check-expect (game-over? (make-GAME 'Circle (make-BOARD cross-blank + (make-ROW 'blank 'Circle 'blank) + (make-ROW 'blank 'blank 'cross))3)) false) +(check-expect (game-over? (make-GAME 'Circle (make-BOARD cross-ROW-blank + (make-ROW 'blank 'Circle 'blank) + (make-ROW 'blank 'blank 'cross))3)) false) +(check-expect (game-over? (make-GAME 'Circle (make-BOARD cross-circle + (make-ROW 'cross 'Circle 'cross) + (make-ROW 'Circle 'cross 'Circle))9))true) +(define (game-over? game) + (>= (GAME-move-count game) 9)) + + + +;; clack2 : Mouse handler. Plays the game on button-up. +;; clack2 : game number number symbol -> game + +(check-expect (clack2 initial-game 90 90 'button-up) + (make-GAME 'Circle + (make-BOARD cross-blank blank-ROW blank-ROW) 1)) + +(check-expect (clack2 (make-GAME 'Circle + (make-BOARD cross-blank blank-ROW blank-ROW) 1) + 160 160 'button-up) + (make-GAME 'cross + (make-BOARD cross-blank + (make-ROW 'blank 'Circle 'blank) + blank-ROW) 2)) + +(check-expect (clack2 (make-GAME 'cross + (make-BOARD cross-blank + (make-ROW 'blank 'Circle 'blank) + blank-ROW) 2)310 310 'button-up) + (make-GAME 'Circle (make-BOARD cross-blank + (make-ROW 'blank 'Circle 'blank) + (make-ROW 'blank 'blank 'cross)) 3)) + + +(define (clack2 game x y event) + (cond [(symbol=? event 'button-up) + (play-on-game game (which-column x) (which-row y))] + [else game])) + +;; game->scene : Draws a game +;; game->scene : game -> scene + +(check-expect (game->scene (make-GAME 'Circle + (make-BOARD cross-blank blank-ROW blank-ROW) 1)) + (place-image (draw-board (make-BOARD cross-blank blank-ROW blank-ROW)) + (/ square-width 2)(/ square-width 2) background)) + + +(check-expect (game->scene (make-GAME 'cross + (make-BOARD (make-ROW 'cross 'blank 'Circle) blank-ROW blank-ROW) 1)) + (place-image (draw-board (make-BOARD (make-ROW 'cross 'blank 'Circle) blank-ROW blank-ROW)) + (/ square-width 2)(/ square-width 2) background)) + +(define (game->scene game) + (place-image (draw-board (GAME-board game)) (/ square-width 2)(/ square-width 2) background) + ) + + +;; winning-triple? : Return true if a, b, and c are all the same symbol as player. +;; winning-triple? : symbol symbol symbol symbol -> boolean + +(check-expect (winning-triple? 'cross 'cross 'cross 'cross)true) +(check-expect (winning-triple? 'Circle 'Circle 'blank 'cross)false) +(check-expect (winning-triple? 'Circle 'Circle 'Circle 'Circle)true) +(check-expect (winning-triple? 'cross 'blank 'cross 'cross)false) + + +(define (winning-triple? player a b c) + (and(and (equal? player a)(equal? player b))(equal? player c))) + + +;; winning-row? : Returns true if the indicated row is a win for the given player. +;; winning-row? : board square symbol -> boolean + +(check-expect (winning-row? (make-BOARD cross-row + circle-cross + (make-ROW 'Circle 'blank 'blank)) + 'cross 'T)true) + + + +(check-expect (winning-row? (make-BOARD (make-ROW 'cross 'blank 'Circle) + circle-cross + (make-ROW 'blank 'cross 'blank)) + 'Circle 'C)false) + + + +(check-expect (winning-row? (make-BOARD (make-ROW 'cross 'Circle 'blank ) + (make-ROW 'cross 'Circle 'cross) + (make-ROW 'Circle 'Circle 'Circle)) + 'Circle 'B)true) + +(define (winning-row? board player vertical-pos) + (cond[(equal? vertical-pos 'T)(winning-triple? player (ROW-left (BOARD-top-row board)) + (ROW-middle (BOARD-top-row board)) + (ROW-right (BOARD-top-row board)))] + [(equal? vertical-pos 'C)(winning-triple? player (ROW-left (BOARD-center-row board)) + (ROW-middle (BOARD-center-row board)) + (ROW-right (BOARD-center-row board)))] + [(equal? vertical-pos 'B)(winning-triple? player (ROW-left (BOARD-bottom-row board)) + (ROW-middle (BOARD-bottom-row board)) + (ROW-right (BOARD-bottom-row board)))] + [else false] + )) + + +;; winning-column? : Return true if the indicated column is a win for the given player. +;; winnnig-column? : board square symbol -> boolean + + +(check-expect (winning-column? (make-BOARD cross-ROW-blank + circle-cross + cross-blank) + 'cross 'L)true) + + + +(check-expect (winning-column? (make-BOARD circle-cross + circle-cross + (make-ROW 'blank 'Circle 'blank)) + 'Circle 'M)true) + + + +(check-expect (winning-column? (make-BOARD circle-cross + (make-ROW 'cross 'blank 'Circle) + (make-ROW 'Circle 'Circle 'Circle)) + 'Circle 'R)true) + +(check-expect (winning-column? (make-BOARD circle-cross + cross-blank + (make-ROW 'Circle 'Circle 'Circle)) + 'Circle 'R)false) + + +(define (winning-column? board player horizontal-pos) + (cond[(equal? horizontal-pos 'L)(winning-triple? player (ROW-left (BOARD-top-row board)) + (ROW-left (BOARD-center-row board)) + (ROW-left (BOARD-bottom-row board)))] + [(equal? horizontal-pos 'M)(winning-triple? player (ROW-middle (BOARD-top-row board)) + (ROW-middle (BOARD-center-row board)) + (ROW-middle (BOARD-bottom-row board)))] + [(equal? horizontal-pos 'R)(winning-triple? player (ROW-right (BOARD-top-row board)) + (ROW-right (BOARD-center-row board)) + (ROW-right (BOARD-bottom-row board)))] + [else false] + )) + + + +;; winning-down-diagonal? : Return true if the top-left to bottom-right diagonal is a win. +;; winning-down-diagonal? : board square -> boolean + + + + +(check-expect (winning-down-diagonal?(make-BOARD (make-ROW 'Circle 'Circle 'Circle) + (make-ROW 'cross 'Circle 'blank) + (make-ROW 'cross 'blank 'Circle)) + 'Circle)true) + +(check-expect (winning-down-diagonal?(make-BOARD circle-cross + cross-blank + (make-ROW 'Circle 'blank 'Circle)) + 'Circle)false) +(check-expect (winning-down-diagonal?(make-BOARD (make-ROW 'cross 'blank 'cross ) + (make-ROW 'Circle 'cross 'blank) + (make-ROW 'blank 'Circle 'cross)) + 'cross)true) + + +(define (winning-down-diagonal? board player) + (and (equal? player (ROW-right (BOARD-bottom-row board))) (and (equal? player(ROW-middle (BOARD-center-row board))) + (equal? player (ROW-left (BOARD-top-row board)))))) + + +;; winning-up-diagonal? : Return true if the bottom-left to top-right diagonal is a win. +;; winning-up-diagonal? : board square -> boolean + +(check-expect (winning-up-diagonal?(make-BOARD circle-cross + (make-ROW 'cross 'Circle 'blank) + (make-ROW 'Circle 'blank 'Circle)) + 'Circle)true) + +(check-expect (winning-up-diagonal?(make-BOARD circle-cross + cross-blank + (make-ROW 'Circle 'blank 'Circle)) + 'Circle)false) +(check-expect (winning-up-diagonal?(make-BOARD (make-ROW 'cross 'blank 'cross ) + (make-ROW 'Circle 'cross 'blank) + (make-ROW 'cross 'blank 'Circle)) + 'cross)true) + + +(define (winning-up-diagonal? board player) + (and (equal? player (ROW-left (BOARD-bottom-row board))) (and (equal? player(ROW-middle (BOARD-center-row board))) + (equal? player (ROW-right (BOARD-top-row board)))))) + +;; winning-board? : Returns true if the given board is a win for the given player. +;; winning-board? : board square -> boolean + +(check-expect (winning-board? (make-BOARD cross-row + circle-cross + blank-circle) + 'cross)true) + +(check-expect (winning-board? (make-BOARD circle-cross + cross-row + blank-circle) + 'cross)true) +(check-expect (winning-board? (make-BOARD circle-cross + blank-circle + cross-row ) + 'cross)true) + +(check-expect (winning-board? (make-BOARD (make-ROW 'Circle 'cross 'cross) + (make-ROW 'Circle 'cross 'Circle) + blank-circle) + 'Circle)true) +(check-expect (winning-board? (make-BOARD (make-ROW 'cross 'Circle 'cross) + circle-cross + (make-ROW 'Circle 'Circle 'blank)) + 'Circle)true) +(check-expect (winning-board? (make-BOARD cross-circle + circle-cross + (make-ROW 'Circle 'blank 'Circle)) + 'Circle)true) + +(check-expect (winning-board? (make-BOARD cross-circle + circle-cross + blank-circle) + 'Circle)true) +(check-expect (winning-board? (make-BOARD (make-ROW 'cross 'Circle 'cross) + cross-circle + (make-ROW 'Circle 'blank 'cross)) + 'cross)true) + +(define (winning-board? board player) + (or (winning-up-diagonal? board player) + (or (winning-down-diagonal? board player) + (or (winning-row? board player 'T) + (or (winning-row? board player 'C) + (or (winning-row? board player 'B) + (or (winning-column? board player 'L) + (or (winning-column? board player 'M) + (winning-column? board player 'R))))))))) + + + +;; game-over-or-win? : Returns true when the game is over either because the board is full, +;; or because someone won. +;; game-over-or-win? : game -> boolean + +(check-expect (game-over-or-win? (make-GAME 'Circle + (make-BOARD (make-ROW 'cross 'blank 'Circle) blank-ROW blank-ROW) 3))false) + + +(check-expect (game-over-or-win? (make-GAME 'Circle + (make-BOARD (make-ROW 'cross 'blank 'Circle) + (make-ROW 'blank 'cross 'Circle) + (make-ROW 'cross 'blank 'Circle))7))true) + + +(check-expect (game-over-or-win? (make-GAME 'cross + (make-BOARD cross-circle + (make-ROW 'Circle 'cross 'Circle) + (make-ROW 'cross 'Circle 'cross))9)) + true) + +(define (game-over-or-win? game) + (or (winning-board? (GAME-board game) (GAME-next-player game)) + (game-over? game))) + + +(collect-garbage) (collect-garbage) (collect-garbage) +(printf "running tests with fast path optimization in place\n") +(time (run-tests)) +(printf "running tests without fast path optimization in place\n") +(parameterize ([skip-image-equality-fast-path #t]) + (time (run-tests))) diff --git a/collects/2htdp/tests/test-image.ss b/collects/2htdp/tests/test-image.ss index ca20179c10..0c645617c7 100644 --- a/collects/2htdp/tests/test-image.ss +++ b/collects/2htdp/tests/test-image.ss @@ -32,7 +32,9 @@ make-ellipse make-polygon make-point - make-crop ) + make-crop + crop? + normalized-shape?) (only-in "../private/image-more.ss" bring-between swizzle) @@ -1319,6 +1321,37 @@ 2 7 (circle 4 'solid 'black))) +;; this test case checks to make sure the number of crops doesn't +;; grow when normalizing shapes. +(let* ([an-image + (crop + 0 0 50 50 + (crop + 0 10 60 60 + (crop + 10 0 60 60 + (overlay + (overlay + (ellipse 20 50 'solid 'red) + (ellipse 30 40 'solid 'black)) + (overlay + (ellipse 20 50 'solid 'red) + (ellipse 30 40 'solid 'black))))))] + [an-image+crop + (crop 40 40 10 10 an-image)]) + + (define (count-crops s) + (define crops 0) + (let loop ([s s]) + (when (crop? s) + (set! crops (+ crops 1))) + (when (struct? s) + (for-each loop (vector->list (struct->vector s))))) + crops) + + (test (+ (count-crops (normalize-shape (image-shape an-image))) 1) + => + (count-crops (normalize-shape (image-shape an-image+crop))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; @@ -1458,3 +1491,65 @@ #rx"^polygon: expected ") +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; random testing of normalization +;; make sure normalization actually normalizes +;; and that normalization doesn't introduce new structs +;; + +(define (random-image size) + (let loop ([size size]) + (let ([val (random (if (zero? size) 4 8))]) + (case val + [(0) (rectangle (random-size) (random-size) (random-mode) (random-color))] + [(1) (circle (random-size) (random-mode) (random-color))] + [(2) (line (random-coord) (random-coord) (random-color))] + [(3) (add-curve + (rectangle (random-size) (random-size) (random-mode) (random-color)) + (random-coord) (random-coord) (random-pull) (random-angle) + (random-coord) (random-coord) (random-pull) (random-angle) + (random-color))] + [(4) (overlay (loop (floor (/ size 2))) + (loop (ceiling (/ size 2))))] + [(5) (crop (random-coord) (random-coord) (random-size) (random-size) + (loop (- size 1)))] + [(6) (scale/xy (random-size) + (random-size) + (loop (- size 1)))] + [(7) (rotate (random-angle) (loop (- size 1)))])))) + +(define (random-pull) (/ (random 20) (+ 1 (random 10)))) +(define (random-angle) (random 360)) +(define (random-coord) (- (random 200) 100)) +(define (random-size) (random 100)) +(define (random-mode) (if (zero? (random 2)) 'outline 'solid)) +(define (random-color) (pick-from-list '("red" red "blue" "orange" "green" "black"))) +(define (pick-from-list l) (list-ref l (random (length l)))) + +(define (image-struct-count obj) + (let ([counts (make-hash)]) + (let loop ([obj obj]) + (when (struct? obj) + (let ([stuff (vector->list (struct->vector obj))]) + (unless (member (car stuff) '(struct:translate struct:scale)) ;; skip these becuase normalization eliminates them + (hash-set! counts (car stuff) (+ 1 (hash-ref counts (car stuff) 0)))) + (for-each loop (cdr stuff))))) + (sort (hash-map counts list) string<=? #:key (λ (x) (symbol->string (car x)))))) + +(time + (let ([seed (+ 1 (modulo (current-seconds) (- (expt 2 31) 1)))]) + (random-seed seed) + (for ((i (in-range 0 20000))) + (let* ([img (random-image 10)] + [raw-size (image-struct-count (image-shape img))] + [normalized (normalize-shape (image-shape img) values)] + [norm-size (image-struct-count normalized)]) + (unless (normalized-shape? normalized) + (error 'test-image.ss "found a non-normalized shape (seed ~a) after normalization ~s:" + seed + img)) + (unless (equal? norm-size raw-size) + (error 'test-image.ss "found differing sizes (seed ~a):\n ~s\n ~s" + seed + raw-size norm-size)))))) diff --git a/collects/mrlib/image-core.ss b/collects/mrlib/image-core.ss index 96f65a87f0..51444167b6 100644 --- a/collects/mrlib/image-core.ss +++ b/collects/mrlib/image-core.ss @@ -1,5 +1,4 @@ #lang scheme/base - #| This library is the part of the 2htdp/image @@ -157,12 +156,12 @@ has been moved out). (define-struct/reg-mk curve-segment (start s-angle s-pull end e-angle e-pull color) #:transparent #:omit-define-syntaxes) ;; a normalized-shape (subtype of shape) is either -;; - (make-overlay normalized-shape cropped-simple-shape) -;; - cropped-simple-shape +;; - (make-overlay normalized-shape cn-or-simple-shape) +;; - cn-or-simple-shape -;; a cropped-simple-shape is either -;; - (make-crop (listof points) cropped-simple-shape) +;; an cn-or-simple-shape is either: ;; - simple-shape +;; - (make-crop (listof points) normalized-shape) ;; a simple-shape (subtype of shape) is ;; - (make-translate dx dy np-atomic-shape)) @@ -378,25 +377,10 @@ has been moved out). [dy 0] [x-scale 1] [y-scale 1] - [crops '()] ;; (listof (listof point)) [bottom #f]) (define (scale-point p) (make-point (+ dx (* x-scale (point-x p))) (+ dy (* y-scale (point-y p))))) - (define (add-crops shape) - (let loop ([crops crops]) - (cond - [(null? crops) shape] - [(null? (cdr crops)) - (make-crop (car crops) shape)] - [else - (let ([fst (car crops)] - [snd (cadr crops)]) - (cond - [(equal? fst snd) - (loop (cdr crops))] - [else - (make-crop (car crops) (loop (cdr crops)))]))]))) (cond [(translate? shape) (loop (translate-shape shape) @@ -404,7 +388,6 @@ has been moved out). (+ dy (* y-scale (translate-dy shape))) x-scale y-scale - crops bottom)] [(scale? shape) (loop (scale-shape shape) @@ -412,34 +395,36 @@ has been moved out). dy (* x-scale (scale-x shape)) (* y-scale (scale-y shape)) - crops bottom)] [(overlay? shape) (loop (overlay-bottom shape) - dx dy x-scale y-scale crops + dx dy x-scale y-scale (loop (overlay-top shape) - dx dy x-scale y-scale crops + dx dy x-scale y-scale bottom))] [(crop? shape) - (loop (crop-shape shape) - dx dy x-scale y-scale - (cons (map scale-point (crop-points shape)) crops) - bottom)] + (let* ([inside (loop (crop-shape shape) + dx dy x-scale y-scale + #f)] + [this-one + (make-crop (map scale-point (crop-points shape)) + inside)]) + (if bottom + (make-overlay bottom this-one) + this-one))] [(polygon? shape) (let* ([this-one - (add-crops - (make-polygon (map scale-point (polygon-points shape)) - (polygon-mode shape) - (scale-color (polygon-color shape) x-scale y-scale)))]) + (make-polygon (map scale-point (polygon-points shape)) + (polygon-mode shape) + (scale-color (polygon-color shape) x-scale y-scale))]) (if bottom (make-overlay bottom (f this-one)) (f this-one)))] [(line-segment? shape) (let ([this-one - (add-crops - (make-line-segment (scale-point (line-segment-start shape)) - (scale-point (line-segment-end shape)) - (scale-color (line-segment-color shape) x-scale y-scale)))]) + (make-line-segment (scale-point (line-segment-start shape)) + (scale-point (line-segment-end shape)) + (scale-color (line-segment-color shape) x-scale y-scale))]) (if bottom (make-overlay bottom (f this-one)) (f this-one)))] @@ -448,27 +433,40 @@ has been moved out). ;; between the two points when it is drawn, ;; so we don't need to scale it here (let ([this-one - (add-crops - (make-curve-segment (scale-point (curve-segment-start shape)) - (curve-segment-s-angle shape) - (curve-segment-s-pull shape) - (scale-point (curve-segment-end shape)) - (curve-segment-e-angle shape) - (curve-segment-e-pull shape) - (scale-color (curve-segment-color shape) x-scale y-scale)))]) + (make-curve-segment (scale-point (curve-segment-start shape)) + (curve-segment-s-angle shape) + (curve-segment-s-pull shape) + (scale-point (curve-segment-end shape)) + (curve-segment-e-angle shape) + (curve-segment-e-pull shape) + (scale-color (curve-segment-color shape) x-scale y-scale))]) (if bottom (make-overlay bottom (f this-one)) (f this-one)))] [(np-atomic-shape? shape) (let ([this-one - (add-crops - (make-translate dx dy (scale-np-atomic x-scale y-scale shape)))]) + (make-translate dx dy (scale-np-atomic x-scale y-scale shape))]) (if bottom (make-overlay bottom (f this-one)) (f this-one)))] [else (error 'normalize-shape "unknown shape ~s\n" shape)]))) +(define (normalized-shape? s) + (cond + [(overlay? s) + (and (normalized-shape? (overlay-top s)) + (cn-or-simple-shape? (overlay-bottom s)))] + [else + (cn-or-simple-shape? s)])) + +(define (cn-or-simple-shape? s) + (cond + [(crop? s) + (normalized-shape? (crop-shape s))] + [else + (simple-shape? s)])) + (define (simple-shape? shape) (or (and (translate? shape) (np-atomic-shape? (translate-shape shape))) @@ -564,22 +562,30 @@ has been moved out). (define (render-normalized-shape shape dc dx dy) (cond [(overlay? shape) - (render-cropped-simple-shape (overlay-bottom shape) dc dx dy) + (render-cn-or-simple-shape (overlay-bottom shape) dc dx dy) (render-normalized-shape (overlay-top shape) dc dx dy)] [else - (render-cropped-simple-shape shape dc dx dy)])) + (render-cn-or-simple-shape shape dc dx dy)])) -(define (render-cropped-simple-shape shape dc dx dy) +(define last-cropped-points (make-parameter #f)) + +(define (render-cn-or-simple-shape shape dc dx dy) (cond [(crop? shape) - (let ([old-region (send dc get-clipping-region)] - [new-region (new region% [dc dc])] - [path (polygon-points->path (crop-points shape))]) - (send new-region set-path path dx dy) - (when old-region (send new-region intersect old-region)) - (send dc set-clipping-region new-region) - (render-cropped-simple-shape (crop-shape shape) dc dx dy) - (send dc set-clipping-region old-region))] + (let ([points (crop-points shape)]) + (cond + [(equal? points (last-cropped-points)) + (render-normalized-shape (crop-shape shape) dc dx dy)] + [else + (let ([old-region (send dc get-clipping-region)] + [new-region (new region% [dc dc])] + [path (polygon-points->path points)]) + (send new-region set-path path dx dy) + (when old-region (send new-region intersect old-region)) + (send dc set-clipping-region new-region) + (parameterize ([last-cropped-points points]) + (render-normalized-shape (crop-shape shape) dc dx dy)) + (send dc set-clipping-region old-region))]))] [else (render-simple-shape shape dc dx dy)])) @@ -941,4 +947,4 @@ the mask bitmap and the original bitmap are all together in a single bytes! ;; method names (provide get-shape get-bb get-normalized? get-normalized-shape) -(provide np-atomic-shape? atomic-shape? simple-shape?) +(provide np-atomic-shape? atomic-shape? simple-shape? cn-or-simple-shape? normalized-shape?) From fee5ed923d06761423b080dc3a17e7f13f865e7e Mon Sep 17 00:00:00 2001 From: Eli Barzilay Date: Mon, 25 Jan 2010 08:50:06 +0000 Subject: [PATCH 047/113] Welcome to a new PLT day. svn: r17809 --- collects/repos-time-stamp/stamp.ss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/collects/repos-time-stamp/stamp.ss b/collects/repos-time-stamp/stamp.ss index a5fbd371e9..de7a62a627 100644 --- a/collects/repos-time-stamp/stamp.ss +++ b/collects/repos-time-stamp/stamp.ss @@ -1 +1 @@ -#lang scheme/base (provide stamp) (define stamp "24jan2010") +#lang scheme/base (provide stamp) (define stamp "25jan2010") From aee10699ae0fec6585b82fe25496a4c6770d1a7d Mon Sep 17 00:00:00 2001 From: Robby Findler Date: Mon, 25 Jan 2010 12:39:38 +0000 Subject: [PATCH 048/113] made the splash screen always be a dialog box svn: r17810 --- collects/framework/splash.ss | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/collects/framework/splash.ss b/collects/framework/splash.ss index c3fa1f3aad..f2908f2501 100644 --- a/collects/framework/splash.ss +++ b/collects/framework/splash.ss @@ -280,19 +280,11 @@ (define quit-on-close? #t) (define splash-tlw% - (case (system-type) - [(unix) - (class dialog% - (define/augment (on-close) - (when quit-on-close? - (exit))) - (super-new))] - [else - (class frame% - (define/augment (on-close) - (when quit-on-close? - (exit))) - (super-new [style '(no-resize-border)]))])) + (class dialog% + (define/augment (on-close) + (when quit-on-close? + (exit))) + (super-new))) (define splash-canvas% (class canvas% From 530a3eb5e86a388fbe379e93ee5bb9768a017ff1 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Mon, 25 Jan 2010 13:33:42 +0000 Subject: [PATCH 049/113] change R5RS to allow splicing unquote at tail when expression is not a list; merge to 4.2.4 svn: r17811 --- collects/r5rs/main.ss | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/collects/r5rs/main.ss b/collects/r5rs/main.ss index 6e48ff2b52..6fe8f966fd 100644 --- a/collects/r5rs/main.ss +++ b/collects/r5rs/main.ss @@ -209,7 +209,9 @@ form)] [((unquote-splicing e) . rest) (if (zero? depth) - #`(mappend e #,(loop #'rest depth)) + (if (null? (syntax-e #'rest)) + #'e ;; Note: we're not check for a list + #`(mappend e #,(loop #'rest depth))) #`(mcons (mcons 'unquote-splicing #,(loop #'(e) (sub1 depth))) #,(loop #'rest depth)))] From 2cd7fe5499fab307a6b2287111cdb02fa5fb06ab Mon Sep 17 00:00:00 2001 From: Sam Tobin-Hochstadt Date: Mon, 25 Jan 2010 14:46:34 +0000 Subject: [PATCH 050/113] Simplify pattern for expressions in type env. Attempt to avoid doing local-expansion repeatedly. svn: r17812 --- .../typed-scheme/private/base-special-env.ss | 16 +++++++++------- collects/typed-scheme/utils/tc-utils.ss | 16 ++++------------ 2 files changed, 13 insertions(+), 19 deletions(-) diff --git a/collects/typed-scheme/private/base-special-env.ss b/collects/typed-scheme/private/base-special-env.ss index 2d430d8b57..539bd140cf 100644 --- a/collects/typed-scheme/private/base-special-env.ss +++ b/collects/typed-scheme/private/base-special-env.ss @@ -12,13 +12,14 @@ string-constants/string-constant ;(prefix-in ce: test-engine/scheme-tests) (for-syntax - scheme/base syntax/parse + scheme/base syntax/parse mzlib/etc (utils tc-utils) (env init-envs) (except-in (rep filter-rep object-rep type-rep) make-arr) (types convenience union) (only-in (types convenience) [make-arr* make-arr]) - (typecheck tc-structs))) + (typecheck tc-structs)) + (for-meta 2 scheme/base syntax/parse)) (define-for-syntax (initialize-others) @@ -78,11 +79,12 @@ (-> (-lst a) (-val '()) (-lst a)) (-> (-lst a) (-lst b) (-lst (*Un a b))))) ;; make-sequence - [(syntax-parse (local-expand #'(for ([x '()]) x) 'expression #f) - #:context #'make-sequence - #:literals (let-values quote) - [(let-values ([_ (m-s '(_) '())]) . _) - #'m-s]) + [(begin-lifted + (syntax-parse (local-expand #'(for ([x '()]) x) 'expression #f) + #:context #'make-sequence + #:literals (let-values quote) + [(let-values ([_ (m-s '(_) '())]) . _) + #'m-s])) (-poly (a) (let ([seq-vals (lambda ([a a]) diff --git a/collects/typed-scheme/utils/tc-utils.ss b/collects/typed-scheme/utils/tc-utils.ss index ce76d55e58..60f996ecee 100644 --- a/collects/typed-scheme/utils/tc-utils.ss +++ b/collects/typed-scheme/utils/tc-utils.ss @@ -6,7 +6,8 @@ don't depend on any other portion of the system |# (provide (all-defined-out)) -(require "syntax-traversal.ss" syntax/parse (for-syntax scheme/base syntax/parse) scheme/match) +(require "syntax-traversal.ss" syntax/parse (for-syntax scheme/base syntax/parse) scheme/match + (for-syntax unstable/syntax)) ;; a parameter representing the original location of the syntax being currently checked (define current-orig-stx (make-parameter #'here)) @@ -155,17 +156,8 @@ don't depend on any other portion of the system #:attributes (ty id) (pattern [nm:identifier ty] #:with id #'#'nm) - (pattern [e:expr ty extra-mods ...] - #:with id #'(let ([new-ns - (let* ([ns (make-empty-namespace)]) - (namespace-attach-module (current-namespace) - 'scheme/base - ns) - ns)]) - (parameterize ([current-namespace new-ns]) - (namespace-require 'scheme/base) - (namespace-require 'extra-mods) ... - e)))) + (pattern [e:expr ty] + #:with id #'e)) (syntax-parse stx [(_ e:spec ...) #'(list (list e.id e.ty) ...)])) From 674e40a2125009f69bfae76ab31219cb53e024ce Mon Sep 17 00:00:00 2001 From: Sam Tobin-Hochstadt Date: Mon, 25 Jan 2010 15:44:48 +0000 Subject: [PATCH 051/113] Re-enable unexpanded syntax printing. Merge to release. svn: r17815 --- collects/typed-scheme/utils/syntax-traversal.ss | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/collects/typed-scheme/utils/syntax-traversal.ss b/collects/typed-scheme/utils/syntax-traversal.ss index cfdaf4178f..e56836e9a7 100644 --- a/collects/typed-scheme/utils/syntax-traversal.ss +++ b/collects/typed-scheme/utils/syntax-traversal.ss @@ -45,9 +45,7 @@ ;; Look for (the outermost) syntax in `orig' that has the same ;; location as `lookfor' which is coming from the expanded `orig', ;; given in `expanded'. -(define (look-for-in-orig orig expanded lookfor) lookfor) - -#| +(define (look-for-in-orig orig expanded lookfor) (define src (syntax-source orig)) ;(printf "orig : ~a~n" (unwind orig)) ;(printf "expanded : ~a~n" expanded) @@ -73,7 +71,4 @@ enclosing) #;(printf "chose branch two ~a~n" enclosing)))))) -;(trace look-for-in-orig) -|# - From 5f69c8ed4e1dddc415d9aa7574290c5122cd297e Mon Sep 17 00:00:00 2001 From: Robby Findler Date: Mon, 25 Jan 2010 16:04:34 +0000 Subject: [PATCH 052/113] now using redex check to generate random examples (and with more variety than before) svn: r17816 --- collects/2htdp/tests/test-image.ss | 92 ++++++++++++++++-------------- 1 file changed, 49 insertions(+), 43 deletions(-) diff --git a/collects/2htdp/tests/test-image.ss b/collects/2htdp/tests/test-image.ss index 0c645617c7..2372d1a0ec 100644 --- a/collects/2htdp/tests/test-image.ss +++ b/collects/2htdp/tests/test-image.ss @@ -1498,34 +1498,36 @@ ;; and that normalization doesn't introduce new structs ;; -(define (random-image size) - (let loop ([size size]) - (let ([val (random (if (zero? size) 4 8))]) - (case val - [(0) (rectangle (random-size) (random-size) (random-mode) (random-color))] - [(1) (circle (random-size) (random-mode) (random-color))] - [(2) (line (random-coord) (random-coord) (random-color))] - [(3) (add-curve - (rectangle (random-size) (random-size) (random-mode) (random-color)) - (random-coord) (random-coord) (random-pull) (random-angle) - (random-coord) (random-coord) (random-pull) (random-angle) - (random-color))] - [(4) (overlay (loop (floor (/ size 2))) - (loop (ceiling (/ size 2))))] - [(5) (crop (random-coord) (random-coord) (random-size) (random-size) - (loop (- size 1)))] - [(6) (scale/xy (random-size) - (random-size) - (loop (- size 1)))] - [(7) (rotate (random-angle) (loop (- size 1)))])))) +(require redex/reduction-semantics) -(define (random-pull) (/ (random 20) (+ 1 (random 10)))) -(define (random-angle) (random 360)) -(define (random-coord) (- (random 200) 100)) -(define (random-size) (random 100)) -(define (random-mode) (if (zero? (random 2)) 'outline 'solid)) -(define (random-color) (pick-from-list '("red" red "blue" "orange" "green" "black"))) -(define (pick-from-list l) (list-ref l (random (length l)))) +(define-language 2htdp/image + (image (rectangle size size mode color) + (line coord coord color) + (add-curve (rectangle size size mode color) + coord coord pull angle + coord coord pull angle + color) + (overlay image image) + (overlay/xy image coord coord image) + (underlay image image) + (underlay/xy image coord coord image) + (crop coord coord size size image) + (scale/xy size size image) + (scale size image) + (rotate angle image)) + + (size big-nat) + (mode 'outline 'solid "outline" "solid") + (color "red" 'red "blue" "orange" "green" "black") + (coord big-int) + (pull 0 1/2 1/3 2 (/ big-nat (+ 1 big-nat))) + (angle 0 90 45 30 180 natural (* 4 natural)) + + ; Redex tends to choose small numbers. + (big-nat (+ (* 10 natural) natural)) + (big-int (+ (* 10 integer) integer))) + +(define-namespace-anchor anchor) (define (image-struct-count obj) (let ([counts (make-hash)]) @@ -1535,21 +1537,25 @@ (unless (member (car stuff) '(struct:translate struct:scale)) ;; skip these becuase normalization eliminates them (hash-set! counts (car stuff) (+ 1 (hash-ref counts (car stuff) 0)))) (for-each loop (cdr stuff))))) - (sort (hash-map counts list) string<=? #:key (λ (x) (symbol->string (car x)))))) + (sort (hash-map counts list) string<=? #:key (λ (x) (symbol->string (car x)))))) + +(define (check-image-properties img-sexp img) + (let* ([raw-size (image-struct-count (image-shape img))] + [normalized (normalize-shape (image-shape img) values)] + [norm-size (image-struct-count normalized)]) + (unless (normalized-shape? normalized) + (error 'test-image.ss "found a non-normalized shape after normalization:\n~s" + img-sexp)) + (unless (equal? norm-size raw-size) + (error 'test-image.ss "found differing sizes for ~s:\n ~s\n ~s" + img-sexp raw-size norm-size)))) (time - (let ([seed (+ 1 (modulo (current-seconds) (- (expt 2 31) 1)))]) - (random-seed seed) - (for ((i (in-range 0 20000))) - (let* ([img (random-image 10)] - [raw-size (image-struct-count (image-shape img))] - [normalized (normalize-shape (image-shape img) values)] - [norm-size (image-struct-count normalized)]) - (unless (normalized-shape? normalized) - (error 'test-image.ss "found a non-normalized shape (seed ~a) after normalization ~s:" - seed - img)) - (unless (equal? norm-size raw-size) - (error 'test-image.ss "found differing sizes (seed ~a):\n ~s\n ~s" - seed - raw-size norm-size)))))) + (redex-check + 2htdp/image + image + (check-image-properties + (term image) + (eval (term image) (namespace-anchor->namespace anchor))) + #:attempts 1000)) + From 5f8c18a7efb7ddcee93a124d20f6bdc0536b529b Mon Sep 17 00:00:00 2001 From: Kevin Tew Date: Mon, 25 Jan 2010 16:11:22 +0000 Subject: [PATCH 053/113] places exit handler svn: r17817 --- src/mzscheme/src/mzrt.c | 12 +++++++++ src/mzscheme/src/mzrt.h | 1 + src/mzscheme/src/places.c | 55 ++++++++++++++++++++++++++------------- 3 files changed, 50 insertions(+), 18 deletions(-) diff --git a/src/mzscheme/src/mzrt.c b/src/mzscheme/src/mzrt.c index 17fc1e8f1a..f6232cd5b1 100644 --- a/src/mzscheme/src/mzrt.c +++ b/src/mzscheme/src/mzrt.c @@ -253,6 +253,18 @@ int mz_proc_thread_detach(mz_proc_thread *thread) { #endif } +void mz_proc_thread_exit(void *rc) { +#ifdef WIN32 + ExitThread((DWORD)rc); +#else +# ifndef MZ_PRECISE_GC + pthread_exit(rc); +# else + pthread_exit(rc); +# endif +#endif +} + /***********************************************************************/ /* RW Lock */ /***********************************************************************/ diff --git a/src/mzscheme/src/mzrt.h b/src/mzscheme/src/mzrt.h index a18ab2d349..162323672b 100644 --- a/src/mzscheme/src/mzrt.h +++ b/src/mzscheme/src/mzrt.h @@ -46,6 +46,7 @@ mz_proc_thread* mzrt_proc_first_thread_init(); mz_proc_thread* mz_proc_thread_create(mz_proc_thread_start*, void* data); void *mz_proc_thread_wait(mz_proc_thread *thread); int mz_proc_thread_detach(mz_proc_thread *thread); +void mz_proc_thread_exit(void *rc); void mzrt_sleep(int seconds); diff --git a/src/mzscheme/src/places.c b/src/mzscheme/src/places.c index 93192b60a9..2626eac8fd 100644 --- a/src/mzscheme/src/places.c +++ b/src/mzscheme/src/places.c @@ -7,6 +7,7 @@ #include "mzrt.h" +READ_ONLY static Scheme_Object *scheme_def_place_exit_proc; SHARED_OK mz_proc_thread *scheme_master_proc_thread; THREAD_LOCAL_DECL(mz_proc_thread *proc_thread_self); @@ -17,6 +18,7 @@ static Scheme_Object *scheme_place_p(int argc, Scheme_Object *args[]); static Scheme_Object *scheme_places_deep_copy_in_master(Scheme_Object *so); static Scheme_Object *scheme_place_send(int argc, Scheme_Object *args[]); static Scheme_Object *scheme_place_recv(int argc, Scheme_Object *args[]); +static Scheme_Object *def_place_exit_handler_proc(int argc, Scheme_Object *args[]); Scheme_Object *scheme_place_async_channel_create(); void scheme_place_async_send(Scheme_Place_Async_Channel *ch, Scheme_Object *o); @@ -42,7 +44,6 @@ static Scheme_Object *not_implemented(int argc, Scheme_Object **argv) # ifdef MZ_PRECISE_GC static void register_traversers(void) { } - # endif #endif @@ -67,7 +68,12 @@ void scheme_init_place(Scheme_Env *env) PLACE_PRIM_W_ARITY("place-ch-send", scheme_place_send, 1, 2, plenv); PLACE_PRIM_W_ARITY("place-ch-recv", scheme_place_recv, 1, 1, plenv); +#ifdef MZ_USE_PLACES + REGISTER_SO(scheme_def_place_exit_proc); + scheme_def_place_exit_proc = scheme_make_prim_w_arity(def_place_exit_handler_proc, "default-place-exit-handler", 1, 1); +#endif scheme_finish_primitive_module(plenv); + } #ifdef MZ_USE_PLACES @@ -86,6 +92,21 @@ typedef struct Place_Start_Data { mzrt_sema *ready; } Place_Start_Data; +static Scheme_Object *def_place_exit_handler_proc(int argc, Scheme_Object *argv[]) +{ + long status; + + if (SCHEME_INTP(argv[0])) { + status = SCHEME_INT_VAL(argv[0]); + if (status < 1 || status > 255) + status = 0; + } else + status = 0; + + mz_proc_thread_exit((void *) status); + return scheme_void; /* Never get here */ +} + static void null_out_runtime_globals() { scheme_current_thread = NULL; scheme_first_thread = NULL; @@ -155,7 +176,7 @@ Scheme_Object *scheme_place(int argc, Scheme_Object *args[]) { return (Scheme_Object*) place; } -#ifdef MZ_PRECISE_GC +# ifdef MZ_PRECISE_GC /*============= SIGNAL HANDLER =============*/ #include #include @@ -324,13 +345,13 @@ static int place_wait_ready(Scheme_Object *o) { } return 0; } -#endif +# endif static Scheme_Object *scheme_place_wait(int argc, Scheme_Object *args[]) { Scheme_Place *place; place = (Scheme_Place *) args[0]; -#ifdef MZ_PRECISE_GC +# ifdef MZ_PRECISE_GC { Scheme_Object *rc; mz_proc_thread *worker_thread; @@ -353,13 +374,13 @@ static Scheme_Object *scheme_place_wait(int argc, Scheme_Object *args[]) { free(wd); return rc; } -#else +# else { void *rcvoid; rcvoid = mz_proc_thread_wait((mz_proc_thread *)place->proc_thread); return scheme_make_integer((long) rcvoid); } -#endif +# endif } static Scheme_Object *scheme_place_p(int argc, Scheme_Object *args[]) @@ -447,6 +468,8 @@ static void *place_start_proc(void *data_arg) { /* at point point, don't refer to place_data or its content anymore, because it's allocated in the other place */ + scheme_set_root_param(MZCONFIG_EXIT_HANDLER, scheme_def_place_exit_proc); + { Scheme_Thread * volatile p; mz_jmp_buf * volatile saved_error_buf; @@ -473,11 +496,11 @@ static void *place_start_proc(void *data_arg) { } Scheme_Object *scheme_places_deep_copy_in_master(Scheme_Object *so) { -#if defined(MZ_USE_PLACES) && defined(MZ_PRECISE_GC) +# if defined(MZ_USE_PLACES) && defined(MZ_PRECISE_GC) void *return_payload; return_payload = scheme_master_fast_path(5, so); return (Scheme_Object*) return_payload; -#endif +# endif return so; } @@ -503,9 +526,7 @@ Scheme_Object *scheme_place_recv(int argc, Scheme_Object *args[]) { return scheme_true; } -#ifdef MZ_PRECISE_GC -static void* scheme_master_place_handlemsg(int msg_type, void *msg_payload); - +# ifdef MZ_PRECISE_GC static void* scheme_master_place_handlemsg(int msg_type, void *msg_payload) { switch(msg_type) { @@ -542,13 +563,13 @@ void* scheme_master_fast_path(int msg_type, void *msg_payload) { Scheme_Object *o; void *original_gc; -#ifdef MZ_PRECISE_GC +# ifdef MZ_PRECISE_GC original_gc = GC_switch_to_master_gc(); -#endif +# endif o = scheme_master_place_handlemsg(msg_type, msg_payload); -#ifdef MZ_PRECISE_GC +# ifdef MZ_PRECISE_GC GC_switch_back_from_master(original_gc); -#endif +# endif return o; } @@ -562,8 +583,7 @@ void scheme_spawn_master_place() { scheme_master_proc_thread = (void*) ~0; } - -#endif +# endif /*========================================================================*/ /* places async channels */ @@ -657,7 +677,6 @@ Scheme_Object *scheme_place_async_recv(Scheme_Place_Async_Channel *ch) { return msg; } - /*========================================================================*/ /* precise GC traversers */ /*========================================================================*/ From 7114cdf51e7ab1e6b20e36d2c29f3e3b18761140 Mon Sep 17 00:00:00 2001 From: Kevin Tew Date: Mon, 25 Jan 2010 16:11:34 +0000 Subject: [PATCH 054/113] Inital places documentation svn: r17818 --- collects/scribblings/places/info.ss | 3 + collects/scribblings/places/places.scrbl | 90 ++++++++++++++++++++++++ src/mzscheme/src/places.c | 8 +++ 3 files changed, 101 insertions(+) create mode 100644 collects/scribblings/places/info.ss create mode 100644 collects/scribblings/places/places.scrbl diff --git a/collects/scribblings/places/info.ss b/collects/scribblings/places/info.ss new file mode 100644 index 0000000000..22fe7bf873 --- /dev/null +++ b/collects/scribblings/places/info.ss @@ -0,0 +1,3 @@ +#lang setup/infotab + +(define scribblings '(("places.scrbl" ()))) diff --git a/collects/scribblings/places/places.scrbl b/collects/scribblings/places/places.scrbl new file mode 100644 index 0000000000..7c518458e1 --- /dev/null +++ b/collects/scribblings/places/places.scrbl @@ -0,0 +1,90 @@ +#lang scribble/doc + +@title{@bold{Places}: Coarse-grained Parallelism} + +@; ---------------------------------------------------------------------- + +@(require scribble/manual + scribble/urls + scribble/struct + (for-label scheme + scheme/base + scheme/contract + scheme/place)) + +@; ---------------------------------------------------------------------- + +The PLT futures API enables the development of parallel programs which +take advantage of machines with multiple processors, cores, or +hardware threads. + +@defmodule[scheme/place]{} + +@defproc[(place [module-path module-path?] [start-proc proc?] [place-channel place-ch?]) place?]{ + Starts running @scheme[start-proc] in parallel. scheme[start-proc] must + be a function defined in @scheme[module-path]. The @scheme[place] + procedure returns immediately with a place descriptor value. +} + +@defproc[(place-wait [p place?]) exact-integer?]{ + Returns the return value of a completed place @scheme[p], blocking until + the place completes (if it has not already completed). +} + +@defproc[(place? [x any/c]) boolean?]{ + Returns @scheme[#t] if @scheme[x] is a place. +} + +@defproc[(place-ch-send [ch place-ch?] [x any/c]) void]{ + Sends an immutable message @scheme[x] on channel @scheme[ch]. +} + +@defproc[(place-ch-recv [p place-ch?]) any/c]{ + Returns an immutable message received on channel @scheme[ch]. +} + +@defproc[(place-ch? [x any/c]) boolean?]{ + Returns @scheme[#t] if @scheme[x] is a place-ch. +} + +@section[#:tag "example"]{How Do I Keep Those Cores Busy?} + +This code launches two places passing 1 and 2 as the initial channels +and then waits for the places to complete and return. + +@schemeblock[ + (let ((pls (map (lambda (x) (place "place_worker.ss" 'place-main x)) + (list 1 2)))) + (map place-wait pls)) +] + +This is the code for the place_worker.ss module that each place will execute. + +@schemeblock[ +(module place_worker scheme + (provide place-main) + + (define (place-main x) + (printf "IN PLACE ~a~n" x))) +] + + +@section[#:tag "messagepassingparallelism"]{Message Passing Parallelism} + +Places can only communicate by passing immutable messages on place-channels. + +@section[#:tag "logging"]{Architecture and Garbage Collection} + +Immutable messages communicated on place-channels are first copied to a shared +garbage collector called the master. The master waits on a barrier until all places garbage +collectors have collected. Once the master is released it collects and resets +the barrier. + +@section[#:tag "compiling"]{Enabling Places in MzScheme Builds} + +PLT's parallel-places support is only enabled if you pass +@DFlag{enable-places} to @exec{configure} when you build PLT (and +that build currently only works with @exec{mzscheme}, not with +@exec{mred}). When parallel-future support is not enabled, +@scheme[place] usage is a syntax error. +@; @FIXME{use threads to emulate places maybe?} diff --git a/src/mzscheme/src/places.c b/src/mzscheme/src/places.c index 2626eac8fd..eb9566a314 100644 --- a/src/mzscheme/src/places.c +++ b/src/mzscheme/src/places.c @@ -18,6 +18,7 @@ static Scheme_Object *scheme_place_p(int argc, Scheme_Object *args[]); static Scheme_Object *scheme_places_deep_copy_in_master(Scheme_Object *so); static Scheme_Object *scheme_place_send(int argc, Scheme_Object *args[]); static Scheme_Object *scheme_place_recv(int argc, Scheme_Object *args[]); +static Scheme_Object *scheme_place_ch_p(int argc, Scheme_Object *args[]); static Scheme_Object *def_place_exit_handler_proc(int argc, Scheme_Object *args[]); Scheme_Object *scheme_place_async_channel_create(); @@ -67,6 +68,7 @@ void scheme_init_place(Scheme_Env *env) PLACE_PRIM_W_ARITY("place?", scheme_place_p, 1, 1, plenv); PLACE_PRIM_W_ARITY("place-ch-send", scheme_place_send, 1, 2, plenv); PLACE_PRIM_W_ARITY("place-ch-recv", scheme_place_recv, 1, 1, plenv); + PLACE_PRIM_W_ARITY("place-ch?", scheme_place_ch_p, 1, 1, plenv); #ifdef MZ_USE_PLACES REGISTER_SO(scheme_def_place_exit_proc); @@ -620,6 +622,12 @@ Scheme_Object *scheme_place_async_channel_create() { return (Scheme_Object *)ch; } +static Scheme_Object *scheme_place_ch_p(int argc, Scheme_Object *args[]) +{ + return SAME_TYPE(SCHEME_TYPE(args[0]), scheme_place_async_channel_type) ? scheme_true : scheme_false; +} + + void scheme_place_async_send(Scheme_Place_Async_Channel *ch, Scheme_Object *o) { int cnt; mzrt_mutex_lock(ch->lock); From e493ba5c6ad1a53b01a50b2a80592baa694ece91 Mon Sep 17 00:00:00 2001 From: Sam Tobin-Hochstadt Date: Mon, 25 Jan 2010 17:23:19 +0000 Subject: [PATCH 055/113] improve internal error messages svn: r17819 --- collects/typed-scheme/utils/tc-utils.ss | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/collects/typed-scheme/utils/tc-utils.ss b/collects/typed-scheme/utils/tc-utils.ss index 60f996ecee..69c990e80b 100644 --- a/collects/typed-scheme/utils/tc-utils.ss +++ b/collects/typed-scheme/utils/tc-utils.ss @@ -6,7 +6,9 @@ don't depend on any other portion of the system |# (provide (all-defined-out)) -(require "syntax-traversal.ss" syntax/parse (for-syntax scheme/base syntax/parse) scheme/match +(require "syntax-traversal.ss" + "utils.ss" + syntax/parse (for-syntax scheme/base syntax/parse) scheme/match (for-syntax unstable/syntax)) ;; a parameter representing the original location of the syntax being currently checked @@ -127,11 +129,14 @@ don't depend on any other portion of the system (define-struct (exn:fail:tc exn:fail) ()) ;; raise an internal error - typechecker bug! -(define (int-err msg . args) - (raise (make-exn:fail:tc (string-append "Internal Typechecker Error: " - (apply format msg args) - (format "\nwhile typechecking\n~a" (syntax->datum (current-orig-stx)))) - (current-continuation-marks)))) +(define (int-err msg . args) + (parameterize ([custom-printer #t]) + (raise (make-exn:fail:tc (string-append "Internal Typechecker Error: " + (apply format msg args) + (format "\nwhile typechecking\n~aoriginally\n~a" + (syntax->datum (current-orig-stx)) + (syntax->datum (locate-stx (current-orig-stx))))) + (current-continuation-marks))))) (define-syntax (nyi stx) (syntax-case stx () From bb541fd03fa0b35e22f0c82f6c9b3a8a6d5b0591 Mon Sep 17 00:00:00 2001 From: Sam Tobin-Hochstadt Date: Mon, 25 Jan 2010 18:38:56 +0000 Subject: [PATCH 056/113] Improve `internal-forms' First step to custom predicates in `define-typed-struct-internal' svn: r17820 --- .../typed-scheme/typecheck/internal-forms.ss | 23 +++++++++++-------- collects/typed-scheme/typecheck/tc-structs.ss | 7 +++++- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/collects/typed-scheme/typecheck/internal-forms.ss b/collects/typed-scheme/typecheck/internal-forms.ss index a0ce6e9cb0..5c5b6387f1 100644 --- a/collects/typed-scheme/typecheck/internal-forms.ss +++ b/collects/typed-scheme/typecheck/internal-forms.ss @@ -1,16 +1,21 @@ #lang scheme/base -(require (for-syntax scheme/base)) +(require (for-syntax scheme/base) + syntax/parse) -(define-syntax-rule (internal-forms nms ...) +(define-syntax-rule (internal-forms set-name nms ...) (begin - (provide nms ...) + (provide nms ... set-name) + (define-literal-set set-name (nms ...)) (define-syntax (nms stx) (raise-syntax-error 'typecheck "Internal typechecker form used out of context" stx)) ...)) -(internal-forms require/typed-internal define-type-alias-internal - define-typed-struct-internal - define-typed-struct/exec-internal - assert-predicate-internal - declare-refinement-internal - :-internal) +(internal-forms internal-literals + require/typed-internal + define-type-alias-internal + define-type-internal + define-typed-struct-internal + define-typed-struct/exec-internal + assert-predicate-internal + declare-refinement-internal + :-internal) diff --git a/collects/typed-scheme/typecheck/tc-structs.ss b/collects/typed-scheme/typecheck/tc-structs.ss index 99fd72e6f0..634d1dd950 100644 --- a/collects/typed-scheme/typecheck/tc-structs.ss +++ b/collects/typed-scheme/typecheck/tc-structs.ss @@ -90,6 +90,7 @@ #:mutable [setters? #f] #:proc-ty [proc-ty #f] #:maker [maker* #f] + #:predicate [pred* #f] #:constructor-return [cret #f] #:poly? [poly? #f] #:type-only [type-only #f]) @@ -107,6 +108,7 @@ #:type-wrapper type-wrapper #:pred-wrapper pred-wrapper #:maker (or maker* maker) + #:predicate (or pred* pred) #:constructor-return cret)))) ;; generate names, and register the approriate types give field types and structure type @@ -117,6 +119,7 @@ #:type-wrapper [type-wrapper values] #:pred-wrapper [pred-wrapper values] #:maker [maker* #f] + #:predicate [pred* #f] #:constructor-return [cret #f]) ;; create the approriate names that define-struct will bind (define-values (maker pred getters setters) (struct-names nm flds setters?)) @@ -127,7 +130,7 @@ (append (list (cons (or maker* maker) (wrapper (->* external-fld-types (if cret cret name)))) - (cons pred + (cons (or pred* pred) (make-pred-ty (pred-wrapper name)))) (for/list ([g (in-list getters)] [t (in-list external-fld-types/no-parent)] [i (in-naturals)]) (let ([func (if setters? @@ -185,6 +188,7 @@ ;; tc/struct : (U identifier (list identifier identifier)) Listof[identifier] Listof[syntax] -> void (define (tc/struct nm/par flds tys [proc-ty #f] #:maker [maker #f] #:constructor-return [cret #f] #:mutable [mutable #f] + #:predicate [pred #f] #:type-only [type-only #f]) ;; get the parent info and create some types and type variables (define-values (nm parent-name parent name name-tvar) (parse-parent nm/par)) @@ -200,6 +204,7 @@ ;; procedure #:proc-ty proc-ty-parsed #:maker maker + #:predicate pred #:constructor-return (and cret (parse-type cret)) #:mutable mutable #:type-only type-only)) From 9dccfcbe28cf06701f7f227b47fb3fe40017fcb2 Mon Sep 17 00:00:00 2001 From: Jon Rafkind Date: Mon, 25 Jan 2010 18:51:34 +0000 Subject: [PATCH 057/113] factor out common expressions for better performance. thanks to ryan svn: r17821 --- collects/honu/private/honu-typed-scheme.ss | 30 +++++++++++++++++----- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/collects/honu/private/honu-typed-scheme.ss b/collects/honu/private/honu-typed-scheme.ss index 1c767b9618..2e76837023 100644 --- a/collects/honu/private/honu-typed-scheme.ss +++ b/collects/honu/private/honu-typed-scheme.ss @@ -22,10 +22,10 @@ ;; macro for defining literal tokens that can be used in macros (define-syntax-rule (define-literal name ...) (begin - (define-syntax name (lambda (stx) - (raise-syntax-error 'name - "this is a literal and cannot be used outside a macro"))) - ...)) + (define-syntax name (lambda (stx) + (raise-syntax-error 'name + "this is a literal and cannot be used outside a macro"))) + ...)) (define-literal honu-return) (define-literal semicolon) @@ -43,9 +43,9 @@ (define-values (struct:honu-trans make-honu-trans honu-trans? honu-trans-ref honu-trans-set!) - (make-struct-type 'honu-trans #f 1 0 #f - (list (list prop:honu-transformer #t)) - (current-inspector) 0)) + (make-struct-type 'honu-trans #f 1 0 #f + (list (list prop:honu-transformer #t)) + (current-inspector) 0)) (define (make-honu-transformer proc) (unless (and (procedure? proc) @@ -375,6 +375,22 @@ x(2) [pattern (~seq x:number) #:with result #'x] ) + (define-syntax-rule (define-infix-operator name next [operator reducer] ...) + (begin + (define-syntax-class operator-class + #:literals (operator ...) + (pattern operator #:attr func reducer) + ...) + (define-splicing-syntax-class name + (pattern (~seq (~var left next) + (~optional (~seq (~var op operator-class) (~var right name)))) + #:with result + (cond [(attribute right) + ((attribute op.func) #'left.result #'right.result)] + [else + #'left.result]))))) + + #; (define-syntax-rule (define-infix-operator name next [operator reducer] ...) (define-splicing-syntax-class name #:literals (operator ...) From c9b246a8d2f15a27cc438b8827ec6eef0232b16e Mon Sep 17 00:00:00 2001 From: Sam Tobin-Hochstadt Date: Mon, 25 Jan 2010 19:35:56 +0000 Subject: [PATCH 058/113] use syntax-parse support #:predicate option to `define-typed-struct-internal' svn: r17822 --- .../typed-scheme/typecheck/tc-toplevel.ss | 35 ++++++++++++------- 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/collects/typed-scheme/typecheck/tc-toplevel.ss b/collects/typed-scheme/typecheck/tc-toplevel.ss index 328123f615..5d0a6532db 100644 --- a/collects/typed-scheme/typecheck/tc-toplevel.ss +++ b/collects/typed-scheme/typecheck/tc-toplevel.ss @@ -3,11 +3,13 @@ (require (rename-in "../utils/utils.ss" [infer r:infer])) (require syntax/kerncase - unstable/list unstable/syntax + unstable/list unstable/syntax syntax/parse mzlib/etc scheme/match "signatures.ss" "tc-structs.ss" + ;; to appease syntax-parse + "internal-forms.ss" (rep type-rep) (types utils convenience) (private parse-type type-annotation type-contract) @@ -29,13 +31,17 @@ ;; first, find the mutated variables: (find-mutated-vars form) (parameterize ([current-orig-stx form]) - (kernel-syntax-case* form #f (define-type-alias-internal define-typed-struct-internal define-type-internal - define-typed-struct/exec-internal :-internal assert-predicate-internal - require/typed-internal values) + (syntax-parse form + #:literals (values define-type-alias-internal define-typed-struct-internal define-type-internal + define-typed-struct/exec-internal :-internal assert-predicate-internal + require/typed-internal declare-refinement-internal + define-values quote-syntax #%plain-app begin) + ;#:literal-sets (kernel-literals) + ;; forms that are handled in other ways [stx - (or (syntax-property form 'typechecker:ignore) - (syntax-property form 'typechecker:ignore-some)) + #:when (or (syntax-property form 'typechecker:ignore) + (syntax-property form 'typechecker:ignore-some)) (list)] ;; type aliases have already been handled by an earlier pass @@ -72,9 +78,16 @@ (tc/struct #'nm (syntax->list #'(fld ...)) (syntax->list #'(ty ...)))] [(define-values () (begin (quote-syntax (define-typed-struct-internal nm ([fld : ty] ...) #:mutable)) (#%plain-app values))) (tc/struct #'nm (syntax->list #'(fld ...)) (syntax->list #'(ty ...)) #:mutable #t)] - [(define-values () (begin (quote-syntax (define-typed-struct-internal nm ([fld : ty] ...) #:maker m #:constructor-return t)) + [(define-values () (begin (quote-syntax (define-typed-struct-internal nm ([fld : ty] ...) + #:maker m #:constructor-return t #:predicate p)) (#%plain-app values))) - (tc/struct #'nm (syntax->list #'(fld ...)) (syntax->list #'(ty ...)) #:maker #'m #:constructor-return #'t)] + (tc/struct #'nm (syntax->list #'(fld ...)) (syntax->list #'(ty ...)) + #:maker #'m #:constructor-return #'t #:predicate #'p)] + [(define-values () (begin (quote-syntax (define-typed-struct-internal nm ([fld : ty] ...) + #:maker m #:constructor-return t)) + (#%plain-app values))) + (tc/struct #'nm (syntax->list #'(fld ...)) (syntax->list #'(ty ...)) + #:maker #'m #:constructor-return #'t)] [(define-values () (begin (quote-syntax (define-typed-struct-internal nm ([fld : ty] ...) #:type-only)) (#%plain-app values))) (tc/struct #'nm (syntax->list #'(fld ...)) (syntax->list #'(ty ...)) #:type-only #t)] @@ -91,8 +104,7 @@ (register-type #'pred (make-pred-ty (parse-type #'ty)))] ;; top-level type annotation - [(define-values () (begin (quote-syntax (:-internal id ty)) (#%plain-app values))) - (identifier? #'id) + [(define-values () (begin (quote-syntax (:-internal id:identifier ty)) (#%plain-app values))) (register-type/undefined #'id (parse-type #'ty))] @@ -128,8 +140,7 @@ (apply append (filter list? (map tc-toplevel/pass1 (syntax->list #'rest))))] ;; define-syntaxes just get noted - [(define-syntaxes (var ...) . rest) - (andmap identifier? (syntax->list #'(var ...))) + [(define-syntaxes (var:id ...) . rest) (map make-def-stx-binding (syntax->list #'(var ...)))] ;; otherwise, do nothing in this pass From af2ef07d05adc6ca454467f3f9fd3ed8a8f5a501 Mon Sep 17 00:00:00 2001 From: Sam Tobin-Hochstadt Date: Mon, 25 Jan 2010 19:51:16 +0000 Subject: [PATCH 059/113] Fix the handling of with-handlers that returns multiple values svn: r17823 --- .../typecheck/check-subforms-unit.ss | 44 +++++++++++-------- 1 file changed, 26 insertions(+), 18 deletions(-) diff --git a/collects/typed-scheme/typecheck/check-subforms-unit.ss b/collects/typed-scheme/typecheck/check-subforms-unit.ss index ea97a7f1fd..037822e2ee 100644 --- a/collects/typed-scheme/typecheck/check-subforms-unit.ss +++ b/collects/typed-scheme/typecheck/check-subforms-unit.ss @@ -2,6 +2,7 @@ (require "../utils/utils.ss" syntax/kerncase + syntax/parse scheme/match "signatures.ss" "tc-metafunctions.ss" (types utils convenience union subtype) @@ -18,33 +19,40 @@ (define body-ty #f) (define (get-result-ty t) (match t - [(Function: (list (arr: _ (Values: (list (Result: rngs _ _))) #f _ '()) ...)) (apply Un rngs)] - [_ (tc-error "Internal error in get-result-ty: not a function type: ~n~a" t)])) + [(Function: + (list + (arr: _ + (Values: (list (Result: rngs _ _) ...)) + _ _ (list (Keyword: _ _ #t) ...)))) + (apply Un rngs)] + [_ (int-err "Internal error in get-result-ty: not a function type: ~n~a" t)])) (let loop ([form form]) (parameterize ([current-orig-stx form]) - (kernel-syntax-case* form #f (#%app) + (syntax-parse form [stx ;; if this needs to be checked - (syntax-property form 'typechecker:with-type) + #:when (syntax-property form 'typechecker:with-type) ;; the form should be already ascribed the relevant type - (void - (tc-expr form))] + (tc-expr form)] [stx - ;; this is a hander function - (syntax-property form 'typechecker:exn-handler) - (let ([t (tc-expr/t form)]) - (unless (subtype t (-> (Un) Univ)) - (tc-error "Exception handler must be a single-argument function, got ~n~a")) - (set! handler-tys (cons (get-result-ty t) handler-tys)))] + ;; this is a handler function + #:when (syntax-property form 'typechecker:exn-handler) + (let ([t (tc-expr form)]) + (match t + [(tc-result1: + (and t + (Function: (list (arr: (list _) _ _ _ (list (Keyword: _ _ #f) ...)) ...)))) + (set! handler-tys (cons (get-result-ty t) handler-tys))] + [(tc-results: t) + (tc-error "Exception handler must be a single-argument function, got ~n~a" t)]))] [stx ;; this is the body of the with-handlers - (syntax-property form 'typechecker:exn-body) - (let ([t (tc-expr/t form)]) - (set! body-ty t))] + #:when (syntax-property form 'typechecker:exn-body) + (match-let ([(tc-results: ts) (tc-expr form)]) + (set! body-ty (-values ts)))] [(a . b) - (begin - (loop #'a) - (loop #'b))] + (loop #'a) + (loop #'b)] [_ (void)]))) (ret (apply Un body-ty handler-tys))) From 8ccbe74e5ed8546e753c97ae57e90a066a230164 Mon Sep 17 00:00:00 2001 From: Sam Tobin-Hochstadt Date: Mon, 25 Jan 2010 20:00:32 +0000 Subject: [PATCH 060/113] don't open url twice svn: r17824 --- collects/scribble/tools/drscheme-buttons.ss | 1 - 1 file changed, 1 deletion(-) diff --git a/collects/scribble/tools/drscheme-buttons.ss b/collects/scribble/tools/drscheme-buttons.ss index 31bc41be41..a40503e06c 100644 --- a/collects/scribble/tools/drscheme-buttons.ss +++ b/collects/scribble/tools/drscheme-buttons.ss @@ -40,7 +40,6 @@ (dynamic-require 'scribble/run #f) (cond [(equal? label "HTML") - (system (format "firefox ~a" (path-replace-suffix name suffix))) (send-url/file (path-replace-suffix fn suffix))] [else (system (format "open ~a" (path-replace-suffix name suffix)))])) (message-box "Scribble" (get-output-string p) drs-frame)) From 04725539c71cd13c895b4001d2f48913b342d7fb Mon Sep 17 00:00:00 2001 From: Eli Barzilay Date: Mon, 25 Jan 2010 21:02:15 +0000 Subject: [PATCH 061/113] Propagate path to syntax source of evaluated files when applicable Set `current-load-relative-directory' based on path when it names a directory. svn: r17826 --- collects/scheme/sandbox.ss | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/collects/scheme/sandbox.ss b/collects/scheme/sandbox.ss index 8336322b00..2e5fd70321 100644 --- a/collects/scheme/sandbox.ss +++ b/collects/scheme/sandbox.ss @@ -1,6 +1,7 @@ #lang scheme/base (require scheme/port + scheme/path scheme/list scheme/string syntax/moddep @@ -444,7 +445,7 @@ (cond [(and p (null? (cdr inps))) (port-count-lines! p) (parameterize ([current-input-port p]) - (begin0 ((sandbox-reader) source) + (begin0 ((sandbox-reader) (or (object-name p) source)) ;; close a port if we opened it (unless (eq? p (car inps)) (close-input-port p))))] [p (error 'input->code "ambiguous inputs: ~e" inps)] @@ -550,11 +551,17 @@ (module->namespace `(quote ,(syntax-e mod)))))] [_else #f])]) ;; the actual evaluation happens under the specified limits - ((limit-thunk (lambda () - (if (and (pair? program) (eq? 'begin (car program))) - (eval* (cdr program)) - (eval program)) - (when ns (set! ns (ns)))))) + (parameterize ([current-load-relative-directory + (let* ([d (syntax-source program)] + [d (and (path-string? d) (path-only d))]) + (if (and d (directory-exists? d)) + d + (current-load-relative-directory)))]) + ((limit-thunk (lambda () + (if (and (pair? program) (eq? 'begin (car program))) + (eval* (cdr program)) + (eval program)) + (when ns (set! ns (ns))))))) (when uncovered! (let ([get (let ([ns (current-namespace)]) (lambda () (eval '(get-uncovered-expressions) ns)))]) From f54ccdc9d55b6a38947ada65eb0b765164fbecac Mon Sep 17 00:00:00 2001 From: Robby Findler Date: Mon, 25 Jan 2010 21:51:52 +0000 Subject: [PATCH 062/113] probable fix to error seen in drdr svn: r17827 --- collects/redex/private/bitmap-test-util.ss | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/collects/redex/private/bitmap-test-util.ss b/collects/redex/private/bitmap-test-util.ss index cf2dcada8d..a830bf76b7 100644 --- a/collects/redex/private/bitmap-test-util.ss +++ b/collects/redex/private/bitmap-test-util.ss @@ -39,8 +39,8 @@ (send bdc set-bitmap #f) bm))] [new-bitmap (make-object bitmap% - (inexact->exact (pict-width pict)) - (inexact->exact (pict-height pict)))] + (ceiling (inexact->exact (pict-width pict))) + (ceiling (inexact->exact (pict-height pict))))] [bdc (make-object bitmap-dc% new-bitmap)]) (send bdc clear) (draw-pict pict bdc 0 0) From 6f26a0ffebe3bf110198bee8155411503a8eb14a Mon Sep 17 00:00:00 2001 From: Jon Rafkind Date: Mon, 25 Jan 2010 23:21:26 +0000 Subject: [PATCH 063/113] add trigraph expression svn: r17831 --- collects/honu/main.ss | 2 + collects/honu/private/honu-typed-scheme.ss | 49 ++++++++-------------- 2 files changed, 20 insertions(+), 31 deletions(-) diff --git a/collects/honu/main.ss b/collects/honu/main.ss index 276d7b890a..47b363b786 100644 --- a/collects/honu/main.ss +++ b/collects/honu/main.ss @@ -10,6 +10,8 @@ (honu-* *) (honu-/ /) (honu-- -) + (honu-? ?) + (honu-: :) ) #%datum true diff --git a/collects/honu/private/honu-typed-scheme.ss b/collects/honu/private/honu-typed-scheme.ss index 2e76837023..243f083da2 100644 --- a/collects/honu/private/honu-typed-scheme.ss +++ b/collects/honu/private/honu-typed-scheme.ss @@ -32,7 +32,8 @@ (define-literal honu-+ honu-* honu-/ honu-- honu-|| honu-% honu-= honu-+= honu--= honu-*= honu-/= honu-%= honu-&= honu-^= honu-\|= honu-<<= honu->>= honu->>>= - honu->> honu-<< honu->>> honu-< honu-> honu-<= honu->=) + honu->> honu-<< honu->>> honu-< honu-> honu-<= honu->= + honu-? honu-:) ;; (define-syntax (\; stx) (raise-syntax-error '\; "out of context" stx)) @@ -368,7 +369,7 @@ x(2) [pattern f]) (define-splicing-syntax-class call - [pattern (~seq e:expr (#%parens arg:expression-1)) + [pattern (~seq e:expr (#%parens arg:trigraph)) #:with call #'(e arg.result)]) (define-splicing-syntax-class expression-last [pattern (~seq call:call) #:with result #'call.call] @@ -390,18 +391,6 @@ x(2) [else #'left.result]))))) - #; - (define-syntax-rule (define-infix-operator name next [operator reducer] ...) - (define-splicing-syntax-class name - #:literals (operator ...) - [pattern (~seq (~var left next) operator (~var right name)) - #:with result (reducer #'left.result #'right.result)] - ... - [pattern (~seq (~var exp next)) - #:with result #'exp.result] - )) - - ;; TODO: maybe just have a precedence macro that creates all these constructs ;; (infix-operators ([honu-* ...] ;; [honu-- ...]) ;; ([honu-+ ...] @@ -430,23 +419,6 @@ x(2) #'(begin result ...)))])) - #; - (infix-operators expression-1 expression-last - ([honu-+ (syntax-lambda (left right) - #'(+ left right))] - [honu-- (syntax-lambda (left right) - #'(- left right))]) - ([honu-* (syntax-lambda (left right) - #'(* left right))] - [honu-/ (syntax-lambda (left right) - #'(/ left right))])) - - - (define-syntax-class expression-top - [pattern (e:expression-1 semicolon . rest) - #:with result #'e.result]) - - ;; infix operators in the appropriate precedence level ;; things defined lower in the table have a higher precedence. ;; the first set of operators is `expression-1' @@ -478,10 +450,25 @@ x(2) [honu-% (sl (left right) #'(modulo left right))] [honu-/ (sl (left right) #'(/ left right))]))) + (define-splicing-syntax-class trigraph + #:literals (honu-? honu-:) + [pattern (~seq condition:expression-1 (~optional (~seq honu-? on-true:trigraph + honu-: on-false:trigraph))) + #:with result + (cond [(attribute on-true) + #'(if condition.result on-true.result on-false.result)] + [else #'condition.result])]) + + (define-syntax-class expression-top + #:literals (semicolon) + [pattern (e:trigraph semicolon . rest) + #:with result #'e.result]) + ;; (printf "~a\n" (syntax-class-parse function stx)) (syntax-parse stx [function:function (values #'function.result #'function.rest)] [expr:expression-top (values #'expr.result #'expr.rest)] + #; [(x:number . rest) (values #'x #'rest)] )) (cond From 9ee92804859c4304e123e43b425a33f1a12a7a02 Mon Sep 17 00:00:00 2001 From: Jon Rafkind Date: Tue, 26 Jan 2010 00:10:01 +0000 Subject: [PATCH 064/113] support commas in function calls svn: r17832 --- collects/honu/main.ss | 2 ++ collects/honu/private/honu-typed-scheme.ss | 11 ++++++++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/collects/honu/main.ss b/collects/honu/main.ss index 47b363b786..ae632c9d99 100644 --- a/collects/honu/main.ss +++ b/collects/honu/main.ss @@ -12,11 +12,13 @@ (honu-- -) (honu-? ?) (honu-: :) + (honu-comma |,|) ) #%datum true false display + display2 newline else (rename-out diff --git a/collects/honu/private/honu-typed-scheme.ss b/collects/honu/private/honu-typed-scheme.ss index 243f083da2..edb4f841b9 100644 --- a/collects/honu/private/honu-typed-scheme.ss +++ b/collects/honu/private/honu-typed-scheme.ss @@ -33,7 +33,7 @@ honu-= honu-+= honu--= honu-*= honu-/= honu-%= honu-&= honu-^= honu-\|= honu-<<= honu->>= honu->>>= honu->> honu-<< honu->>> honu-< honu-> honu-<= honu->= - honu-? honu-:) + honu-? honu-: honu-comma) ;; (define-syntax (\; stx) (raise-syntax-error '\; "out of context" stx)) @@ -356,6 +356,7 @@ x(2) |# + (define (parse-block-one/2 stx context) (define (parse-one stx context) (define-syntax-class block @@ -369,8 +370,9 @@ x(2) [pattern f]) (define-splicing-syntax-class call - [pattern (~seq e:expr (#%parens arg:trigraph)) - #:with call #'(e arg.result)]) + #:literals (honu-comma) + [pattern (~seq e:expr (#%parens (~seq arg:trigraph (~optional honu-comma)) ...)) + #:with call #'(e arg.result ...)]) (define-splicing-syntax-class expression-last [pattern (~seq call:call) #:with result #'call.call] [pattern (~seq x:number) #:with result #'x] @@ -646,6 +648,9 @@ if (foo){ (define-syntax (honu-top stx) (raise-syntax-error #f "interactive use is not yet supported")) +(define (display2 x y) + (printf "~a ~a" x y)) + (define-syntax (honu-unparsed-begin stx) ;; (printf "honu unparsed begin: ~a\n" (syntax->datum stx)) (syntax-case stx () From 794efa5ebbfcf12e1e3cd3c182fd8dcc13896255 Mon Sep 17 00:00:00 2001 From: Jon Rafkind Date: Tue, 26 Jan 2010 00:25:45 +0000 Subject: [PATCH 065/113] s/trigraph/ternary svn: r17833 --- collects/honu/private/honu-typed-scheme.ss | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/collects/honu/private/honu-typed-scheme.ss b/collects/honu/private/honu-typed-scheme.ss index edb4f841b9..f82899e3f0 100644 --- a/collects/honu/private/honu-typed-scheme.ss +++ b/collects/honu/private/honu-typed-scheme.ss @@ -371,7 +371,7 @@ x(2) (define-splicing-syntax-class call #:literals (honu-comma) - [pattern (~seq e:expr (#%parens (~seq arg:trigraph (~optional honu-comma)) ...)) + [pattern (~seq e:expr (#%parens (~seq arg:ternary (~optional honu-comma)) ...)) #:with call #'(e arg.result ...)]) (define-splicing-syntax-class expression-last [pattern (~seq call:call) #:with result #'call.call] @@ -452,10 +452,10 @@ x(2) [honu-% (sl (left right) #'(modulo left right))] [honu-/ (sl (left right) #'(/ left right))]))) - (define-splicing-syntax-class trigraph + (define-splicing-syntax-class ternary #:literals (honu-? honu-:) - [pattern (~seq condition:expression-1 (~optional (~seq honu-? on-true:trigraph - honu-: on-false:trigraph))) + [pattern (~seq condition:expression-1 (~optional (~seq honu-? on-true:ternary + honu-: on-false:ternary))) #:with result (cond [(attribute on-true) #'(if condition.result on-true.result on-false.result)] @@ -463,7 +463,7 @@ x(2) (define-syntax-class expression-top #:literals (semicolon) - [pattern (e:trigraph semicolon . rest) + [pattern (e:ternary semicolon . rest) #:with result #'e.result]) ;; (printf "~a\n" (syntax-class-parse function stx)) From be9d5787b4d9015bdfafbff21d690d22f8e273a8 Mon Sep 17 00:00:00 2001 From: Eli Barzilay Date: Tue, 26 Jan 2010 08:50:05 +0000 Subject: [PATCH 066/113] Welcome to a new PLT day. svn: r17834 --- collects/repos-time-stamp/stamp.ss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/collects/repos-time-stamp/stamp.ss b/collects/repos-time-stamp/stamp.ss index de7a62a627..1905746c5d 100644 --- a/collects/repos-time-stamp/stamp.ss +++ b/collects/repos-time-stamp/stamp.ss @@ -1 +1 @@ -#lang scheme/base (provide stamp) (define stamp "25jan2010") +#lang scheme/base (provide stamp) (define stamp "26jan2010") From 4cb01a48b36fefdb04ff3857ecd2a44812bdc86f Mon Sep 17 00:00:00 2001 From: Eli Barzilay Date: Tue, 26 Jan 2010 15:04:51 +0000 Subject: [PATCH 067/113] only for programs svn: r17835 --- collects/scheme/sandbox.ss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/collects/scheme/sandbox.ss b/collects/scheme/sandbox.ss index 2e5fd70321..d958780c51 100644 --- a/collects/scheme/sandbox.ss +++ b/collects/scheme/sandbox.ss @@ -552,7 +552,7 @@ [_else #f])]) ;; the actual evaluation happens under the specified limits (parameterize ([current-load-relative-directory - (let* ([d (syntax-source program)] + (let* ([d (and (syntax? program) (syntax-source program))] [d (and (path-string? d) (path-only d))]) (if (and d (directory-exists? d)) d From 9c6fdd86c8f961d90edabdadeaaa09f832321338 Mon Sep 17 00:00:00 2001 From: Casey Klein Date: Tue, 26 Jan 2010 17:29:39 +0000 Subject: [PATCH 068/113] Moved tests into a separate directory. Changed run-tests.ss to suppress the diffs window when bitmap-test.ss fails, to avoid tripping up DrDr. svn: r17836 --- collects/redex/tests/bitmap-test-util.ss | 161 ++ collects/redex/tests/bitmap-test.ss | 167 ++ .../tests/bmps-macosx/extended-language.png | Bin 0 -> 1989 bytes .../extended-reduction-relation.png | Bin 0 -> 394 bytes .../redex/tests/bmps-macosx/language-nox.png | Bin 0 -> 3006 bytes collects/redex/tests/bmps-macosx/language.png | Bin 0 -> 6006 bytes collects/redex/tests/bmps-macosx/lw.png | Bin 0 -> 1232 bytes .../metafunction-Name-vertical.png | Bin 0 -> 4823 bytes .../tests/bmps-macosx/metafunction-Name.png | Bin 0 -> 4440 bytes .../tests/bmps-macosx/metafunction-T.png | Bin 0 -> 4705 bytes .../tests/bmps-macosx/metafunction-TL.png | Bin 0 -> 4667 bytes .../bmps-macosx/metafunction-multi-arg.png | Bin 0 -> 8456 bytes .../tests/bmps-macosx/metafunction-subst.png | Bin 0 -> 4418 bytes .../redex/tests/bmps-macosx/metafunction.png | Bin 0 -> 1076 bytes .../bmps-macosx/metafunctions-multiple.png | Bin 0 -> 9319 bytes collects/redex/tests/bmps-macosx/red2.png | Bin 0 -> 5232 bytes .../tests/bmps-macosx/reduction-relation.png | Bin 0 -> 1801 bytes .../redex/tests/bmps-macosx/superscripts.png | Bin 0 -> 944 bytes .../bmps-macosx/unix-extended-language.png | Bin 0 -> 2109 bytes .../unix-extended-reduction-relation.png | Bin 0 -> 507 bytes .../tests/bmps-macosx/unix-language-nox.png | Bin 0 -> 3129 bytes .../redex/tests/bmps-macosx/unix-language.png | Bin 0 -> 5597 bytes collects/redex/tests/bmps-macosx/unix-lw.png | Bin 0 -> 1181 bytes .../unix-metafunction-Name-vertical.png | Bin 0 -> 4545 bytes .../bmps-macosx/unix-metafunction-Name.png | Bin 0 -> 3738 bytes .../tests/bmps-macosx/unix-metafunction-T.png | Bin 0 -> 4027 bytes .../bmps-macosx/unix-metafunction-TL.png | Bin 0 -> 4547 bytes .../unix-metafunction-multi-arg.png | Bin 0 -> 7208 bytes .../bmps-macosx/unix-metafunction-subst.png | Bin 0 -> 5287 bytes .../tests/bmps-macosx/unix-metafunction.png | Bin 0 -> 1158 bytes .../unix-metafunctions-multiple.png | Bin 0 -> 10731 bytes .../bmps-macosx/unix-reduction-relation.png | Bin 0 -> 1956 bytes collects/redex/tests/color-test.ss | 69 + collects/redex/tests/config.ss | 5 + collects/redex/tests/core-layout-test.ss | 82 + collects/redex/tests/hole-test.ss | 32 + collects/redex/tests/keyword-macros-test.ss | 46 + collects/redex/tests/lw-test-util.ss | 43 + collects/redex/tests/lw-test.ss | 282 +++ collects/redex/tests/matcher-test.ss | 820 ++++++++ collects/redex/tests/pict-test.ss | 53 + collects/redex/tests/rg-test.ss | 1081 ++++++++++ collects/redex/tests/run-tests.ss | 41 + collects/redex/tests/term-test.ss | 177 ++ collects/redex/tests/test-util.ss | 132 ++ collects/redex/tests/tl-test.ss | 1850 +++++++++++++++++ 46 files changed, 5041 insertions(+) create mode 100644 collects/redex/tests/bitmap-test-util.ss create mode 100644 collects/redex/tests/bitmap-test.ss create mode 100644 collects/redex/tests/bmps-macosx/extended-language.png create mode 100644 collects/redex/tests/bmps-macosx/extended-reduction-relation.png create mode 100644 collects/redex/tests/bmps-macosx/language-nox.png create mode 100644 collects/redex/tests/bmps-macosx/language.png create mode 100644 collects/redex/tests/bmps-macosx/lw.png create mode 100644 collects/redex/tests/bmps-macosx/metafunction-Name-vertical.png create mode 100644 collects/redex/tests/bmps-macosx/metafunction-Name.png create mode 100644 collects/redex/tests/bmps-macosx/metafunction-T.png create mode 100644 collects/redex/tests/bmps-macosx/metafunction-TL.png create mode 100644 collects/redex/tests/bmps-macosx/metafunction-multi-arg.png create mode 100644 collects/redex/tests/bmps-macosx/metafunction-subst.png create mode 100644 collects/redex/tests/bmps-macosx/metafunction.png create mode 100644 collects/redex/tests/bmps-macosx/metafunctions-multiple.png create mode 100644 collects/redex/tests/bmps-macosx/red2.png create mode 100644 collects/redex/tests/bmps-macosx/reduction-relation.png create mode 100644 collects/redex/tests/bmps-macosx/superscripts.png create mode 100644 collects/redex/tests/bmps-macosx/unix-extended-language.png create mode 100644 collects/redex/tests/bmps-macosx/unix-extended-reduction-relation.png create mode 100644 collects/redex/tests/bmps-macosx/unix-language-nox.png create mode 100644 collects/redex/tests/bmps-macosx/unix-language.png create mode 100644 collects/redex/tests/bmps-macosx/unix-lw.png create mode 100644 collects/redex/tests/bmps-macosx/unix-metafunction-Name-vertical.png create mode 100644 collects/redex/tests/bmps-macosx/unix-metafunction-Name.png create mode 100644 collects/redex/tests/bmps-macosx/unix-metafunction-T.png create mode 100644 collects/redex/tests/bmps-macosx/unix-metafunction-TL.png create mode 100644 collects/redex/tests/bmps-macosx/unix-metafunction-multi-arg.png create mode 100644 collects/redex/tests/bmps-macosx/unix-metafunction-subst.png create mode 100644 collects/redex/tests/bmps-macosx/unix-metafunction.png create mode 100644 collects/redex/tests/bmps-macosx/unix-metafunctions-multiple.png create mode 100644 collects/redex/tests/bmps-macosx/unix-reduction-relation.png create mode 100644 collects/redex/tests/color-test.ss create mode 100644 collects/redex/tests/config.ss create mode 100644 collects/redex/tests/core-layout-test.ss create mode 100644 collects/redex/tests/hole-test.ss create mode 100644 collects/redex/tests/keyword-macros-test.ss create mode 100644 collects/redex/tests/lw-test-util.ss create mode 100644 collects/redex/tests/lw-test.ss create mode 100644 collects/redex/tests/matcher-test.ss create mode 100644 collects/redex/tests/pict-test.ss create mode 100644 collects/redex/tests/rg-test.ss create mode 100644 collects/redex/tests/run-tests.ss create mode 100644 collects/redex/tests/term-test.ss create mode 100644 collects/redex/tests/test-util.ss create mode 100644 collects/redex/tests/tl-test.ss diff --git a/collects/redex/tests/bitmap-test-util.ss b/collects/redex/tests/bitmap-test-util.ss new file mode 100644 index 0000000000..a830bf76b7 --- /dev/null +++ b/collects/redex/tests/bitmap-test-util.ss @@ -0,0 +1,161 @@ +#lang scheme/gui +(require framework + slideshow + "../pict.ss" + "../reduction-semantics.ss" + "config.ss") + +(provide test done) + +(define tests 0) +(define failed '()) +(define (done) + (printf "~a tests" tests) + (if (null? failed) + (printf ", all passed\n") + (printf ", ~a failed\n" (length failed)))) + +(define-syntax (test stx) + (syntax-case stx () + [(_ test-exp bitmap-filename) + #`(test/proc + #,(syntax-line stx) + test-exp + bitmap-filename)])) + +(define (test/proc line-number pict raw-bitmap-filename) + (set! tests (+ tests 1)) + (let* ([bitmap-filename + (build-path (format "bmps-~a" (system-type)) + (case (system-type) + [(unix) (string-append "unix-" raw-bitmap-filename)] + [else raw-bitmap-filename]))] + [old-bitmap (if (file-exists? bitmap-filename) + (make-object bitmap% bitmap-filename) + (let* ([bm (make-object bitmap% 100 20)] + [bdc (make-object bitmap-dc% bm)]) + (send bdc clear) + (send bdc draw-text "does not exist" 0 0) + (send bdc set-bitmap #f) + bm))] + [new-bitmap (make-object bitmap% + (ceiling (inexact->exact (pict-width pict))) + (ceiling (inexact->exact (pict-height pict))))] + [bdc (make-object bitmap-dc% new-bitmap)]) + (send bdc clear) + (draw-pict pict bdc 0 0) + (send bdc set-bitmap #f) + (let ([diff-bitmap (compute-diffs old-bitmap new-bitmap)]) + (when diff-bitmap + (let ([failed-panel (make-failed-panel line-number bitmap-filename old-bitmap new-bitmap diff-bitmap)]) + (set! failed (append failed (list failed-panel)))))))) + +(define (compute-diffs old-bitmap new-bitmap) + (let* ([w (max (send old-bitmap get-width) + (send new-bitmap get-width))] + [h (max (send old-bitmap get-height) + (send new-bitmap get-height))] + [diff-bitmap (make-object bitmap% w h)] + [new (make-object bitmap-dc% new-bitmap)] + [old (make-object bitmap-dc% old-bitmap)] + [diff (make-object bitmap-dc% diff-bitmap)] + [new-c (make-object color%)] + [old-c (make-object color%)] + [any-different? #f]) + (let loop ([x 0]) + (unless (= x w) + (let loop ([y 0]) + (unless (= y h) + (cond + [(and (<= x (send new-bitmap get-width)) + (<= y (send new-bitmap get-height)) + (<= x (send old-bitmap get-width)) + (<= y (send old-bitmap get-height))) + (send new get-pixel x y new-c) + (send old get-pixel x y old-c) + (cond + [(and (= (send new-c red) (send old-c red)) + (= (send new-c green) (send old-c green)) + (= (send new-c blue) (send old-c blue))) + (send diff set-pixel x y new-c)] + [else + (set! any-different? #t) + (send new-c set 255 0 0) + (send diff set-pixel x y new-c)])] + [else + (set! any-different? #t) + (send new-c set 255 0 0) + (send diff set-pixel x y new-c)]) + (loop (+ y 1)))) + (loop (+ x 1)))) + (send diff set-bitmap #f) + (send old set-bitmap #f) + (send new set-bitmap #f) + (and any-different? diff-bitmap))) + +(define test-result-single-panel #f) +(define (get-test-result-single-panel) + (cond + [test-result-single-panel + test-result-single-panel] + [else + (let () + (define f (new frame% [label "bitmap-test.ss failures"])) + (define lined (new vertical-panel% [parent f] [style '(border)])) + (define sp (new panel:single% [parent lined])) + (define current-index 0) + (define hp (new horizontal-panel% [parent f])) + (define prev + (new button% + [label "Prev"] + [parent hp] + [callback + (λ (x y) + (set! current-index (modulo (- current-index 1) (length failed))) + (update-gui))])) + (define next (new button% + [label "Next"] + [parent hp] + [callback + (λ (x y) + (set! current-index (modulo (+ current-index 1) (length failed))) + (update-gui))])) + (define (update-gui) + (send sp active-child (list-ref failed current-index))) + (set! test-result-single-panel sp) + (when (get-show-bitmaps?) (send f show #t)) + sp)])) + +(define (make-failed-panel line-number filename old-bitmap new-bitmap diff-bitmap) + (define f (new vertical-panel% [parent (get-test-result-single-panel)])) + (define msg (new message% [label (format "line ~a" line-number)] [parent f])) + (define hp (new horizontal-panel% [parent f])) + (define vp1 (new vertical-panel% [parent hp])) + (define vp2 (new vertical-panel% [parent hp])) + (define chk (new check-box% + [label "Show diff"] + [parent f] + [callback + (λ (_1 _2) + (cond + [(send chk get-value) + (send right-hand set-label diff-bitmap)] + [else + (send right-hand set-label new-bitmap)]))])) + (define btn (new button% + [parent f] + [label "Save"] + [callback + (λ (x y) + (send new-bitmap save-file filename 'png))])) + (define left-label (new message% [parent vp1] [label "Old"])) + (define left-hand (new message% + [parent vp1] + [label diff-bitmap])) + (define right-label (new message% [parent vp2] [label "New"])) + (define right-hand (new message% + [parent vp2] + [label diff-bitmap])) + (send left-hand set-label old-bitmap) + (send right-hand set-label new-bitmap) + f) diff --git a/collects/redex/tests/bitmap-test.ss b/collects/redex/tests/bitmap-test.ss new file mode 100644 index 0000000000..e5f73397d9 --- /dev/null +++ b/collects/redex/tests/bitmap-test.ss @@ -0,0 +1,167 @@ +#lang scheme +(require "bitmap-test-util.ss" + "../main.ss") + +;; tests: +;; - language, +;; - multi-line non-terminals, single-line non-terminals +(define-language lang + (e (e e) + x + (λ (x) e) + number) + (v number (λ (x) e)) + ((x y) variable-not-otherwise-mentioned)) + +(test (render-language lang) "language.png") + +(test (render-language lang #:nts '(e v)) "language-nox.png") + +(define-extended-language lang++ lang + (e .... number (+ e e)) + (v .... number)) + +(test (render-language lang++) "extended-language.png") + +(define red + (reduction-relation + lang + (--> ((λ (x) e) v) (S x v e)))) + +;; tests: reduction-relation +(test (render-reduction-relation red) + "reduction-relation.png") + +(test (render-reduction-relation + (extend-reduction-relation red lang (--> 1 2))) + "extended-reduction-relation.png") + +;; this test should fail because it gets the order wrong +;; for the where/side-conditions +(define red2 + (reduction-relation + lang + (--> (number_a number_b number_c number_d) + any_z + (where (any_x any_y) (number_a number_b)) + (side-condition (= (term number_c) 5)) + (where any_z any_x) + (side-condition (= (term number_d) 5))))) + +(test (render-reduction-relation red2) + "red2.png") + +(define-metafunction lang + [(S x v e) e]) + +(test (render-metafunction S) + "metafunction.png") + +(define-metafunction lang + [(T x y) + 1 + (side-condition (not (eq? (term x) (term y))))] + [(T x x) + (any_1 any_2) + (where any_1 2) + (where any_2 2)]) + +;; in this test, the metafunction has 2 clauses +;; with a side-condition on the first clause +;; and a 'where' in the second clause +(test (render-metafunction T) "metafunction-T.png") + +;; in this test, teh `x' is italic and the 'z' is sf, since 'x' is in the grammar, and 'z' is not. +(test (render-lw + lang + (to-lw ((λ (x) (x x)) + (λ (z) (z z))))) + "lw.png") + +(define-metafunction lang + [(TL 1) (a + ,(term-let ((x (term 1))) + (term x)) + below-only)] + [(TL 2) (a + ,(term-let ((x (term 1))) + (term x)) beside + below)]) + +;; this tests that term-let is sucked away properly +;; when the metafunction is rendered +(test (render-metafunction TL) "metafunction-TL.png") + +(define-metafunction lang + [(Name (name x-arg arg)) + ,(term-let ((x-term-let (term 1))) + (term (x-where x-term-let))) + (where x-where 2)]) + +;; this tests that the three variable bindings +;; (x-arg, x-term-let, and x-where) +;; all show up in the output. +(test (render-metafunction Name) "metafunction-Name.png") + +;; same as previous, but with vertical organization of the bindings +(test (parameterize ([metafunction-pict-style 'up-down/vertical-side-conditions]) + (render-metafunction Name)) + "metafunction-Name-vertical.png") + +;; makes sure that there is no overlap inside or across metafunction calls +;; or when there are unquotes involved +(define-metafunction lang + [(multi-arg a + b + c) + ((multi-arg a + b + c) + (multi-arg a + b + c))] + [(multi-arg unquote-test) + (,@(term (multi-arg with-unquote)) + ,@(term (multi-arg with-unquote)) + ,@(term (multi-arg with-unquote)))]) + +(test (render-metafunction multi-arg) "metafunction-multi-arg.png") + +;; makes sure that the LHS and RHS of metafunctions are appropriately +;; rewritten + +(define-metafunction lang + subst : e x e -> e + [(subst x x e) e] + [(subst number x e) number] + [(subst x_1 x_2 e) x_1] + [(subst (e_1 e_2) x e) + ((subst e_1 x e) (subst e_2 x e))] + [(subst (λ (x) e_b) x e) + (λ (x) e)] + [(subst (λ (x_f) e_f) x_a e_a) + (λ (x_f) (subst e_f x_a e_a))]) + +(define (subst-rw lws) + (list "" + (list-ref lws 2) + "{" + (list-ref lws 3) + ":=" + (list-ref lws 4) + "}")) + +(test (with-compound-rewriter 'subst subst-rw + (render-metafunction subst)) + "metafunction-subst.png") + + +;; make sure two metafunctions simultaneously rewritten line up properly +(test (render-metafunctions S T TL) "metafunctions-multiple.png") + +;; Non-terminal superscripts +(test (render-lw lang (to-lw (x_^abcdef x_q^abcdef))) + "superscripts.png") + +(printf "bitmap-test.ss: ") +(done) diff --git a/collects/redex/tests/bmps-macosx/extended-language.png b/collects/redex/tests/bmps-macosx/extended-language.png new file mode 100644 index 0000000000000000000000000000000000000000..448f4f9bfb08c89fe4ec8b812451030d4c194ff7 GIT binary patch literal 1989 zcmV;$2RitPP)d2$tOB{Qh_wV<1GoAZhve>)G?1^SsY<&ilRxzJP)d z0$-xDvy(!h;PLpGE@T>9*Jd;t(P*@1uc+7S0|NsQ+t0J9f1jeFqBn2ecqzF`r4oz9 zO-)VzZ@RPEj7DQgNr}m1`n~F=VQ_FzBoZOE&ux`g2?z)%D=TYnZ}(tMlgX5uo6BOc zuvn}I(;~#j#~TcW+qZ9ne{HMqc)Uy|OG!!bV9u(ls<^l~0)b%lw70i&xm-`>XD}EQ z6%`W`6F=Fi%F4=wgak+XFGZzNNu|=Hq$E!zgb)@N7jNCV)z&#MFi=}t>#0kiP^dL) z)(8ZGA6q4rO1WGvm&+|KF18&P8ymZ0#|}IDC>m9qN0>a<@fL3Pn;^P@@i{q<#IWj&1Ntda=AP=H#Z?60Yb>*@s=)K+Sb+v z01%7Ct5>gXX=%yN&tJQC?aLRC`R?7jE^7Py`Lj$WBa_L$ z)RD8*b{1W>Y?)Xr_6GonM50TVE;TeX+`4t^!-o&H(`YmrjYhMx*=+Xi-Mj5BFmK+x zUnOsMb#-+t7OS$dQlrrT03JPh1R*4o$t5KvnVFg8<>lwkpSNotkH<$uL{O>J zfq{XmSFe&tBp0;}4Go2chN4g?0KohA?~zkbB9SPS$~$-NAj^`Pnrb`6#cDf?1_uYf zeft*3Lg+f7`6bhxVu+U<$T)TE{`SRs5nM|ovVlWu3Rtq7FjEv;*c*sZwgTd$X zr){6bVlkOai^cNO+Uo1;=g*&y*tNB_WHOmdCWnNCU@#cO&dSQN9q)RzokgEKd4j{? z!1e3bqobpno12YBqnoSAhJGoGMV}L`4Gb4;bA{NKdDp-A>6WM%eiysAcWP`)$7)+gAn%j_Y(*Nq<@)A z78Vxv>C-32_NS(%LPA0wJb2(vZLeRy_Ve>Io6WY)8#itwCMHhXo$J+h7OktRqf)8< z-@bh#5C~~$X#jx1!NCO!7GN+K>+>j=%lrEJkdI7OJ2^QyA|k@>$&HDLvGWK70wR&P zZQC}rT7CKQ<-L3NQYaK>wu_fcOG`_9e0*YJBJzGHEG+Eq?$&5D(b3UUQ&XLtoeG5_ zCnu+`ukY#8rx_U;R4UbMHn+C6mX?+R0K{T(Mn*<=cXw-RYkGQmU|^uxY-Y3BWo2cN zk&%w=zk2m5C@2W={FFtD7NODTv9YnRurPPVyIyT)(b3V-n3xzaIy$;|@#5_4Y@tvn zkx1U7cN{t>?KQgz(w3XR)!d$dt6Sw7k5$k&zKTpP!YLB^HZM zojTRg(SbxA+vjjN1qB7ub~NqFxu~e9v9ZzCI5yN7!C=?3BM$RD@Q>>@X&rPtM@B~W z?b`<-1pm9lS*-N*^myv1wnM2@78Vv73x86azt6jVzG|OI*~{$FE0lGh(w|zM~)N} z6yWjr(a}*mWj#GT-AjG_G7!R=nwrg9+S=OM+Pv{q&V77YS)W<_0RSWtX=G$X zrBcacvYk73{&aWweE$9W_wAeq4jkCCXOA~-CY?_A{Q2|Z;^KgS0Fg+vY11YEfWcsp zNF>$O)l#W+U|;~b_usvHH#|Ii=+Ge)3f0`)oSB&!6%|!eQULirB<0DzE?kgs3A3WY*8 zn{5}KRn~n72;tb+SW;5b#KeT-LpQ6e`wl;ZC6md7JpPUt3zT literal 0 HcmV?d00001 diff --git a/collects/redex/tests/bmps-macosx/extended-reduction-relation.png b/collects/redex/tests/bmps-macosx/extended-reduction-relation.png new file mode 100644 index 0000000000000000000000000000000000000000..46e14cf70397c41c828ae06d48432c0ef290fe3d GIT binary patch literal 394 zcmV;50d@X~P)HEGAB93Dk>nN_ON(d1}5t$VLH~_3x zD^*pWdoE*aD&n_D&-G0pB4g|g;#poO9)kWU?xoH1IB!e#eku7<@#B}W+&3|%y6^kn zp1Xtx*OdUEu4~tI0pNH%=6U`UJcez}K@%?@$5K92yd7cnLQIzZT8by)s`xL1T of4-7&x-}DX;4gdfE07*qoM6N<$f>_b7d;kCd literal 0 HcmV?d00001 diff --git a/collects/redex/tests/bmps-macosx/language-nox.png b/collects/redex/tests/bmps-macosx/language-nox.png new file mode 100644 index 0000000000000000000000000000000000000000..083d80cc662ff90c9748380ba1ad756aba9c5dc4 GIT binary patch literal 3006 zcmV;v3qkaWP)000YxNklzWOfb=yYNBqee}BJ_fLJWX+cY#ZELgBWb*Os^jjc5` zHH#K4nsPBF3J{4z4h|0Y@88eP&OUMC#Ms!FLB_pz@1DxvSdkOVq$rD`HL4X)V4!GLBYa> z3yEcYNKQ_!uC9g<>YhSd>y8~e9zT9Oojq&{00<$9qEe|;n}tH5&{&?5;o;%<_;{?W zdkSLf*RNmq?%k{ZTqXw~b@cZ3_Oi0FU+pE4NVr_?`1m*(OQHxgNOD}PzrWwg%F5Q( zR{t(<-@awBSadp_yj2+;!}z_mwbj$plfhv8`=S023=^M8PEP*t;e$bj`a>W$4m^W4 zX8dj(X8dj($nv{Vsl0#xK9k853WX0IJXp1ARc~)ENpqPZWci&=r^m*|Zr;2(D=W*= z(z30s4IdMpf!ym%XlQ6pPtT@Jn@F9-6d~8|5{YEy{!$|(`u*9nXW`-DR#sL*q453t z_vB4vijd-Wfk5Ez?>{jyv0}xFZQHh`rly*i&D=Qs1G3^X!^6XK=gtKHpeU+TDt}40 z^d~@iTxLu*wzkUUa&4^$g2-etg+ig{Xb6I+)#%?>e@o*+Zah+@k34kf zkfWpH)2B~$kE2abslQ^JUK?D=Vv(mKJS;sM)K5qG(7+$jHdZl#9{d z(uk1ty9x>V$mh?WkByBL78dGhuZI4LNt4i4lI3@zK9a}dg@uJxR#s~K1;*QJi)DIy zd-M5xV&Bfr&g|^$?Ck6d7cO8m+AOI9S$^;C?sjl+pwVd9p*9 z#_a5D6h*b!11+&kqGD2|tu!|`@9OFrA0O9dNi|4(-o)W>T3cHI06ZQqARu7bvSnD) z`Sa%+8yioZI;GKGM=Vny5U|;7e6L-*cJ=r7@7uSpqM|}3ld0scL`%v+-YqI#ANfo6 zGMNmknVg(dsr9reCQVdZNiBV(HhcXQlcu7rq?|rdqrLu$NmJ2Q&gdhJg9+#(rBW%M z&wudX0ZHQ<1rvDgVQy|-SXlV{`Ez40#E_VP-x&->Z*MR5j@5623HV(qm3DS^1_cEf zdm)B|#Q01`M#h>oYlen~&YU^p>gpgn z`}S>caPW;AH%K}!LqV3`84QNCwY86rPjz*5dV2cs@UToKn=@yQjg5_;pC15VaBz^v z-#Pc2z-5g*REX)0I098 z-@JKqTU%RGQCb5dgsF^P{4o z+S=M4J$e)w8996QY^74k;cyBI3te1Xh+)Whw-Q8s}*|%@s3JMAm5)%6Q`g(eL+}+)4Yir};;s5|mO-*iYZrB_6pFe-@>+5rH zaG=xa2!aR%f{cuew6wG>TebjAVaVFr+U?u7n~)0gztHK)<#H^903no0rC0{0k&zJ_ z8yg*6Y;0_>$9@WhVsvy=EpHQqaA;`A1g_&+n9)ZX2b0;DzZt*3->IqHGy%W=%XlO; zwVNj3cQWFU_}rG|<>krA$;XZz)6-t9N&jq@|FAUf-v>Qevu2GzAedfXYHByh${%S! z3?7e!6wq#(wYRtX`}3IVqzkKAg^D)_VDn)D#OCUZr!>CAxutA_Vo0`Dm^_txm+%aqJRDM7xoR3 zNF zqB%J^zP`T16H&8=5SEpdZP>5@Uqj4xsXH$wfDpcT@xsr~Pa=_AzkYpccS4w#mlsMv zP4_~bcqGy9@87>SGc!{vmDpimVBqP~ry+#jzki=KYZfu%pPD^{FefKx{`~oPo2sfR z7K??iAubYcNe2Mf+1Y*n{=K}soWtR$?UZTfk5r3Ca=F~LwlTOtk4NHjTVmSH($Z3Z({5H)R^mf!czf`-b~86O zS11(H>Gb8xmjj*JO`tI^CWKHd76%0djgF2Izbwulf1;adB~c zK0hrjt+}}wYbBtfs@#@Gj~>N-$uXLno0&{zN=k}Gdp@7<=jX@g z^C5&>E;lA7rmL$9GazQW)SVae|M%}|djZe1^GB)}9v;RDD2l3H8^f;MI=ZN?)MH~~ z#Fx!;IK AvH$=8 literal 0 HcmV?d00001 diff --git a/collects/redex/tests/bmps-macosx/language.png b/collects/redex/tests/bmps-macosx/language.png new file mode 100644 index 0000000000000000000000000000000000000000..1275c7b26c55d8302e3a19fd7a03b2ae2a86e8a8 GIT binary patch literal 6006 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 Kg{+W&9{xYJ4^3DA literal 0 HcmV?d00001 diff --git a/collects/redex/tests/bmps-macosx/metafunction-Name.png b/collects/redex/tests/bmps-macosx/metafunction-Name.png new file mode 100644 index 0000000000000000000000000000000000000000..e4f7dc5331411cc3d70ad2ac520c16b4fd70e938 GIT binary patch literal 4440 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 G;r{`2*`}QU literal 0 HcmV?d00001 diff --git a/collects/redex/tests/bmps-macosx/metafunction-T.png b/collects/redex/tests/bmps-macosx/metafunction-T.png new file mode 100644 index 0000000000000000000000000000000000000000..23606d0bd557bf61c3efc56bcf6a8d00c535c1b6 GIT binary patch literal 4705 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 Uvvc7u!J{KUM?+7&Qq?Z>f9Z_+@c;k- literal 0 HcmV?d00001 diff --git a/collects/redex/tests/bmps-macosx/metafunction-TL.png b/collects/redex/tests/bmps-macosx/metafunction-TL.png new file mode 100644 index 0000000000000000000000000000000000000000..1b0410ede7f8c957006607bac0a4f4a11825d2dc GIT binary patch literal 4667 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 Pg`nG-dK!gl7XJSMoS8#V literal 0 HcmV?d00001 diff --git a/collects/redex/tests/bmps-macosx/metafunction-multi-arg.png b/collects/redex/tests/bmps-macosx/metafunction-multi-arg.png new file mode 100644 index 0000000000000000000000000000000000000000..0ae325b3b04c5e9e410aae691ebec93a43c5526d GIT binary patch literal 8456 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%0AO0sn_OvrXz<4EHPdzac#Bj-%?(?9|AVKhK7c4 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 literal 0 HcmV?d00001 diff --git a/collects/redex/tests/bmps-macosx/metafunction.png b/collects/redex/tests/bmps-macosx/metafunction.png new file mode 100644 index 0000000000000000000000000000000000000000..5eb6cdbeffbaa9e4488ac3e2e9f6afd316a1eb7a GIT binary patch literal 1076 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 literal 0 HcmV?d00001 diff --git a/collects/redex/tests/bmps-macosx/reduction-relation.png b/collects/redex/tests/bmps-macosx/reduction-relation.png new file mode 100644 index 0000000000000000000000000000000000000000..1da77851c26e875dbfd20794e8aa37abe62f8493 GIT binary patch literal 1801 zcmV+k2ln`hP)oL+}q~%Y&ZxemM7X&pii_t5Wy=zWAKS-{X1TXYj(~ zVIYLyFE9+_a5(<>$B!S;(b3V-(GUjYT7sWHe}-8b33E|k5B)-Oia*=$-d9$Yiw*>xpL*FPoE41!uzJC3R5PJ0J(cZm#>9yV6 z-IbMf?%ZhrjuF+DxKp`igG)Y;joR4Rj+^Con6nEn0z0)c?RU;qF)1^} z9*<{ma8NFnhcIETBR1GOi(E+U&f2wWIUJ75jA4LJo%`Gcywa_S3~J3Bik zCx`fy@%en^<>ed>$7;0_hC-nrn&l6E87h^ks;Y_{{9;%D@b>N7lP6EEU%wszSS(g) zX(^Y>#W3tQzp4QMfc#zd*WaB50K0eZzIpQ|lgZ4@&6UYyQBhIn&!7MGOZgAN1c3YZ z@2l17yLa#I*s+7p=jZ3=zj^Z}blJ?z%#$Zi5)%{6X7kghPq%K}Iyg8;*GwjpR4Uc$ z^#EWr8p-n)ozI^?>vTGuPFGP;v49;dCQJZ`kB`4~>z2deXm4*XDJgmJ;)Oz?pifm~ zf=%QUf(_Yp0#5C}9j47@d+^`^LWslR?A*EY>eZ`XzI=&^i3#{G3kvj!oKCdu*$WuF;&HlH0h#X9@SiE`j zW{pNOG&BSNIF9S}`d6=BWo2cBuB1=oZnxWDFi_@r`jAc6f=%te9VUy#s;{s2`Fu%9 zNeKxFOP4M!D=Vw0s5pH1aIl)^&!0=BQlHP4nwom>;K9<;QYMoL01XWd`}gmE_Usv1 zj*E*+Nl7U#E+(9ST3%kB!{Io7{CHhm-T3%8m&=XJX8$!T0NA*3V@F5Fz`($_Z{NgX zu|OaQU87VgTU%S>;^F|{`t|EGGc&|7?e%)o($Xm9 zl%ph|#$YhWtr;C1wOA}xt95E>iU=04$NBU36dH`4o}S6cNdRE8*~A0SO`A6Hc)W-% r%Wk(14-b=Xnw*@xV#SJx-jvQCDjvs}SOm{T00000NkvXXu0mjf7chxx literal 0 HcmV?d00001 diff --git a/collects/redex/tests/bmps-macosx/superscripts.png b/collects/redex/tests/bmps-macosx/superscripts.png new file mode 100644 index 0000000000000000000000000000000000000000..69484218f2decdc0365848277dc928f7cc4c18c9 GIT binary patch literal 944 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≻cyrZhlDoHSYdX%-Abim7zQG$sydxcDNFmzt#$YNeMM1Ls}%q&mrG64 x%H=Y3dcT}br}swFXf&v^vx!DpKZq3l;0MDPgqgq^{l5SJ002ovPDHLkV1jVP>wN$K literal 0 HcmV?d00001 diff --git a/collects/redex/tests/bmps-macosx/unix-language-nox.png b/collects/redex/tests/bmps-macosx/unix-language-nox.png new file mode 100644 index 0000000000000000000000000000000000000000..a05ce95394ac8c60651378d72a98fca9a09db418 GIT binary patch literal 3129 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 RW$;P>K>x6}s4@3V{SS=q43q!> literal 0 HcmV?d00001 diff --git a/collects/redex/tests/bmps-macosx/unix-language.png b/collects/redex/tests/bmps-macosx/unix-language.png new file mode 100644 index 0000000000000000000000000000000000000000..cb88a9a4d92e2ff3cf89d78687bca196cdd604f1 GIT binary patch literal 5597 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 PEky01mQtC5Rmgt;9){&b literal 0 HcmV?d00001 diff --git a/collects/redex/tests/bmps-macosx/unix-lw.png b/collects/redex/tests/bmps-macosx/unix-lw.png new file mode 100644 index 0000000000000000000000000000000000000000..708c9df4aa9e473580a6e096b6bcfceb06847b34 GIT binary patch literal 1181 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 JN7&=Y{{a}I;I9Ax literal 0 HcmV?d00001 diff --git a/collects/redex/tests/bmps-macosx/unix-metafunction-Name.png b/collects/redex/tests/bmps-macosx/unix-metafunction-Name.png new file mode 100644 index 0000000000000000000000000000000000000000..b299b86abdddc528abe1b6087fcc97d092731cdc GIT binary patch literal 3738 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 literal 0 HcmV?d00001 diff --git a/collects/redex/tests/bmps-macosx/unix-metafunction-T.png b/collects/redex/tests/bmps-macosx/unix-metafunction-T.png new file mode 100644 index 0000000000000000000000000000000000000000..05edef44444f9588e0589d0410e6f3951feb2ff4 GIT binary patch literal 4027 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 literal 0 HcmV?d00001 diff --git a/collects/redex/tests/bmps-macosx/unix-metafunction-TL.png b/collects/redex/tests/bmps-macosx/unix-metafunction-TL.png new file mode 100644 index 0000000000000000000000000000000000000000..378e0fd05bd9cc4e62bf22865beca217e8c10ff1 GIT binary patch literal 4547 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 IqJ|3o7vKN$#{d8T literal 0 HcmV?d00001 diff --git a/collects/redex/tests/bmps-macosx/unix-metafunction-multi-arg.png b/collects/redex/tests/bmps-macosx/unix-metafunction-multi-arg.png new file mode 100644 index 0000000000000000000000000000000000000000..6753b06610c91138ac899994f5552dbcce5ed2c0 GIT binary patch literal 7208 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 literal 0 HcmV?d00001 diff --git a/collects/redex/tests/bmps-macosx/unix-metafunction-subst.png b/collects/redex/tests/bmps-macosx/unix-metafunction-subst.png new file mode 100644 index 0000000000000000000000000000000000000000..3f00d4671a50c2fb46f2794e82bb80ab9502099b GIT binary patch literal 5287 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 BAZY*q literal 0 HcmV?d00001 diff --git a/collects/redex/tests/bmps-macosx/unix-metafunction.png b/collects/redex/tests/bmps-macosx/unix-metafunction.png new file mode 100644 index 0000000000000000000000000000000000000000..b9d908c4acc0117dbac44ffbcd52f880a3c48ed5 GIT binary patch literal 1158 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 literal 0 HcmV?d00001 diff --git a/collects/redex/tests/bmps-macosx/unix-reduction-relation.png b/collects/redex/tests/bmps-macosx/unix-reduction-relation.png new file mode 100644 index 0000000000000000000000000000000000000000..d2196e527cf0deb34f2c0ac4abebf33bd96d756a GIT binary patch literal 1956 zcmV;V2V3}wP)k?gBetft?wGce{5p+kAc5=O6Dme$ROx&-3^^ z?jA9O5QGRMocW%>|DRBa15T*K0Vh=AfDns=+TUf49Z0_5kj|b-xdf2R;$%(3YxyBr$;On1As!I zKnUgL<_ZJ?l}d#WG8hbDVPP{fGhXu;3{K_%>+Tz*47dP;dz>S>XVX^va+(yo;_PrQ?qK-s;sOm z(!XfYB2rJwV6)lw@87T0YRT;%6%`c|6Vun%#}WbnGMVh<%a`PHYisM;wQJ+z;@Cs5 zKtc^c8&9j#Dn02>=%^TsV31GltyLa#QIZA+FuP*=qLa4mFT&Yx2d*0m~9UaAS zd}L&VG!+U(VPPTdcZ3#hu~@ck+h(;|34(}^kKem@FZHbl4;}~vf*(JA&@$Y;dl$#? z(a}+a(6?{j($dn%tCA&zBsn=bEG+EFlPB&@_K-gd_;L6ELg>Yd7ZDK=4u^wuxtk>= zCGNL&OG^u%&;R`SvwI46{h2doVq;_DCMx&uQ*+c#y)E@OABfsp~v*+BobCj26`otgo#KeR| zA{iSS^FM8HLVg>6>WionI~)$RTCLaXy_!Dpsdu?t85tSf-Q9jB3|dGK_}4mo`t*s# z^a+dJ<#JgpmRV&BPDl{&bsL75Goe@V0Vh=AfDKBdN~PpOM@PpzPB$|%GbJSj!!WsAPCj&Xbe4$*Ck&)fq-D}pYVF~N) z?Tw3z!!S&#R04ontriM}>FMcAdYw)u5{Z^BT}r+Z>+0%CNJx-KBwk-YQ*?E8sZ^@; z^mLg_rqya^`?LL5KnNW;Z~((FwOW1S#toCn^EiGNKVueg5yLt1b&$VId9x=hx2l5I_t7*Z30|1A^(P%UpjmG724Gaui zzka=-pddUveEat8?7?MaWeSC2-MV#Gu3Ygs64eLd^Z8X(Rh^xkEMltFbnV(T(nGbH z794nAU*F}+mm3-y0D!~c$mMdmT>jz1hvw#HpC$I%Jz|2X59Ae=R?~umBNPf78yg1) z2i?7PyPfRgvcS|mVuGm;kbEiTeohVK7G2fveINSg@=dB<#N4VpPZb` zv?`UAl{%e{$K%=U_J)QAyWL)2U;p#x&$_z0*RNl%U%#Hu=X(v5$z)QgG&MDq@-XSu zYPD9Y&CJYU_ z|I#WFi3o!D{{6d1B&w*WVA@baLqkTRap%sRey;9p^#G8WnQ66J&1Q2 (number_1 word) + (,(+ (term number_1) 1) word) + inc)) + '(1 word) + #:pred color-range-pred)) + +(let () + (define-language empty-language) + + (define (last-color-pred sexp term-node) + (if (null? (term-node-children term-node)) + "green" + "white")) + + (traces (reduction-relation + empty-language + (--> (number_1 word) + (,(+ (term number_1) 1) word) + inc) + (--> (number_1 word) + (,(* (term number_1) 2) word) + dup)) + '(1 word) + #:pred last-color-pred)) diff --git a/collects/redex/tests/config.ss b/collects/redex/tests/config.ss new file mode 100644 index 0000000000..721ab32da1 --- /dev/null +++ b/collects/redex/tests/config.ss @@ -0,0 +1,5 @@ +#lang scheme +(provide set-show-bitmaps? get-show-bitmaps?) +(define show-bitmaps? #t) +(define (set-show-bitmaps? sb?) (set! show-bitmaps? sb?)) +(define (get-show-bitmaps?) show-bitmaps?) \ No newline at end of file diff --git a/collects/redex/tests/core-layout-test.ss b/collects/redex/tests/core-layout-test.ss new file mode 100644 index 0000000000..a184bc77c1 --- /dev/null +++ b/collects/redex/tests/core-layout-test.ss @@ -0,0 +1,82 @@ +#lang scheme/base + +(require "../private/core-layout.ss" + "../private/loc-wrapper.ss" + "lw-test-util.ss" + "test-util.ss" + (lib "struct.ss")) + +(require (lib "mrpict.ss" "texpict") + (lib "mred.ss" "mred") + (lib "class.ss")) +(dc-for-text-size (make-object bitmap-dc% (make-object bitmap% 1 1))) + +(reset-count) + +(let ([content + (list (make-lw 'x 15 1 35 0 #f #f) + (make-lw (list + (make-lw "(" 15 0 35 1 #f #f) + (make-lw 'a 15 0 36 1 #f #f) + (make-lw 'b 16 0 36 1 #f #f) + (make-lw ")" 16 0 37 1 #f #f)) + 15 1 35 3 #f #f))]) + (test (find-enclosing-loc-wrapper content) + (build-lw content + 15 1 35 3))) + +(define (replace-pict-tokens x) + (let loop ([x x]) + (cond + [(line? x) (make-line (line-n x) (loop (line-tokens x)))] + [(pair? x) (cons (loop (car x)) + (loop (cdr x)))] + [(pict-token? x) + (copy-struct pict-token x [pict-token-pict 'pict])] + [else x]))) + +(test (replace-pict-tokens + (build-lines + '() + (normalize-lw + (to-lw + ,(term + (a b c)))))) + (list (make-line 0 + (list (make-spacer-token 0 2) + (make-string-token 2 1 "(" 'roman) + (make-string-token 3 1 "a" 'swiss) + (make-string-token 4 1 " " 'roman) + (make-string-token 5 1 "b" 'swiss) + (make-string-token 6 1 " " 'roman) + (make-string-token 7 1 "c" 'swiss) + (make-string-token 8 1 ")" 'roman))) + (make-line 0 + (list (make-string-token 0 0 "" 'roman) + (make-pict-token 0 1 'pict) + (make-pict-token 1 0 'pict))))) + +(test (replace-pict-tokens + (build-lines + '() + (normalize-lw + (to-lw + ,(term + (a b + c)))))) + (list (make-line 1 + (list (make-spacer-token 0 5) + (make-string-token 5 1 "c" 'swiss) + (make-string-token 6 1 ")" 'roman))) + (make-line 0 + (list (make-spacer-token 0 2) + (make-string-token 2 1 "(" 'roman) + (make-string-token 3 1 "a" 'swiss) + (make-string-token 4 1 " " 'roman) + (make-string-token 5 1 "b" 'swiss))) + (make-line 0 + (list (make-string-token 0 0 "" 'roman) + (make-pict-token 0 1 'pict) + (make-pict-token 1 0 'pict))))) + +(print-tests-passed "core-layout.ss") diff --git a/collects/redex/tests/hole-test.ss b/collects/redex/tests/hole-test.ss new file mode 100644 index 0000000000..7536526d5a --- /dev/null +++ b/collects/redex/tests/hole-test.ss @@ -0,0 +1,32 @@ +#lang scheme +(require redex) + +(define-language tl-grammar + [v (cont (hide-hole E))] + [E hole + (v ... E)]) + +(define test1 + (reduction-relation + tl-grammar + [--> (in-hole E_1 (explode)) + (in-hole E_1 1)])) + +(test--> test1 + (term ((cont hole) (explode))) + (term ((cont hole) 1))) + +(define test2 + (reduction-relation + tl-grammar + [--> (in-hole E_1 (explode)) + (asplode E_1)])) + +(define-metafunction tl-grammar + asplode : E -> any + [(asplode ((cont hole) hole)) + okay]) + +(test--> test2 + (term ((cont hole) (explode))) + (term okay)) diff --git a/collects/redex/tests/keyword-macros-test.ss b/collects/redex/tests/keyword-macros-test.ss new file mode 100644 index 0000000000..97491d3e9f --- /dev/null +++ b/collects/redex/tests/keyword-macros-test.ss @@ -0,0 +1,46 @@ +#lang scheme + +(require "../private/keyword-macros.ss" + "test-util.ss") + +(reset-count) + +(let* ([formals `((#:b . ,#'1) (#:c . ,#'2))] + [parse + (λ (actuals) + (map syntax-e + (parse-kw-args formals (cdr (syntax-e actuals)) actuals)))]) + (let-syntax ([msg-src + (syntax-rules () + [(_ expr) + (with-handlers ([exn:fail:syntax? + (λ (exn) + (values (exn-message exn) + (exn:fail:syntax-exprs exn)))]) + (begin expr (values 'no-msg 'no-src)))])]) + (let () + (test (parse #'(a #:c 3 #:b 4)) '(4 3)) + (test (parse #'(a #:b 4 #:c 3)) '(4 3)) + (test (parse #'(a #:c 3)) '(1 3)) + (let*-values ([(kw) #'#:b] + [(msg src) (msg-src (parse #`(a #,kw)))]) + (test msg #rx"a: missing argument expression after keyword") + (test src (list kw))) + (let*-values ([(arg) #'1] + [(msg src) (msg-src (parse #`(a #:b 1 #,arg)))]) + (test msg #rx"a: expected a keyword") + (test src (list arg))) + (let*-values ([(kw) #'#:c] + [(msg src) (msg-src (parse #`(a #:c 1 #:b 2 #,kw 3)))]) + (test msg #rx"a: repeated keyword") + (test src (list kw))) + (let*-values ([(kw) #'#:c] + [(msg src) (msg-src (parse #`(a #:b #,kw 3)))]) + (test msg #rx"a: expected an argument expression") + (test src (list kw))) + (let*-values ([(kw) #'#:typo] + [(msg src) (msg-src (parse #`(a #:b 3 #,kw 4)))]) + (test msg #rx"a: invalid keyword") + (test src (list kw)))))) + +(print-tests-passed 'keyword-macros-test.ss) diff --git a/collects/redex/tests/lw-test-util.ss b/collects/redex/tests/lw-test-util.ss new file mode 100644 index 0000000000..a1dd92c934 --- /dev/null +++ b/collects/redex/tests/lw-test-util.ss @@ -0,0 +1,43 @@ +(module lw-test-util mzscheme + (require "../private/loc-wrapper.ss") + (provide normalize-lw) + + (define (normalize-lw lw) + (define-values (min-line min-column) (find-min-line/col lw)) + (define (normalize/lw lw) + (cond + [(lw? lw) + (make-lw (normalize/e (lw-e lw)) + (- (lw-line lw) min-line) + (lw-line-span lw) + (- (lw-column lw) min-column) + (lw-column-span lw) + (lw-unq? lw) + (lw-metafunction? lw))] + [else lw])) + (define (normalize/e e) + (cond + [(symbol? e) e] + [(string? e) e] + [else (map normalize/lw e)])) + (normalize/lw lw)) + + (define (find-min-line/col lw) + (define min-line #f) + (define min-col #f) + (define (find-min/lw lw) + (when (lw? lw) + (set! min-line (if min-line + (min min-line (lw-line lw)) + (lw-line lw))) + (set! min-col (if min-col + (min min-col (lw-column lw)) + (lw-column lw))) + (find-min/e (lw-e lw)))) + (define (find-min/e e) + (cond + [(symbol? e) (void)] + [(string? e) (void)] + [else (for-each find-min/lw e)])) + (find-min/lw lw) + (values min-line min-col))) diff --git a/collects/redex/tests/lw-test.ss b/collects/redex/tests/lw-test.ss new file mode 100644 index 0000000000..89dd8babc2 --- /dev/null +++ b/collects/redex/tests/lw-test.ss @@ -0,0 +1,282 @@ +#| + + DO NOT TABIFY THIS FILE + +|# + + +; +; +; ;;;; +; ; ; ; +; ; ; ;;; ;; ;; ;;; ;;;;; +; ; ; ; ; ;; ; ; ; ; +; ; ; ; ; ; ; ; ; ; +; ; ; ; ; ; ; ; ; ; +; ; ; ; ; ; ; ; ; ; ; +; ;;;; ;;; ;;; ;;; ;;; ;;; +; +; +; +; +; +; +; ;; ; ;;; +; ; ; ; +; ;;;;; ;;; ; ;; ;;; ;;;;; ;;; ;;; +; ; ; ; ;; ; ; ; ; ; +; ; ;;;; ; ; ; ; ; ; +; ; ; ; ; ; ; ; ; ; +; ; ; ; ; ; ; ; ; ;; +; ;;; ;;;;;;;;;; ;;;;; ;;;;; ; +; ; +; ;;;; +; +; +; +; +; ;; ; ;;; ; ;; +; ; ; ; ; +; ;;;;; ; ;; ;;; ;;;; ;;;;; ;;; ; ;;; +; ; ;; ; ; ; ; ; ; ; ; ; +; ; ; ; ; ;;; ; ; ; ;;;;; +; ; ; ; ; ; ; ; ; ; +; ; ; ; ; ; ; ; ; ; ; ; +; ;;; ;;; ;;; ;;;;; ;;;; ;;;;; ;;;;; ;;;;; ;;;; +; +; +; +; + + +(module lw-test mzscheme + (require "test-util.ss" + "../private/loc-wrapper.ss" + "lw-test-util.ss") + + (reset-count) + + (test (normalize-lw (to-lw ())) + (build-lw (list (build-lw "(" 0 0 0 1) + (build-lw ")" 0 0 1 1)) + 0 0 0 2)) + + (test (normalize-lw (to-lw "x")) + (build-lw "“x”" 0 0 0 3)) + + (test (normalize-lw (to-lw "#f")) + (build-lw "“#f”" 0 0 0 4)) + + (test (normalize-lw (to-lw #f)) + (build-lw "#f" 0 0 0 2)) + + (test (normalize-lw (to-lw/uq ())) + (make-lw (list (make-lw "(" 0 0 0 1 #t #f) + (make-lw ")" 0 0 1 1 #t #f)) + 0 0 0 2 #t #f)) + + (test (normalize-lw (to-lw (a))) + (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)) + + (test (normalize-lw (to-lw (a + b))) + (build-lw (list (build-lw "(" 0 0 0 1) + (build-lw 'a 0 0 1 1) + (build-lw 'b 1 0 1 1) + (build-lw ")" 1 0 2 1)) + 0 1 0 3)) + + (test (normalize-lw (to-lw (a b))) + (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)) + + + (test (normalize-lw (to-lw (a + (b c) + d))) + (build-lw (list (build-lw "(" 0 0 0 1) + (build-lw 'a 0 0 1 1) + (build-lw + (list (build-lw "(" 1 0 1 1) + (build-lw 'b 1 0 2 1) + (build-lw 'c 1 0 4 1) + (build-lw ")" 1 0 5 1)) + 1 0 1 5) + (build-lw 'd 2 0 1 1) + (build-lw ")" 2 0 2 1)) + 0 2 0 3)) + + (test (normalize-lw (to-lw (abcdefghijkl + b))) + (build-lw (list (build-lw "(" 0 0 0 1) + (build-lw 'abcdefghijkl 0 0 1 12) + (build-lw 'b 1 0 1 1) + (build-lw ")" 1 0 2 1)) + 0 1 0 3)) + + (test (normalize-lw (to-lw ((a b) + c))) + (build-lw (list (build-lw "(" 0 0 0 1) + (build-lw + (list (build-lw "(" 0 0 1 1) + (build-lw 'a 0 0 2 1) + (build-lw 'b 0 0 4 1) + (build-lw ")" 0 0 5 1)) + 0 0 1 5) + (build-lw 'c 1 0 1 1) + (build-lw ")" 1 0 2 1)) + 0 1 0 3)) + + (test (normalize-lw (to-lw (aaa bbb + (ccc + ddd)))) ;; <--- the ddd should be lined up under the aaa + (build-lw (list (build-lw "(" 0 0 0 1) + (build-lw 'aaa 0 0 1 3) + (build-lw 'bbb 0 0 5 3) + (build-lw + (list + (build-lw "(" 1 0 5 1) + (build-lw 'ccc 1 0 6 3) + (build-lw 'ddd 2 0 1 3) + (build-lw ")" 2 0 4 1)) + 1 1 1 4) + (build-lw ")" 2 0 5 1)) + 0 2 0 6)) + + (test (normalize-lw (to-lw (aaa bbb + (ccc + ddd ;; <--- the ddd should be lined up under the aaa + eee)))) ;; <--- the eee should be lined up under the ccc + (build-lw (list (build-lw "(" 0 0 0 1) + (build-lw 'aaa 0 0 1 3) + (build-lw 'bbb 0 0 5 3) + (build-lw + (list + (build-lw "(" 1 0 5 1) + (build-lw 'ccc 1 0 6 3) + (build-lw 'ddd 2 0 1 3) + (build-lw 'eee 3 0 6 3) + (build-lw ")" 3 0 9 1)) + 1 2 1 9) + (build-lw ")" 3 0 10 1)) + 0 3 0 11)) + + (test (normalize-lw (to-lw ([{}]))) + (build-lw (list (build-lw "(" 0 0 0 1) + (build-lw + (list + (build-lw "[" 0 0 1 1) + (build-lw + (list + (build-lw "{" 0 0 2 1) + (build-lw "}" 0 0 3 1)) + 0 0 2 2) + (build-lw "]" 0 0 4 1)) + 0 0 1 4) + (build-lw ")" 0 0 5 1)) + 0 0 0 6)) + + (test (normalize-lw (to-lw ,x)) + (make-lw + (list + (make-lw "" 0 0 0 0 #f #f) + 'spring + (make-lw 'x 0 0 1 1 #t #f)) + 0 0 0 2 #f #f)) + + (test (normalize-lw (to-lw ,@x)) + (make-lw + (list + (make-lw "" 0 0 0 0 #f #f) + 'spring + (make-lw 'x 0 0 2 1 #t #f)) + 0 0 0 3 #f #f)) + + (test (normalize-lw (to-lw 'x)) + (make-lw + (list + (make-lw "'" 0 0 0 1 #f #f) + 'spring + (make-lw 'x 0 0 1 1 #f #f)) + 0 0 0 2 #f #f)) + + (test (normalize-lw (to-lw ,(term x))) + (make-lw + (list + (make-lw "" 0 0 0 0 #f #f) + 'spring + (make-lw + (list + (make-lw "" 0 0 1 0 #t #f) + 'spring + (make-lw 'x 0 0 7 1 #f #f)) + 0 0 1 7 #t #f)) + 0 0 0 8 #f #f)) + + (test (normalize-lw (to-lw (term x))) + (build-lw + (list + (build-lw "(" 0 0 0 1) + (build-lw 'term 0 0 1 4) + (build-lw 'x 0 0 6 1) + (build-lw ")" 0 0 7 1)) + 0 0 0 8)) + + (test (normalize-lw (to-lw '(term x))) + (build-lw + (list + (build-lw "'" 0 0 0 1) + 'spring + (build-lw + (list + (build-lw "(" 0 0 1 1) + (build-lw 'term 0 0 2 4) + (build-lw 'x 0 0 7 1) + (build-lw ")" 0 0 8 1)) + 0 + 0 + 1 + 8)) + 0 0 0 9)) + + (test (normalize-lw (to-lw ''x)) + (build-lw + (list + (build-lw "'" 0 0 0 1) + 'spring + (build-lw + (list + (build-lw "'" 0 0 1 1) + 'spring + (build-lw 'x 0 0 2 1)) + 0 + 0 + 1 + 2)) + 0 0 0 3)) + + ;; this one seems suspicious: why does the second comma start at 1 instead of 0? + ;; rendering seems to work, however, so we'll go with it .. + (test (normalize-lw (to-lw ,,x)) + (build-lw + (list + (build-lw "" 0 0 0 0) + 'spring + (make-lw + (list + (make-lw "," 0 0 1 1 #t #f) + 'spring + (make-lw 'x 0 0 2 1 #t #f)) + 0 0 1 2 + #t #f)) + 0 0 0 3)) + + (print-tests-passed "lw-test.ss")) + diff --git a/collects/redex/tests/matcher-test.ss b/collects/redex/tests/matcher-test.ss new file mode 100644 index 0000000000..640f6b20d8 --- /dev/null +++ b/collects/redex/tests/matcher-test.ss @@ -0,0 +1,820 @@ +(module matcher-test mzscheme + (require "../private/matcher.ss" + (only "test-util.ss" equal/bindings?) + (lib "list.ss")) + + (error-print-width 500) + + (define (make-test-mtch a b c) (make-mtch a (build-flat-context b) c)) + + (define (test) + (print-struct #t) + (test-empty 'any 1 (list (make-test-mtch (make-bindings (list (make-bind 'any 1))) 1 none))) + (test-empty 'any 'true (list (make-test-mtch (make-bindings (list (make-bind 'any 'true))) 'true none))) + (test-empty 'any "a" (list (make-test-mtch (make-bindings (list (make-bind 'any "a"))) "a" none))) + (test-empty 'any '(a b) (list (make-test-mtch (make-bindings (list (make-bind 'any '(a b)))) '(a b) none))) + (test-empty 'any #t (list (make-test-mtch (make-bindings (list (make-bind 'any #t))) #t none))) + (test-empty 1 1 (list (make-test-mtch (make-bindings null) 1 none))) + (test-empty 1 '() #f) + (test-empty 99999999999999999999999999999999999999999999999 + 99999999999999999999999999999999999999999999999 + (list (make-test-mtch (make-bindings null) + 99999999999999999999999999999999999999999999999 + none))) + (test-empty 99999999999999999999999999999999999999999999999 + '() + #f) + (test-empty 'x 'x (list (make-test-mtch (make-bindings null) 'x none))) + (test-empty 'x '() #f) + (test-empty 1 2 #f) + (test-empty "a" "b" #f) + (test-empty "a" '(x) #f) + (test-empty "a" '() #f) + (test-empty "a" "a" (list (make-test-mtch (make-bindings null) "a" none))) + (test-empty 'number 1 (list (make-test-mtch (make-bindings (list (make-bind 'number 1))) 1 none))) + (test-empty 'number 'x #f) + (test-empty 'number '() #f) + (test-empty 'natural 1 (list (make-test-mtch (make-bindings (list (make-bind 'natural 1))) 1 none))) + (test-empty 'natural 'x #f) + (test-empty 'natural '() #f) + (test-empty 'natural -1 #f) + (test-empty 'natural 1.0 #f) + (test-empty 'integer -1 (list (make-test-mtch (make-bindings (list (make-bind 'integer -1))) -1 none))) + (test-empty 'integer 'x #f) + (test-empty 'integer '() #f) + (test-empty 'integer 1.0 #f) + (test-empty 'real 1.1 (list (make-test-mtch (make-bindings (list (make-bind 'real 1.1))) 1.1 none))) + (test-empty 'real 'x #f) + (test-empty 'real '() #f) + (test-empty 'real 2+3i #f) + (test-empty 'string "a" (list (make-test-mtch (make-bindings (list (make-bind 'string "a"))) "a" none))) + (test-empty 'string 1 #f) + (test-empty 'string '() #f) + (test-empty 'variable 'x (list (make-test-mtch (make-bindings (list (make-bind 'variable 'x))) 'x none))) + (test-empty 'variable 1 #f) + (test-empty '(variable-except x) 1 #f) + (test-empty '(variable-except x) 'x #f) + (test-empty '(variable-except x) 'y (list (make-test-mtch (make-bindings null) 'y none))) + (test-lang 'x 'y (list (make-mtch (make-bindings (list (make-bind 'x 'y))) 'y none)) + (list (make-nt 'x (list (make-rhs '(variable-except x)))))) + (test-empty '(variable-prefix x:) 'x: (list (make-test-mtch (make-bindings null) 'x: none))) + (test-empty '(variable-prefix x:) 'x:x (list (make-test-mtch (make-bindings null) 'x:x none))) + (test-empty '(variable-prefix x:) ': #f) + (test-empty '(variable-prefix x:) '() #f) + + (test-empty 'hole 1 #f) + (test-empty `hole + the-hole + (list (make-test-mtch (make-bindings (list)) the-hole none))) + (test-empty '(in-hole (hole 2) 1) + '(1 2) + (list (make-test-mtch (make-bindings (list)) `(1 2) none))) + + (test-empty '(in-hole (name E_1 ((hide-hole hole) hole)) x) + `(,the-hole x) + (list (make-test-mtch (make-bindings (list (make-bind 'E_1 `(,the-not-hole ,the-hole)))) + `(,the-hole x) + none))) + + + + (test-empty '(name x number) 1 (list (make-test-mtch (make-bindings (list (make-bind 'x 1) (make-bind 'number 1))) 1 none))) + (test-empty 'number_x 1 (list (make-test-mtch (make-bindings (list (make-bind 'number_x 1))) 1 none))) + (test-empty 'string_y "b" (list (make-test-mtch (make-bindings (list (make-bind 'string_y "b"))) "b" none))) + (test-empty 'any_z '(a b) (list (make-test-mtch (make-bindings (list (make-bind 'any_z '(a b)))) '(a b) none))) + + (test-empty '(name x_!_1 number) 1 (list (make-test-mtch (make-bindings (list (make-bind 'number 1))) 1 none))) + (test-empty '((name x_!_1 number) (name x_!_1 number)) '(1 1) #f) + (test-empty '((name x_!_1 number_a) (name x_!_1 number_b)) '(1 2) + (list (make-test-mtch (make-bindings (list (make-bind 'number_a 1) + (make-bind 'number_b 2))) + '(1 2) + none))) + (test-empty '(number_!_1 number_!_1) '(1 1) #f) + (test-empty '(number_!_1 number_!_1) '(1 2) (list (make-test-mtch (make-bindings (list)) '(1 2) none))) + (test-empty '(number_!_1 ...) '(1 2) (list (make-test-mtch (make-bindings (list)) '(1 2) none))) + (test-empty '(number_!_1 ...) '(1 2 3 4 5) (list (make-test-mtch (make-bindings (list)) '(1 2 3 4 5) none))) + (test-empty '(number_!_1 ...) '(1 2 3 1 5) (list (make-test-mtch (make-bindings (list)) '(1 2 3 1 5) none))) + (test-empty '((number_!_1 ...) (number_!_1 ...)) + '((1 2 3 1 5) (1 2 3 1 5)) + #f) + (test-empty '((number_!_1 ...) (number_!_1 ...)) + '((17 2 3 1 5) (1 2 3 1 5)) + (list (make-test-mtch (make-bindings (list)) '((17 2 3 1 5) (1 2 3 1 5)) none))) + (test-empty '((number_!_1 number_!_1) ... number_!_1 ...) '((1 1) (2 2) 1 3) #f) + (test-empty '((number_!_1 number_!_1) ... number_!_1 ...) '((1 1) (2 3) 1 2) #f) + (test-empty '((number_!_1 number_!_1) ... number_!_1 ...) + '((1 1) (2 3) 1 4) + (list (make-test-mtch (make-bindings (list)) '((1 1) (2 3) 1 4) none))) + + (test-ellipses '(a) '(a)) + (test-ellipses '(a ...) `(,(make-repeat 'a '() #f #f))) + (test-ellipses '((a ...) ...) `(,(make-repeat '(a ...) '() #f #f))) + (test-ellipses '(a ... b c ...) `(,(make-repeat 'a '() #f #f) b ,(make-repeat 'c '() #f #f))) + (test-ellipses '((name x a) ...) `(,(make-repeat '(name x a) (list (make-bind 'x '())) #f #f))) + (test-ellipses '((name x (a ...)) ...) + `(,(make-repeat '(name x (a ...)) (list (make-bind 'x '())) #f #f))) + (test-ellipses '(((name x a) ...) ...) + `(,(make-repeat '((name x a) ...) (list (make-bind 'x '())) #f #f))) + (test-ellipses '((1 (name x a)) ...) + `(,(make-repeat '(1 (name x a)) (list (make-bind 'x '())) #f #f))) + (test-ellipses '((any (name x a)) ...) + `(,(make-repeat '(any (name x a)) (list (make-bind 'any '()) + (make-bind 'x '())) + #f #f))) + (test-ellipses '((number (name x a)) ...) + `(,(make-repeat '(number (name x a)) (list (make-bind 'number '()) + (make-bind 'x '())) + #f #f))) + (test-ellipses '((variable (name x a)) ...) + `(,(make-repeat '(variable (name x a)) (list (make-bind 'variable '()) + (make-bind 'x '())) + #f #f))) + (test-ellipses '(((name x a) (name y b)) ...) + `(,(make-repeat '((name x a) (name y b)) (list (make-bind 'x '()) (make-bind 'y '())) #f #f))) + (test-ellipses '((name x (name y b)) ...) + `(,(make-repeat '(name x (name y b)) (list (make-bind 'x '()) (make-bind 'y '())) #f #f))) + (test-ellipses '((in-hole (name x a) (name y b)) ...) + `(,(make-repeat '(in-hole (name x a) (name y b)) + (list (make-bind 'x '()) (make-bind 'y '())) #f #f))) + + (test-ellipses '(a ..._1) + `(,(make-repeat 'a (list) '..._1 #f))) + (test-ellipses '(a ..._!_1) + `(,(make-repeat 'a (list) '..._!_1 #t))) + + (test-empty '() '() (list (make-test-mtch (make-bindings null) '() none))) + (test-empty '(a) '(a) (list (make-test-mtch (make-bindings null) '(a) none))) + (test-empty '(a) '(b) #f) + (test-empty '(a b) '(a b) (list (make-test-mtch (make-bindings null) '(a b) none))) + (test-empty '(a b) '(a c) #f) + (test-empty '() 1 #f) + (test-empty '(#f x) '(#f x) (list (make-test-mtch (make-bindings null) '(#f x) none))) + (test-empty '(#f (name y any)) '(#f) #f) + (test-empty '(in-hole (z hole) a) '(z a) (list (make-test-mtch (make-bindings (list)) '(z a) none))) + (test-empty '(in-hole (z hole) (in-hole (x hole) a)) + '(z (x a)) + (list (make-test-mtch (make-bindings (list)) '(z (x a)) none))) + + (run-test/cmp 'in-hole-zero-holes + (with-handlers ([exn:fail? (λ (e) (regexp-match #rx"zero holes" (exn-message e)))]) + (test-empty '(in-hole (1 2) 2) '(1 2) 'never-gets-here) + 'should-have-raised-an-exception) + '("zero holes") + equal?) + + + (test-empty '(in-hole (in-hole (x hole) hole) y) + '(x y) + (list (make-test-mtch (make-bindings (list)) '(x y) none))) + + (test-empty '(number number) '(1 1) (list (make-test-mtch (make-bindings (list (make-bind 'number 1))) '(1 1) none))) + (test-empty '((name x number) (name x number)) '(1 1) (list (make-test-mtch (make-bindings (list (make-bind 'x 1) (make-bind 'number 1))) '(1 1) none))) + (test-empty '((name x number_q) (name x number_r)) '(1 1) (list (make-test-mtch (make-bindings (list (make-bind 'x 1) + (make-bind 'number_q 1) + (make-bind 'number_r 1))) + '(1 1) + none))) + (test-empty '(number number) '(1 2) #f) + (test-empty '((name x number) (name x number)) '(1 2) #f) + (test-empty '((name x number_q) (name x number_r)) '(1 2) #f) + + (test-empty '(a ...) '() (list (make-test-mtch (make-bindings empty) '() none))) + (test-empty '(a ...) '(a) (list (make-test-mtch (make-bindings empty) '(a) none))) + (test-empty '(a ...) '(a a) (list (make-test-mtch (make-bindings empty) '(a a) none))) + (test-empty '((name x a) ...) '() (list (make-test-mtch (make-bindings (list (make-bind 'x '()))) '() none))) + (test-empty '((name x a) ...) '(a) (list (make-test-mtch (make-bindings (list (make-bind 'x '(a)))) '(a) none))) + (test-empty '((name x a) ...) '(a a) (list (make-test-mtch (make-bindings (list (make-bind 'x '(a a)))) '(a a) none))) + + (test-empty '(b ... a ...) '() (list (make-test-mtch (make-bindings empty) '() none))) + (test-empty '(b ... a ...) '(a) (list (make-test-mtch (make-bindings empty) '(a) none))) + (test-empty '(b ... a ...) '(b) (list (make-test-mtch (make-bindings empty) '(b) none))) + (test-empty '(b ... a ...) '(b a) (list (make-test-mtch (make-bindings empty) '(b a) none))) + (test-empty '(b ... a ...) '(b b a a) (list (make-test-mtch (make-bindings empty) '(b b a a) none))) + (test-empty '(b ... a ...) '(a a) (list (make-test-mtch (make-bindings empty) '(a a) none))) + (test-empty '(b ... a ...) '(b b) (list (make-test-mtch (make-bindings empty) '(b b) none))) + + (test-empty '(a ..._1 a ..._2) + '(a) + (list (make-test-mtch (make-bindings (list (make-bind '..._1 1) (make-bind '..._2 0))) '(a) none) + (make-test-mtch (make-bindings (list (make-bind '..._1 0) (make-bind '..._2 1))) '(a) none))) + (test-empty '(a ..._1 a ..._1) '(a) #f) + (test-empty '(a ..._1 a ..._1) + '(a a) + (list (make-test-mtch (make-bindings (list (make-bind '..._1 1))) '(a a) none))) + + (test-empty '((name x a) ..._!_1 (name y a) ..._!_1) + '(a a) + (list (make-test-mtch (make-bindings (list (make-bind 'x '()) (make-bind 'y '(a a)))) '(a a) none) + (make-test-mtch (make-bindings (list (make-bind 'x '(a a)) (make-bind 'y '()))) '(a a) none))) + + (test-empty '((name y b) ... (name x a) ...) '() + (list (make-test-mtch (make-bindings (list (make-bind 'x '()) + (make-bind 'y '()))) + '() + none))) + (test-empty '((name y b) ... (name x a) ...) '(a) + (list (make-test-mtch (make-bindings (list (make-bind 'x '(a)) + (make-bind 'y '()))) + '(a) + none))) + (test-empty '((name y b) ... (name x a) ...) '(b) + (list (make-test-mtch (make-bindings (list (make-bind 'x '()) + (make-bind 'y '(b)))) + '(b) + none))) + (test-empty '((name y b) ... (name x a) ...) '(b b a a) + (list (make-test-mtch (make-bindings (list (make-bind 'x '(a a)) + (make-bind 'y '(b b)))) + '(b b a a) + none))) + (test-empty '((name y a) ... (name x a) ...) '(a) + (list (make-test-mtch (make-bindings (list (make-bind 'x '()) + (make-bind 'y '(a)))) + '(a) + none) + (make-test-mtch (make-bindings (list (make-bind 'x '(a)) + (make-bind 'y '()))) + '(a) + none))) + (test-empty '((name y a) ... (name x a) ...) '(a a) + (list (make-test-mtch (make-bindings (list (make-bind 'x '()) + (make-bind 'y '(a a)))) + '(a a) + none) + (make-test-mtch (make-bindings (list (make-bind 'x '(a)) + (make-bind 'y '(a)))) + '(a a) + none) + (make-test-mtch (make-bindings (list (make-bind 'x '(a a)) + (make-bind 'y '()))) + '(a a) + none))) + + (test-ab '(bb_y ... aa_x ...) '() + (list (make-test-mtch (make-bindings (list (make-bind 'aa_x '()) + (make-bind 'bb_y '()))) + '() + none))) + (test-ab '(bb_y ... aa_x ...) '(a) + (list (make-test-mtch (make-bindings (list (make-bind 'aa_x '(a)) + (make-bind 'bb_y '()))) + '(a) + none))) + (test-ab '(bb_y ... aa_x ...) '(b) + (list (make-test-mtch (make-bindings (list (make-bind 'aa_x '()) + (make-bind 'bb_y '(b)))) + '(b) + none))) + (test-ab '(bb_y ... aa_x ...) '(b b a a) + (list (make-test-mtch (make-bindings (list (make-bind 'aa_x '(a a)) + (make-bind 'bb_y '(b b)))) + '(b b a a) + none))) + (test-ab '(aa_y ... aa_x ...) '(a) + (list (make-test-mtch (make-bindings (list (make-bind 'aa_x '()) + (make-bind 'aa_y '(a)))) + '(a) + none) + (make-test-mtch (make-bindings (list (make-bind 'aa_x '(a)) + (make-bind 'aa_y '()))) + '(a) + none))) + (test-ab '(aa_y ... aa_x ...) '(a a) + (list (make-test-mtch (make-bindings (list (make-bind 'aa_x '()) + (make-bind 'aa_y '(a a)))) + '(a a) + none) + (make-test-mtch (make-bindings (list (make-bind 'aa_x '(a)) + (make-bind 'aa_y '(a)))) + '(a a) + none) + (make-test-mtch (make-bindings (list (make-bind 'aa_x '(a a)) + (make-bind 'aa_y '()))) + '(a a) + none))) + + (test-empty '((name x number) ...) '(1 2) (list (make-test-mtch (make-bindings (list (make-bind 'x '(1 2)) (make-bind 'number '(1 2)))) '(1 2) none))) + + (test-empty '(a ...) '(b) #f) + (test-empty '(a ... b ...) '(c) #f) + (test-empty '(a ... b) '(b c) #f) + (test-empty '(a ... b) '(a b c) #f) + + (test-empty '((name x any) + ((name x number) ...)) + '((1 1) (1 1)) + (list (make-test-mtch (make-bindings (list (make-bind 'x '(1 1)) + (make-bind 'any '(1 1)) + (make-bind 'number '(1 1)))) + '((1 1) (1 1)) + none))) + + (test-empty '((variable_1 variable_1) ...) + '((x y)) + #f) + + + (test-empty '(number ...) '() + (list (make-test-mtch (make-bindings (list (make-bind 'number '()))) '() none))) + (test-ab '(aa ...) '() + (list (make-test-mtch (make-bindings (list (make-bind 'aa '()))) '() none))) + + + ;; testing block-in-hole + (test-empty '(hide-hole a) 'b #f) + (test-empty '(hide-hole a) 'a (list (make-test-mtch (make-bindings '()) 'a none))) + (test-empty '(hide-hole a) '(block-in-hole a) #f) + (test-empty '(in-hole (x (hide-hole hole)) 1) '(x 1) #f) + (test-empty '(in-hole (x hole) 1) '(x 1) (list (make-test-mtch (make-bindings '()) '(x 1) none))) + (test-empty '(in-hole ((hole #f) (hide-hole hole)) junk) + '(junk junk2) + #f) + + (test-xab 'lsts '() (list (make-test-mtch (make-bindings (list (make-bind 'lsts '()))) '() none))) + (test-xab 'lsts '(x) (list (make-test-mtch (make-bindings (list (make-bind 'lsts '(x)))) '(x) none))) + (test-xab 'lsts 'x (list (make-test-mtch (make-bindings (list (make-bind 'lsts 'x))) 'x none))) + (test-xab 'lsts #f (list (make-test-mtch (make-bindings (list (make-bind 'lsts #f))) #f none))) + (test-xab 'split-out '1 (list (make-test-mtch (make-bindings (list (make-bind 'split-out 1))) '1 none))) + + (test-xab 'exp 1 (list (make-test-mtch (make-bindings (list (make-bind 'exp 1))) 1 none))) + (test-xab 'exp '(+ 1 2) (list (make-test-mtch (make-bindings (list (make-bind 'exp '(+ 1 2)))) '(+ 1 2) none))) + (test-xab '(in-hole ctxt any) + '1 + (list (make-test-mtch (make-bindings (list (make-bind 'ctxt the-hole) (make-bind 'any 1))) 1 none))) + (test-xab '(in-hole ctxt (name x any)) + '1 + (list (make-test-mtch (make-bindings (list (make-bind 'ctxt the-hole) (make-bind 'x 1) (make-bind 'any 1))) 1 none))) + (test-xab '(in-hole (name c ctxt) (name x any)) + '(+ 1 2) + (list (make-test-mtch (make-bindings (list (make-bind 'ctxt (build-context the-hole)) + (make-bind 'c (build-context the-hole)) + (make-bind 'x '(+ 1 2)) + (make-bind 'any '(+ 1 2)))) + '(+ 1 2) none) + (make-test-mtch (make-bindings (list (make-bind 'ctxt (build-context `(+ ,the-hole 2))) + (make-bind 'c (build-context `(+ ,the-hole 2))) + (make-bind 'x 1) + (make-bind 'any 1))) + '(+ 1 2) none) + (make-test-mtch (make-bindings (list (make-bind 'ctxt (build-context `(+ 1 ,the-hole))) + (make-bind 'c (build-context `(+ 1 ,the-hole))) + (make-bind 'x 2) + (make-bind 'any 2))) + '(+ 1 2) none))) + (test-xab '(in-hole (name c ctxt) (name i (+ number_1 number_2))) + '(+ (+ 1 2) (+ 3 4)) + (list (make-test-mtch + (make-bindings (list (make-bind 'i '(+ 1 2)) + (make-bind 'number_1 1) + (make-bind 'number_2 2) + (make-bind 'ctxt (build-context `(+ ,the-hole (+ 3 4)))) + (make-bind 'c (build-context `(+ ,the-hole (+ 3 4)))))) + '(+ (+ 1 2) (+ 3 4)) + none) + (make-test-mtch (make-bindings (list (make-bind 'i '(+ 3 4)) + (make-bind 'number_1 3) + (make-bind 'number_2 4) + (make-bind 'ctxt `(+ (+ 1 2) ,the-hole)) + (make-bind 'c `(+ (+ 1 2) ,the-hole)))) + '(+ (+ 1 2) (+ 3 4)) + none))) + + (test-empty '(in-hole ((z hole)) (name x any)) + '((z a)) + (list (make-test-mtch (make-bindings (list (make-bind 'x 'a) (make-bind 'any 'a))) '((z a)) none))) + (test-empty '(in-hole (name c (z ... hole z ...)) any) + '(z z) + (list + (make-test-mtch (make-bindings (list (make-bind 'c `(z ,the-hole)) (make-bind 'any 'z))) '(z z) none) + (make-test-mtch (make-bindings (list (make-bind 'c `(,the-hole z)) (make-bind 'any 'z))) '(z z) none))) + (test-empty '(in-hole (name c (z ... hole z ...)) any) + '(z z z) + (list + (make-test-mtch (make-bindings (list (make-bind 'c `(z z ,the-hole)) (make-bind 'any 'z))) '(z z z) none) + (make-test-mtch (make-bindings (list (make-bind 'c `(z ,the-hole z)) (make-bind 'any 'z))) '(z z z) none) + (make-test-mtch (make-bindings (list (make-bind 'c `(,the-hole z z)) (make-bind 'any 'z))) '(z z z) none))) + + (test-empty '(z (in-hole (name c (z hole)) a)) + '(z (z a)) + (list + (make-test-mtch (make-bindings (list (make-bind 'c `(z ,the-hole)))) + '(z (z a)) + none))) + + (test-empty '(a (in-hole (name c1 (b (in-hole (name c2 (c hole)) d) hole)) e)) + '(a (b (c d) e)) + (list + (make-test-mtch (make-bindings (list (make-bind 'c2 `(c ,the-hole)) + (make-bind 'c1 `(b (c d) ,the-hole)))) + '(a (b (c d) e)) + none))) + + (test-empty '(in-hole (in-hole hole hole) a) + 'a + (list (make-test-mtch (make-bindings (list)) 'a none))) + + (test-empty '(a (b (in-hole (name c1 (in-hole (name c2 (c hole)) (d hole))) e))) + '(a (b (c (d e)))) + (list + (make-test-mtch (make-bindings (list (make-bind 'c1 `(c (d ,the-hole))) + (make-bind 'c2 `(c ,the-hole)))) + '(a (b (c (d e)))) + none))) + + (test-empty `(+ 1 (side-condition any ,(lambda (bindings) #t) #t)) + '(+ 1 b) + (list (make-test-mtch (make-bindings (list (make-bind 'any 'b))) '(+ 1 b) none))) + (test-empty `(+ 1 (side-condition any ,(lambda (bindings) #f) #f)) + '(+ 1 b) + #f) + + (test-empty `(+ 1 (side-condition b ,(lambda (bindings) #t) #t)) + '(+ 1 b) + (list (make-test-mtch (make-bindings '()) '(+ 1 b) none))) + (test-empty `(+ 1 (side-condition a ,(lambda (bindings) #t)) #t) + '(+ 1 b) + #f) + + (test-empty `(side-condition (name x any) ,(lambda (bindings) (eq? (lookup-binding bindings 'x) 'a)) (eq? (term x) 'a)) + 'a + (list + (make-test-mtch (make-bindings (list (make-bind 'x 'a) + (make-bind 'any 'a))) + 'a + none))) + + (test-empty `(+ 1 (side-condition (name x any) ,(lambda (bindings) (eq? (lookup-binding bindings 'x) 'a)) (eq? (term x) 'a))) + '(+ 1 a) + (list + (make-test-mtch (make-bindings (list (make-bind 'x 'a) + (make-bind 'any 'a))) + '(+ 1 a) + none))) + + (test-empty `(side-condition (name x any) ,(lambda (bindings) (eq? (lookup-binding bindings 'x) 'a)) (eq? (term x) 'a)) + 'b + #f) + + (test-empty `(+ 1 (side-condition (name x any) ,(lambda (bindings) (eq? (lookup-binding bindings 'x) 'a)) (eq? (term x) 'a))) + '(+ 1 b) + #f) + + (test-empty `(side-condition ((any_1 ..._a) (any_2 ..._a)) + ,(lambda (bindings) (error 'should-not-be-called)) + (error 'should-not-be-called)) + '((1 2 3) (4 5)) + #f) + + (test-xab 'exp_1 + '(+ 1 2) + (list (make-test-mtch (make-bindings (list (make-bind 'exp_1 '(+ 1 2)))) '(+ 1 2) none))) + (test-xab '(exp_1 exp_2) + '((+ 1 2) (+ 3 4)) + (list (make-test-mtch (make-bindings (list (make-bind 'exp_1 '(+ 1 2)) (make-bind 'exp_2 '(+ 3 4)))) + '((+ 1 2) (+ 3 4)) + none))) + (test-xab '(exp_1 exp_1) + '((+ 1 2) (+ 3 4)) + #f) + (test-xab 'nesting-names + 'b + (list (make-test-mtch (make-bindings (list (make-bind 'nesting-names 'b))) 'b none))) + (test-xab 'nesting-names + '(a b) + (list (make-test-mtch (make-bindings (list (make-bind 'nesting-names '(a b)))) '(a b) none))) + (test-xab 'nesting-names + '(a (a b)) + (list (make-test-mtch (make-bindings (list (make-bind 'nesting-names '(a (a b))))) '(a (a b)) none))) + (test-xab '((name x a) nesting-names) + '(a (a (a b))) + (list (make-test-mtch (make-bindings (list (make-bind 'x 'a) + (make-bind 'nesting-names '(a (a b))))) + '(a (a (a b))) none))) + (test-xab 'nesting-names + '(a (a (a (a b)))) + (list (make-test-mtch (make-bindings (list (make-bind 'nesting-names '(a (a (a (a b))))))) + '(a (a (a (a b)))) none))) + + (test-xab 'same-in-nt + '(x x) + (list (make-test-mtch (make-bindings (list (make-bind 'same-in-nt '(x x)))) '(x x) none))) + (test-xab 'same-in-nt + '(x y) + #f) + + (test-xab '(in-hole (cross forever-list) 1) + '(a b c) + #f) + + (test-xab '(in-hole (cross forever-list) 1) + '(1 x x) + (list (make-test-mtch (make-bindings '()) '(1 x x) none))) + + (test-xab '(in-hole (cross forever-list) 1) + '(x 1 x) + (list (make-test-mtch (make-bindings '()) '(x 1 x) none))) + + + (test-xab '(in-hole (cross simple) g) + 'g + (list (make-mtch (make-bindings (list)) 'g none))) + + (test-xab 'var '+ #f) + (test-xab 'var 'anunusedvariable (list (make-mtch (make-bindings (list (make-bind 'var 'anunusedvariable))) 'anunusedvariable none))) + (test-xab 'var 'exp (list (make-mtch (make-bindings (list (make-bind 'var 'exp))) 'exp none))) + (test-xab 'var 'exp_x (list (make-mtch (make-bindings (list (make-bind 'var 'exp_x))) 'exp_x none))) + + (test-xab 'underscore '(+ 1 2) (list (make-mtch (make-bindings (list (make-bind 'underscore '(+ 1 2)))) '(+ 1 2) none))) + (test-xab 'underscore '2 (list (make-mtch (make-bindings (list (make-bind 'underscore 2))) 2 none))) + + (run-test + 'compatible-context-language1 + (build-compatible-context-language + (mk-hasheq '((exp . ()) (ctxt . ()))) + (list (make-nt 'exp + (list (make-rhs '(+ exp exp)) + (make-rhs 'number))) + (make-nt 'ctxt + (list (make-rhs '(+ ctxt exp)) + (make-rhs '(+ exp ctxt)) + (make-rhs 'hole))))) + (list + (make-nt 'ctxt-ctxt + (list (make-rhs 'hole) + (make-rhs `(+ (cross ctxt-ctxt) exp)) + (make-rhs `(+ ctxt (cross ctxt-exp))) + (make-rhs `(+ (cross ctxt-exp) ctxt)) + (make-rhs `(+ exp (cross ctxt-ctxt))))) + (make-nt 'ctxt-exp + (list (make-rhs `(+ (cross ctxt-exp) exp)) + (make-rhs `(+ exp (cross ctxt-exp))))) + (make-nt 'exp-ctxt + (list (make-rhs `(+ (cross exp-ctxt) exp)) + (make-rhs `(+ ctxt (cross exp-exp))) + (make-rhs `(+ (cross exp-exp) ctxt)) + (make-rhs `(+ exp (cross exp-ctxt))))) + (make-nt 'exp-exp + (list (make-rhs 'hole) + (make-rhs `(+ (cross exp-exp) exp)) + (make-rhs `(+ exp (cross exp-exp))))))) + + (run-test + 'compatible-context-language2 + (build-compatible-context-language + (mk-hasheq '((m . ()) (v . ()))) + (list (make-nt 'm (list (make-rhs '(m m)) (make-rhs '(+ m m)) (make-rhs 'v))) + (make-nt 'v (list (make-rhs 'number) (make-rhs '(lambda (x) m)))))) + (list + (make-nt 'v-v (list (make-rhs 'hole) (make-rhs (list 'lambda (list 'x) (list 'cross 'v-m))))) + (make-nt 'v-m + (list + (make-rhs (list (list 'cross 'v-m) 'm)) + (make-rhs (list 'm (list 'cross 'v-m))) + (make-rhs (list '+ (list 'cross 'v-m) 'm)) + (make-rhs (list '+ 'm (list 'cross 'v-m))) + (make-rhs (list 'cross 'v-v)))) + (make-nt 'm-v (list (make-rhs (list 'lambda (list 'x) (list 'cross 'm-m))))) + (make-nt 'm-m + (list + (make-rhs 'hole) + (make-rhs (list (list 'cross 'm-m) 'm)) + (make-rhs (list 'm (list 'cross 'm-m))) + (make-rhs (list '+ (list 'cross 'm-m) 'm)) + (make-rhs (list '+ 'm (list 'cross 'm-m))) + (make-rhs (list 'cross 'm-v)))))) + + (run-test + 'compatible-context-language3 + (build-compatible-context-language + (mk-hasheq '((m . ()) (seven . ()))) + (list (make-nt 'm (list (make-rhs '(m seven m)) (make-rhs 'number))) + (make-nt 'seven (list (make-rhs 7))))) + `(,(make-nt + 'm-m + `(,(make-rhs 'hole) ,(make-rhs `((cross m-m) seven m)) ,(make-rhs `(m seven (cross m-m))))) + ,(make-nt + 'seven-m + `(,(make-rhs `((cross seven-m) seven m)) ,(make-rhs `(m (cross seven-seven) m)) ,(make-rhs `(m seven (cross seven-m))))) + ,(make-nt 'seven-seven `(,(make-rhs 'hole))))) + + (run-test + 'compatible-context-language4 + (build-compatible-context-language + (mk-hasheq '((a . ()) (b . ()) (c . ()))) + (list (make-nt 'a (list (make-rhs 'b))) + (make-nt 'b (list (make-rhs 'c))) + (make-nt 'c (list (make-rhs 3))))) + (list (make-nt 'c-c (list (make-rhs 'hole))) + (make-nt 'c-b (list (make-rhs '(cross c-c)))) + (make-nt 'c-a (list (make-rhs '(cross c-b)))) + (make-nt 'b-b (list (make-rhs 'hole))) + (make-nt 'b-a (list (make-rhs '(cross b-b)))) + (make-nt 'a-a (list (make-rhs 'hole))))) + + #; + (test-xab '(in-hole (cross exp) (+ number number)) + '(+ (+ 1 2) 3) + (list (make-bindings (list (make-bind 'hole (make-hole-binding (list '+ 1 2) (list 'cdr 'car) #f)))))) + + (run-test/cmp 'split-underscore1 (split-underscore 'a_1) 'a eq?) + (run-test/cmp 'split-underscore2 (split-underscore 'a_!_1) 'a eq?) + (run-test/cmp 'split-underscore3 + (with-handlers ([exn:fail? (λ (e) (cadr (regexp-match #rx"^([^:]+):" (exn-message e))))]) + (split-underscore 'a_b_1)) + "compile-pattern" + equal?) + + (test-ellipsis-binding '((number_1 number_2) ...) '((1 2))) + (test-ellipsis-binding '((name x number_1) ...) '(1 2)) + (test-ellipsis-binding '(((number_1 ...) (number_2 ...)) ...) '(((1) (2)))) + (test-ellipsis-binding '(number ... variable) '(1 x)) + + (cond + [(= failures 0) + (printf "matcher-test.ss: all ~a tests passed.\n" test-count)] + [else + (printf "matcher-test.ss: ~a test~a failed.\n" + failures + (if (= failures 1) + "" + "s"))])) + + ;; mk-hasheq : (listof (cons sym any)) -> hash-table + ;; builds a hash table that has the bindings in assoc-list + (define (mk-hasheq assoc-list) + (let ([ht (make-hash-table)]) + (for-each + (lambda (a) + (hash-table-put! ht (car a) (cdr a))) + assoc-list) + ht)) + + ;; test-empty : sexp[pattern] sexp[term] answer -> void + ;; returns #t if pat matching exp with the empty language produces ans. + (define (test-empty pat exp ans) + (run-match-test + `(match-pattern (compile-pattern (compile-language 'pict-stuff-not-used '() '()) ',pat #t) ',exp) + (match-pattern + (compile-pattern (compile-language 'pict-stuff-not-used '() '()) pat #t) + exp) + ans)) + + ;; test-lang : sexp[pattern] sexp[term] answer (list/c nt) -> void + ;; returns #t if pat matching exp with the language defined by the given nts + (define (test-lang pat exp ans nts) + (let ([nt-map (map (λ (x) (list (nt-name x))) nts)]) + (run-match-test + `(match-pattern (compile-pattern (compile-language 'pict-stuff-not-used ',nts ',nt-map) ',pat #t) ',exp) + (match-pattern + (compile-pattern (compile-language 'pict-stuff-not-used nts nt-map) pat #t) + exp) + ans))) + + (define xab-lang #f) + ;; test-xab : sexp[pattern] sexp[term] answer -> void + ;; returns #t if pat matching exp with a simple language produces ans. + (define (test-xab pat exp ans) + (unless xab-lang + (let ([nts + (list (make-nt 'exp + (list (make-rhs '(+ exp exp)) + (make-rhs 'number))) + (make-nt 'ctxt + (list (make-rhs '(+ ctxt exp)) + (make-rhs '(+ exp ctxt)) + (make-rhs 'hole))) + + (make-nt 'ec-one + (list (make-rhs '(+ (hole xx) exp)) + (make-rhs '(+ exp (hole xx))))) + + (make-nt 'same-in-nt (list (make-rhs '((name x any) (name x any))))) + + (make-nt 'forever-list (list (make-rhs '(forever-list forever-list ...)) + (make-rhs 'x))) + + (make-nt 'lsts + (list (make-rhs '()) + (make-rhs '(x)) + (make-rhs 'x) + (make-rhs '#f))) + (make-nt 'split-out + (list (make-rhs 'split-out2))) + (make-nt 'split-out2 + (list (make-rhs 'number))) + + (make-nt 'simple (list (make-rhs 'simple-rhs))) + + (make-nt 'nesting-names + (list (make-rhs '(a (name x nesting-names))) + (make-rhs 'b))) + (make-nt 'var (list (make-rhs `variable-not-otherwise-mentioned))) + + (make-nt 'underscore (list (make-rhs 'exp_1))) + )]) + (set! xab-lang + (compile-language 'pict-stuff-not-used + nts + (map (λ (x) (list (nt-name x))) nts))))) + (run-match-test + `(match-pattern (compile-pattern xab-lang ',pat #t) ',exp) + (match-pattern (compile-pattern xab-lang pat #t) exp) + ans)) + + (define ab-lang #f) + ;; test-xab : sexp[pattern] sexp[term] answer -> void + ;; returns #t if pat matching exp with a simple language produces ans. + (define (test-ab pat exp ans) + (unless ab-lang + (set! ab-lang + (compile-language + 'pict-stuff-not-used + (list (make-nt 'aa + (list (make-rhs 'a))) + (make-nt 'bb + (list (make-rhs 'b)))) + '((aa) (bb))))) + (run-match-test + `(match-pattern (compile-pattern ab-lang ',pat #t) ',exp) + (match-pattern (compile-pattern ab-lang pat #t) exp) + ans)) + + ;; test-ellipses : sexp sexp -> void + (define (test-ellipses pat expected) + (run-test + `(rewrite-ellipses test-suite:non-underscore-binder? ',pat (lambda (x) (values x #f))) + (let-values ([(compiled-pattern has-hole?) (rewrite-ellipses test-suite:non-underscore-binder? pat (lambda (x) (values x #f)))]) + (cons compiled-pattern has-hole?)) + (cons expected #f))) + + (define (test-suite:non-underscore-binder? x) + (memq x '(number any variable string))) + + ;; test-ellipsis-binding: sexp sexp -> boolean + ;; Checks that `extract-empty-bindings' produces bindings in the same order + ;; as the matcher, as required by `collapse-single-multiples' + (define (test-ellipsis-binding pat exp) + (define (binding-names bindings) + (map (λ (b) + (cond [(bind? b) (bind-name b)] + [(mismatch-bind? b) (mismatch-bind-name b)])) + bindings)) + (run-test + `(test-ellipsis-binding ,pat) + (binding-names + (bindings-table-unchecked + (mtch-bindings + (car + ((compiled-pattern-cp + (compile-pattern (compile-language 'pict-stuff-not-used '() '()) pat #t)) + exp + #t))))) + (binding-names (extract-empty-bindings test-suite:non-underscore-binder? pat)))) + + ;; run-test/cmp : sexp any any (any any -> boolean) + ;; compares ans with expected. If failure, + ;; prints info about the test and increments failures + (define failures 0) + (define test-count 0) + (define (run-test/cmp symbolic ans expected cmp?) + (set! test-count (+ test-count 1)) + (cond + [(cmp? ans expected) + '(printf "passed: ~s\n" symbolic)] + [else + (set! failures (+ failures 1)) + (fprintf (current-error-port) + " test: ~s\nexpected: ~e\n got: ~e\n" + symbolic expected ans)])) + + (define (run-test symbolic ans expected) (run-test/cmp symbolic ans expected equal/bindings?)) + + ;; run-match-test : sexp got expected + ;; expects both ans and expected to be lists or both to be #f and + ;; compares them using a set-like equality if they are lists + (define (run-match-test symbolic ans expected) + (run-test/cmp + symbolic ans expected + (λ (xs ys) + (cond + [(and (not xs) (not ys)) #t] + [(and (list? xs) + (list? ys)) + (and (andmap (λ (x) (memf (λ (y) (equal/bindings? x y)) ys)) xs) + (andmap (λ (y) (memf (λ (x) (equal/bindings? x y)) xs)) ys) + (= (length xs) (length ys)))] + [else #f])))) + + (define (build-context c) + (let loop ([c c]) + (cond + [(eq? c the-hole) the-hole] + [(pair? c) (build-cons-context (loop (car c)) (loop (cdr c)))] + [(or (null? c) + (number? c) + (symbol? c)) + (build-flat-context c)] + [else (error 'build-context "unknown ~s" c)]))) + + (test)) diff --git a/collects/redex/tests/pict-test.ss b/collects/redex/tests/pict-test.ss new file mode 100644 index 0000000000..c80da26ac0 --- /dev/null +++ b/collects/redex/tests/pict-test.ss @@ -0,0 +1,53 @@ +(module pict-test mzscheme + ;; these tests just make sure that errors don't + ;; happen. These tests are really only last resorts + ;; for testing functions that aren't easily extraced + ;; from the pict.ss library + + (require "../reduction-semantics.ss" + "../pict.ss") + + (require (lib "mrpict.ss" "texpict") + (lib "mred.ss" "mred") + (lib "class.ss")) + + (define-language empty-language) + + (define-language var-ab + [var (a + b)]) + (render-language var-ab) + + (define-language var-not-ab + [var (variable-except x + y)]) + (render-language var-not-ab) + + (let () + (define-metafunction empty-language [(zero any_in) 0]) + (render-metafunction zero)) + + (render-reduction-relation + (reduction-relation + empty-language + (--> number_const + ,(term + (+ number_const 0))))) + + (render-reduction-relation + (reduction-relation + empty-language + (--> a b + (fresh x) + (fresh y)))) + + + (define-language x1-9 + (x 1 2 3 4 5 6 7 8 9)) + + (define-extended-language x0-10 x1-9 + (x 0 .... 10)) + + (render-language x0-10) + + (printf "pict-test.ss passed\n")) diff --git a/collects/redex/tests/rg-test.ss b/collects/redex/tests/rg-test.ss new file mode 100644 index 0000000000..c33928d593 --- /dev/null +++ b/collects/redex/tests/rg-test.ss @@ -0,0 +1,1081 @@ +#lang scheme + +(require "test-util.ss" + "../private/reduction-semantics.ss" + "../private/matcher.ss" + "../private/term.ss" + "../private/rg.ss" + "../private/keyword-macros.ss" + "../private/error.ss") + +(reset-count) + +;; to-table : hash-table -> assoc +;; extracts the hash-table's mapping in a deterministic way +(define (to-table ht) + (sort (hash-map ht cons) + (λ (x y) (string<=? (format "~a" (car x)) (format "~a" (car y)))))) + +(let () + (define-language lc + (e x (e e) (λ (x) e)) + (x variable)) + (let ([bc (find-base-cases lc)]) + (test (to-table (base-cases-non-cross bc)) + '((e . (1 2 2)) (x . (0)))) + (test (to-table (base-cases-cross bc)) + '((e-e . (0 2 2 1)) (x-e . (1 2 2 2 2)) (x-x . (0)))))) + +(let () + (define-language lang + (e (e e))) + (let ([bc (find-base-cases lang)]) + (test (to-table (base-cases-non-cross bc)) '((e . (inf)))) + (test (to-table (base-cases-cross bc)) '((e-e . (0 inf inf)))))) + +(let () + (define-language lang + (a 1 2 3) + (b a (a_1 b_!_1))) + (let ([bc (find-base-cases lang)]) + (test (to-table (base-cases-non-cross bc)) + '((a . (0 0 0)) (b . (1 2)))) + (test (to-table (base-cases-cross bc)) + '((a-a . (0)) (a-b . (1)) (b-b . (0)))))) + +(let () + (define-language lc + (e (e e ...) + (+ e e) + x + v) + (v (λ (x) e) + number) + (x variable)) + (let ([bc (find-base-cases lc)]) + (test (to-table (base-cases-non-cross bc)) + '((e . (2 2 1 1)) (v . (2 0)) (x . (0)))) + (test (to-table (base-cases-cross bc)) + '((e-e . (0 2 2 2 2 2)) (e-v . (1)) (v-e . (2 2 2 2 1)) (v-v . (0 2)) + (x-e . (2 2 2 2 1 3)) (x-v . (2 2)) (x-x . (0)))))) + +(let () + (define-language L + (x (variable-prefix x) + (variable-except y)) + (y y)) + (test (hash-ref (base-cases-non-cross (find-base-cases L)) 'x) + '(0 0))) + +(let () + (define-language lang + (e number x y) + (x variable) + (y y)) + (test (min-prods (car (compiled-lang-lang lang)) + (base-cases-non-cross (find-base-cases lang))) + (list (car (nt-rhs (car (compiled-lang-lang lang))))))) + +(define (make-random . nums) + (let ([nums (box nums)]) + (λ ([m +inf.0]) + (cond [(null? (unbox nums)) (error 'make-random "out of numbers")] + [(>= (car (unbox nums)) m) (error 'make-random "number too large")] + [else (begin0 (car (unbox nums)) (set-box! nums (cdr (unbox nums))))])))) + +(test (pick-from-list '(a b c) (make-random 1)) 'b) + +(test (pick-number 24 (make-random 1/5)) 3) +(test (pick-number 224 (make-random 0 0 1/5)) -5) +(test (pick-number 524 (make-random 0 0 1 1/5 1/5)) 3/4) +(test (pick-number 1624 (make-random 0 0 0 .5 1 .5)) 3.0) +(test (pick-number 2624 (make-random 0 0 0 0 1 1 1/5 1/5 2 .5 0 .5)) + (make-rectangular 7/8 -3.0)) + +(test (pick-natural 224 (make-random 1/5)) 5) +(test (pick-integer 900 (make-random 0 0 1/5)) -7) +(test (pick-real 9000 (make-random 0 0 0 .5 1 1/8)) 11.0) + +(let* ([lits '("bcd" "cbd")]) + (test (pick-char 0 (make-random 0 0)) #\A) + (test (pick-char 0 (make-random 2 1)) #\c) + (test (pick-char 1000 (make-random 1 25 0)) #\Z) + (test (pick-char 1000 (make-random 0 65)) #\a) + (test (pick-char 1500 (make-random 0 1 65)) #\a) + (test (pick-char 1500 (make-random 0 0 3)) #\⇒) + (test (pick-char 2500 (make-random 0 0 1 3)) #\⇒) + (test (pick-char 2500 (make-random 0 0 0 1)) (integer->char #x4E01)) + (test (pick-char 1000 (make-random 0 (- (char->integer #\_) #x20))) #\`) + (test (random-string lits 3 0 (make-random 0 1)) "cbd") + (test (random-string lits 3 0 (make-random 1 0 1 1 1 2 1)) "abc") + (test (pick-string lits 0 (make-random .5 1 0 1 1 1 2 1)) "abc") + (test (pick-var lits 0 (make-random .01 1 0 1 1 1 2 1)) 'abc)) + +(let () + (define-language L + (a 5 (x a)) + (b 4)) + (test (pick-nt 'a #f L 1 'dontcare) + (nt-rhs (car (compiled-lang-lang L)))) + (test (pick-nt 'a #f L preferred-production-threshold 'dontcare (make-random 1)) + (nt-rhs (car (compiled-lang-lang L)))) + (let ([pref (car (nt-rhs (car (compiled-lang-lang L))))]) + (test (pick-nt 'a #f L preferred-production-threshold + (make-pref-prods 'dont-care + (make-immutable-hash `((a ,pref)))) + (make-random 0)) + (list pref))) + (test (pick-nt 'b #f L preferred-production-threshold #f) + (nt-rhs (cadr (compiled-lang-lang L))))) + +(define-syntax raised-exn-msg + (syntax-rules () + [(_ expr) (raised-exn-msg exn:fail? expr)] + [(_ exn? expr) + (with-handlers ([exn? exn-message]) + (begin + expr + (let () + (define-struct exn-not-raised ()) + (make-exn-not-raised))))])) + +(define (patterns . selectors) + (map (λ (selector) + (λ (name cross? lang size pref-prods) + (list (selector (nt-rhs (nt-by-name lang name cross?)))))) + selectors)) + +(define (iterator name items) + (let ([bi (box items)]) + (λ () + (if (null? (unbox bi)) + (error name "empty") + (begin0 (car (unbox bi)) (set-box! bi (cdr (unbox bi)))))))) + +(let ([iter (iterator 'test-iterator '(a b))]) + (test (iter) 'a) + (test (iter) 'b) + (test (raised-exn-msg (iter)) #rx"empty")) + +(define (decisions #:var [var pick-var] + #:nt [nt pick-nt] + #:str [str pick-string] + #:num [num pick-number] + #:nat [nat pick-natural] + #:int [int pick-integer] + #:real [real pick-real] + #:any [any pick-any] + #:seq [seq pick-sequence-length] + #:pref [pref pick-preferred-productions]) + (define-syntax decision + (syntax-rules () + [(_ d) (if (procedure? d) (λ () d) (iterator (quote d) d))])) + (unit (import) (export decisions^) + (define next-variable-decision (decision var)) + (define next-non-terminal-decision (decision nt)) + (define next-number-decision (decision num)) + (define next-natural-decision (decision nat)) + (define next-integer-decision (decision int)) + (define next-real-decision (decision real)) + (define next-string-decision (decision str)) + (define next-any-decision (decision any)) + (define next-sequence-decision (decision seq)) + (define next-pref-prods-decision (decision pref)))) + +(define-syntax generate-term/decisions + (syntax-rules () + [(_ lang pat size attempt decisions) + (parameterize ([generation-decisions decisions]) + (generate-term lang pat size #:attempt attempt))])) + +(let () + (define-language lc + (e (e e) x (λ (x) e)) + (x (variable-except λ))) + + ;; Generate (λ (x) x) + (test + (generate-term/decisions + lc e 1 0 + (decisions #:var (list (λ _ 'x) (λ _'x)) + #:nt (patterns third first first first))) + '(λ (x) x)) + + ;; Generate pattern that's not a non-terminal + (test + (generate-term/decisions + lc (x x x_1 x_1) 1 0 + (decisions #:var (list (λ _ 'x) (λ _ 'y)))) + '(x x y y)) + + ; After choosing (e e), size decremented forces each e to x. + (test + (generate-term/decisions + lc e 1 0 + (decisions #:nt (patterns first) + #:var (list (λ _ 'x) (λ _ 'y)))) + '(x y))) + +;; variable-except pattern +(let () + (define-language var + (e (variable-except x y))) + (test + (generate-term/decisions + var e 2 0 + (decisions #:var (list (λ _ 'x) (λ _ 'y) (λ _ 'x) (λ _ 'z)))) + 'z)) + +(let () + (define-language L + (n natural) + (i integer) + (r real)) + (test (let ([n (generate-term L n 0 #:attempt 10000)]) + (and (integer? n) + (exact? n) + (not (negative? n)))) + #t) + (test (generate-term/decisions L n 0 1 (decisions #:nat (λ (_) 42))) 42) + (test (let ([i (generate-term L i 0 #:attempt 10000)]) + (and (integer? i) (exact? i))) + #t) + (test (generate-term/decisions L i 0 1 (decisions #:int (λ (_) -42))) -42) + (test (real? (generate-term L r 0 #:attempt 10000)) #t) + (test (generate-term/decisions L r 0 1 (decisions #:real (λ (_) 4.2))) 4.2)) + +(let () + (define-language lang + (a (number number ... "foo" ... "bar" #t ...)) + (b (number_1 ..._!_1 number_1 ..._1)) + (c (variable_1 ..._1 number_2 ..._1)) + (d (z_1 ... z_2 ..._!_1 (z_1 z_2) ...)) + (e (n_1 ..._!_1 n_2 ..._!_1 (n_1 n_2) ..._3)) + (f (n_1 ..._1 n_2 ..._2 n_2 ..._1)) + (g (z_1 ..._!_1 z_2 ... (z_1 z_2) ...)) + (n number) + (z 4)) + (test + (generate-term/decisions + lang a 2 0 + (decisions #:num (build-list 3 (λ (n) (λ (_) n))) + #:seq (list (λ (_) 2) (λ (_) 3) (λ (_) 1)))) + `(0 1 2 "foo" "foo" "foo" "bar" #t)) + (test (generate-term/decisions lang b 5 0 (decisions #:seq (list (λ (_) 0)))) + null) + (test (generate-term/decisions lang c 5 0 (decisions #:seq (list (λ (_) 0)))) + null) + (test (generate-term/decisions lang d 5 0 (decisions #:seq (list (λ (_) 2)))) + '(4 4 4 4 (4 4) (4 4))) + (test (raised-exn-msg exn:fail:redex:generation-failure? (generate-term lang e 5 #:retries 42)) + #rx"generate-term: unable to generate pattern e in 42") + (test (generate-term/decisions lang f 5 0 (decisions #:seq (list (λ (_) 0)))) null) + (test (generate-term/decisions + lang ((0 ..._!_1) ... (1 ..._!_1) ...) 5 0 + (decisions #:seq (list (λ (_) 2) (λ (_) 3) (λ (_) 4) (λ (_) 2) (λ (_) 3) (λ (_) 4) + (λ (_) 2) (λ (_) 3) (λ (_) 4) (λ (_) 1) (λ (_) 3)))) + '((0 0 0) (0 0 0 0) (1 1 1))) + (test (generate-term/decisions + lang ((0 ..._!_1) ... (1 ..._!_1) ...) 5 0 + (decisions #:seq (list (λ (_) 2) (λ (_) 3) (λ (_) 4) (λ (_) 2) (λ (_) 3) (λ (_) 5)))) + '((0 0 0) (0 0 0 0) (1 1 1) (1 1 1 1 1)))) + +(let () + (define-language lang (e (variable-prefix pf))) + (test + (generate-term/decisions + lang e 5 0 + (decisions #:var (list (λ _ 'x)))) + 'pfx)) + +(let () + (define-language lang (x variable literal)) + (test ((is-nt? lang) 'x) #t) + (test ((is-nt? lang) 'y) #f)) + +(let () + (define-language lang + (e number (e_1 e_2 e e_1 e_2))) + (test + (generate-term/decisions + lang e 5 0 + (decisions #:nt (patterns second first first first) + #:num (list (λ _ 2) (λ _ 3) (λ _ 4)))) + '(2 3 4 2 3))) + +(let () + (define-language lang + (a (number_!_1 number_!_2 number_!_1)) + (b (c_!_1 c_!_1 c_!_1)) + (c 1 2)) + (test + (generate-term/decisions + lang a 5 0 + (decisions #:num (list (λ _ 1) (λ _ 1) (λ _ 1) (λ _ 1) (λ _ 1) (λ _ 2)))) + '(1 1 2)) + (test + (generate-term/decisions + lang (number_!_1 number_!_2 number_!_1) 5 0 + (decisions #:num (list (λ _ 1) (λ _ 1) (λ _ 1) (λ _ 1) (λ _ 1) (λ _ 2)))) + '(1 1 2)) + (test + (raised-exn-msg exn:fail:redex:generation-failure? (generate-term lang b 5000)) + #rx"unable")) + +(let () + (define-language lang + (e string) + (f foo bar)) + (test + (let/ec k + (generate-term/decisions + lang e 5 0 + (decisions #:str (list (λ (l a) (k (sort l string<=?))))))) + '("bar" "foo"))) + +(let () + (define-language lang + (a 43) + (b (side-condition a_1 (odd? (term a_1)))) + (c (side-condition a_1 (even? (term a_1)))) + (e (side-condition (x_1 x_!_2 x_!_2) (not (eq? (term x_1) 'x)))) + (x variable)) + (test (generate-term lang b 5) 43) + (test (generate-term lang (side-condition a (odd? (term a))) 5) 43) + (test (raised-exn-msg exn:fail:redex:generation-failure? (generate-term lang c 5)) + #px"unable to generate pattern \\(side-condition a\\_1 #\\)") + (test (let/ec k + (generate-term lang (number_1 (side-condition 7 (k (term number_1)))) 5)) + 'number_1) + + (test ; mismatch patterns work with side-condition failure/retry + (generate-term/decisions + lang e 5 0 + (decisions #:var (list (λ _ 'x) (λ _ 'x) (λ _ 'y) (λ _ 'y) (λ _ 'x) (λ _ 'y)))) + '(y x y)) + (test ; generate compiles side-conditions in pattern + (generate-term/decisions + lang (side-condition x_1 (not (eq? (term x_1) 'x))) 5 0 + (decisions #:var (list (λ _ 'x) (λ _ 'y)))) + 'y)) + +(let () + (define-language lang + (a (name x b)) + (b 4) + (c (side-condition (name x d) (zero? (term x)))) + (d 2 1 0) + (e ((side-condition (name d_1 d) (zero? (term d_1))) d_1))) + (test (generate-term lang a 5) 4) + (test (generate-term lang c 5) 0) + (test (generate-term lang e 5) '(0 0))) + +(let () + (define-language lang + (a number (+ a a)) + (A hole (+ a A) (+ A a)) + (C hole) + (e ((in-hole (in-hole f (number_1 hole)) number_1) number_1)) + (f (in-hole C (number_1 hole))) + (g (in-hole (side-condition (hole number_1) (zero? (term number_1))) number_2)) + (h ((in-hole i number_1) number_1)) + (i (number_1 (in-hole j (number_1 hole)))) + (j (in-hole (hole number_1) (number_1 hole))) + (x variable) + (y variable)) + + (test + (generate-term/decisions + lang (in-hole A number ) 5 0 + (decisions + #:nt (patterns second second first first third first second first first) + #:num (build-list 5 (λ (x) (λ (_) x))))) + '(+ (+ 1 2) (+ 0 (+ 3 4)))) + + (test (generate-term lang (in-hole (in-hole (1 hole) hole) 5) 5) '(1 5)) + (test (generate-term lang (hole 4) 5) (term (hole 4))) + (test (generate-term/decisions + lang (variable_1 (in-hole C variable_1)) 5 0 + (decisions #:var (list (λ _ 'x) (λ _ 'y) (λ _ 'x)))) + '(x x)) + (test (generate-term/decisions + lang (variable_!_1 (in-hole C variable_!_1)) 5 0 + (decisions #:var (list (λ _ 'x) (λ _ 'x) (λ _ 'x) (λ _ 'y)))) + '(x y)) + (test (generate-term/decisions lang e 5 0 (decisions #:num (list (λ _ 1) (λ _ 2)))) + '((2 (1 1)) 1)) + (test (generate-term/decisions lang g 5 0 (decisions #:num (list (λ _ 1) (λ _ 2) (λ _ 1) (λ _ 0)))) + '(1 0)) + (test (generate-term/decisions lang h 5 0 (decisions #:num (list (λ _ 1) (λ _ 2) (λ _ 3)))) + '((2 ((3 (2 1)) 3)) 1))) + +(let () + (define-language lc + (e (e e) (+ e e) x v) + (v (λ (x) e) number) + (x variable-not-otherwise-mentioned)) + (test (generate-term/decisions lc x 5 0 (decisions #:var (list (λ _ 'λ) (λ _ '+) (λ _ 'x)))) + 'x)) + +(let () + (define-language four + (e 4) + (f 5)) + (define-language empty) + + ;; `any' pattern + (let ([four (prepare-lang four)] + [sexp (prepare-lang sexp)]) + (test (call-with-values (λ () (pick-any four sexp (make-random 0 1))) list) + (list four 'f)) + (test (call-with-values (λ () (pick-any four sexp (make-random 1))) list) + (list sexp 'sexp))) + (test (generate-term/decisions + four any 5 0 (decisions #:any (list (λ (lang sexp) (values lang 'e))))) 4) + (test (generate-term/decisions + four any 5 0 + (decisions #:any (list (λ (lang sexp) (values sexp 'sexp))) + #:nt (patterns fifth second second second) + #:seq (list (λ _ 3)) + #:str (list (λ _ "foo") (λ _ "bar") (λ _ "baz")))) + '("foo" "bar" "baz")) + (test (generate-term/decisions + empty any 5 0 (decisions #:nt (patterns first) + #:var (list (λ _ 'x)))) + 'x)) + +;; `hide-hole' pattern +(let () + (define-language lang + (e (hide-hole (in-hole ((hide-hole hole) hole) 1)))) + (test (generate-term lang e 5) (term (hole 1)))) + +(define (output-error-port thunk) + (let ([port (open-output-string)]) + (parameterize ([current-error-port port]) + (thunk)) + (get-output-string port))) + +;; `cross' pattern +(let () + (define-language lang + (e x (e e) v) + (v (λ (x) e)) + (x variable-not-otherwise-mentioned)) + (define-extended-language name-collision lang (e-e 47)) + + (test (generate-term/decisions + lang (cross e) 3 0 + (decisions #:nt (patterns fourth first first second first first first) + #:var (list (λ _ 'x) (λ _ 'y)))) + (term (λ (x) (hole y)))) + + (test (generate-term/decisions name-collision (cross e) 3 0 + (decisions #:nt (patterns first))) + (term hole)) + (test (generate-term/decisions name-collision e-e 3 0 + (decisions #:nt (patterns first))) + 47) + + (test (hash-ref (base-cases-non-cross (find-base-cases name-collision)) 'e-e) + '(0))) + +(let () + (define-language L + (a ((a ...) ...))) + (test (generate-term/decisions + L (cross a) 3 0 + (decisions #:nt (patterns second first) + #:seq (list (λ _ 0) (λ _ 0) (λ _ 0) (λ _ 0)))) + (term ((hole))))) + +;; generation failures increase size and attempt +(let () + (define-language L + (a d b) + (b d c) + (c e) + + (x variable)) + (test + (generate-term/decisions + L (side-condition a (eq? (term a) 'e)) 0 0 + ; It isn't possible for `a' to generate 'y until size is 2. + ; When size is 0, the generator has no choice but the 'x production. + ; When size is 1, the generator has a choice for `a' but not for `b'. + ; Supply enough first-production choices to cover the size 1 attempts + ; followed by the choices that produce 'y on the first size 2 attempt. + (decisions + #:nt (apply patterns + (append (build-list (* default-retries proportion-at-size) + (λ (_) first)) + (list second second first))))) + 'e) + + (test + (generate-term/decisions + L (side-condition x (number? (term x))) 0 0 + (decisions #:var (λ (lang-lits attempt) + (if (>= attempt retry-threshold) 0 'x)))) + 0) + + (let ([attempts null] + [start (sub1 retry-threshold)] + [finish (+ retry-threshold post-threshold-incr)]) + (generate-term/decisions + L (side-condition x (number? (term x))) 0 start + (decisions #:var (λ (lang-lits attempt) + (set! attempts (cons attempt attempts)) + (if (= attempt finish) 0 'x)))) + (test attempts (list finish retry-threshold start)))) + +;; output : (-> (-> void) string) +(define (output thunk) + (let ([p (open-output-string)]) + (parameterize ([current-output-port p]) + (unless (void? (thunk)) + (error 'output "expected void result"))) + (begin0 + (get-output-string p) + (close-output-port p)))) + +;; preferred productions +(let ([make-pick-nt (λ opt (λ req (apply pick-nt (append req opt))))]) + (define-language L + (e (+ e e) (* e e) 7)) + (define-language M (e 0) (e-e 1)) + + (let ([pats (λ (L) (nt-rhs (car (compiled-lang-lang L))))]) + (test + (generate-term/decisions + L e 2 preferred-production-threshold + (decisions #:pref (list (λ (L) (make-pref-prods + 'dont-care + (make-immutable-hash `((e ,(car (pats L)))))))) + #:nt (make-pick-nt (make-random 0 0 0)))) + '(+ (+ 7 7) (+ 7 7))) + (test + (generate-term/decisions + L any 2 preferred-production-threshold + (decisions #:nt (patterns first) + #:var (list (λ _ 'x)) + #:any (list (λ (lang sexp) (values sexp 'sexp))))) + 'x) + (test + (generate-term/decisions + L any 2 preferred-production-threshold + (decisions #:pref (list (λ (L) (make-pref-prods + 'dont-care + (make-immutable-hash `((e ,(car (pats L)))))))) + #:nt (make-pick-nt (make-random 0 0 0)) + #:any (list (λ (lang sexp) (values lang 'e))))) + '(+ (+ 7 7) (+ 7 7))) + (test + (generate-term/decisions + M (cross e) 2 preferred-production-threshold + (decisions #:nt (make-pick-nt (make-random) (λ (att rand) #t)))) + (term hole)) + (test + (generate-term/decisions + M e-e 2 preferred-production-threshold + (decisions #:nt (make-pick-nt (make-random) (λ (att rand) #t)))) + 1) + + (test + (let ([generated null]) + (output + (λ () + (check-reduction-relation + (reduction-relation L (--> e e)) + (λ (t) (set! generated (cons t generated))) + #:decisions (decisions #:nt (make-pick-nt (make-random) + (λ (att rand) #t)) + #:pref (list (λ (_) 'dontcare) + (λ (_) 'dontcare) + (λ (_) 'dontcare) + ; size 0 terms prior to this attempt + (λ (L) (make-pref-prods + 'dont-care + (make-immutable-hash `((e ,(car (pats L))))))) + (λ (L) (make-pref-prods + 'dont-care + (make-immutable-hash `((e ,(cadr (pats L))))))))) + #:attempts 5))) + generated) + '((* 7 7) (+ 7 7) 7 7 7)))) + +;; redex-check +(let () + (define-language lang + (d 5) + (e e 4) + (n number)) + (test (output (λ () (redex-check lang d #f))) + #rx"redex-check: .*:.*\ncounterexample found after 1 attempt:\n5\n") + (test (output (λ () (redex-check lang d #t))) + #rx"redex-check: .*:.*\nno counterexamples in 1000 attempts\n") + (let-syntax ([noloc (λ (stx) + (syntax-case stx () + [(_ e) (datum->syntax stx (syntax->datum #'e) #f)]))]) + (test (output (λ () (noloc (redex-check lang d #t)))) + "redex-check: no counterexamples in 1000 attempts\n")) + (test (output (λ () (redex-check lang (d e) (and (eq? (term d) 5) (eq? (term e) 4)) #:attempts 2))) + #rx"no counterexamples") + (test (output (λ () (redex-check lang (d ...) (zero? (modulo (foldl + 0 (term (d ...))) 5)) #:attempts 2))) + #rx"no counterexamples") + (test (output (λ () (redex-check lang (d e) #f))) + #rx"counterexample found after 1 attempt:\n\\(5 4\\)\n") + (let* ([p (open-output-string)] + [m (parameterize ([current-output-port p]) + (with-handlers ([exn:fail? exn-message]) + (redex-check lang d (error 'pred-raised)) + 'no-exn-raised))]) + (test m "error: pred-raised") + (test (get-output-string p) #rx"checking 5 raises.*\n$") + (close-output-port p)) + + (test (output + (λ () + (redex-check lang n (eq? 42 (term n)) + #:attempts 1 + #:source (reduction-relation + lang + (--> 42 dontcare) + (--> 0 dontcare z))))) + #rx"counterexample found after 1 attempt with z:\n0\n") + + (let ([generated null]) + (test (output + (λ () + (redex-check lang n (set! generated (cons (term n) generated)) + #:attempts 5 + #:source (reduction-relation + lang + (--> 1 dontcare) + (--> 2 dontcare))))) + #rx"no counterexamples.*with each clause") + (test generated '(2 2 1 1))) + + (let () + (define-metafunction lang + [(mf 42) dontcare] + [(mf 0) dontcare]) + (test (output + (λ () + (redex-check lang (n) (eq? 42 (term n)) + #:attempts 1 + #:source mf))) + #px"counterexample found after 1 attempt with clause at .*:\\d+:\\d+:\n\\(0\\)\n")) + + (let () + (define-metafunction lang + [(f) + dontcare + (side-condition #f)]) + (test (raised-exn-msg + exn:fail:redex:generation-failure? + (redex-check lang any #t + #:attempts 1 + #:source f)) + #px"unable to generate LHS of clause at .*:\\d+:\\d+")) + + (let () + (define-metafunction lang + [(mf d e) dontcare]) + (test (output + (λ () + (redex-check lang (number_1 number_2) + (and (= (term number_1) 5) + (= (term number_2) 4)) + #:attempts 1 + #:source mf))) + #rx"no counterexamples")) + + (test (raised-exn-msg + exn:fail:redex? + (redex-check lang n #t #:source (reduction-relation lang (--> x 1)))) + #rx"x does not match n") + (test (raised-exn-msg + exn:fail:redex:generation-failure? + (redex-check lang (side-condition any #f) #t #:retries 42 #:attempts 1)) + #rx"^redex-check: unable .* in 42") + (let ([unable-loc #px"^redex-check: unable to generate LHS of clause at .*:\\d+:\\d+ in 42"]) + (let-syntax ([test-gen-fail + (syntax-rules () + [(_ clauses ... expected) + (test + (raised-exn-msg + exn:fail:redex:generation-failure? + (redex-check lang any #t + #:source (reduction-relation + lang + clauses ...) + #:retries 42 + #:attempts 1)) + expected)])]) + (test-gen-fail + (--> (side-condition any #f) any) + unable-loc) + + (test-gen-fail + (==> (side-condition any #f) any) + with [(--> a b) (==> a b)] + unable-loc) + + (test-gen-fail + (--> (side-condition any #f) any impossible) + #rx"^redex-check: unable to generate LHS of impossible in 42")))) + +;; check-metafunction-contract +(let () + (define-language empty) + (define-metafunction empty + f : (side-condition number_1 (odd? (term number_1))) -> number + [(f 1) 1] + [(f 3) 'NaN]) + + (define-metafunction empty + g : number ... -> (any ...) + [(g number_1 ... 1 number_2 ...) (number_1 ...)]) + + (define-metafunction empty + h : number -> number + [(h any) any]) + + (define-metafunction empty + [(i any ...) (any ...)]) + + (define-metafunction empty + j : (side-condition any #f) -> any + [(j any ...) (any ...)]) + + ;; Dom(f) < Ctc(f) + (test (output + (λ () + (parameterize ([generation-decisions + (decisions #:num (list (λ _ 2) (λ _ 5)))]) + (check-metafunction-contract f)))) + #rx"check-metafunction-contract:.*counterexample found after 1 attempt:\n\\(5\\)\n") + ;; Rng(f) > Codom(f) + (test (output + (λ () + (parameterize ([generation-decisions + (decisions #:num (list (λ _ 3)))]) + (check-metafunction-contract f)))) + #rx"counterexample found after 1 attempt:\n\\(3\\)\n") + ;; LHS matches multiple ways + (test (output + (λ () + (parameterize ([generation-decisions + (decisions #:num (list (λ _ 1) (λ _ 1)) + #:seq (list (λ _ 2)))]) + (check-metafunction-contract g)))) + #rx"counterexample found after 1 attempt:\n\\(1 1\\)\n") + ;; OK -- generated from Dom(h) + (test (output (λ () (check-metafunction-contract h))) #rx"no counterexamples") + ;; OK -- generated from pattern (any ...) + (test (output (λ () (check-metafunction-contract i #:attempts 5))) #rx"no counterexamples") + + ;; Unable to generate domain + (test (raised-exn-msg + exn:fail:redex:generation-failure? + (check-metafunction-contract j #:attempts 1 #:retries 42)) + #rx"^check-metafunction-contract: unable .* in 42")) + +;; check-reduction-relation +(let () + (define-language L + (e (+ e ...) number) + (E (+ number ... E* e ...)) + (E* hole E*) + (n 4)) + + (let ([generated null] + [R (reduction-relation + L + (==> (+ number ...) whatever) + (--> (side-condition number (even? (term number))) whatever) + with + [(--> (in-hole E a) whatever) + (==> a b)])]) + (test (begin + (output + (λ () + (check-reduction-relation + R (λ (term) (set! generated (cons term generated))) + #:decisions (decisions #:seq (list (λ _ 0) (λ _ 0) (λ _ 0)) + #:num (list (λ _ 1) (λ _ 1) (λ _ 0))) + #:attempts 1))) + generated) + (reverse '((+ (+)) 0)))) + + (let ([S (reduction-relation L (--> 1 2 name) (--> 3 4))]) + (test (output (λ () (check-reduction-relation S (λ (x) #t) #:attempts 1))) + #rx"check-reduction-relation:.*no counterexamples") + (test (output + (λ () (check-reduction-relation S (λ (x) #f)))) + #rx"counterexample found after 1 attempt with name:\n1\n") + (test (output + (λ () (check-reduction-relation S (curry eq? 1)))) + #px"counterexample found after 1 attempt with clause at .*:\\d+:\\d+:\n3\n")) + + (test (output + (λ () (check-reduction-relation (reduction-relation L (--> 1 2) (--> 3 4 name)) (curry eq? 1)))) + #px"counterexample found after 1 attempt with name:\n3\n") + + (let ([T (reduction-relation + L + (==> number number + (where any_num number) + (side-condition (eq? (term any_num) 4)) + (where any_numb any_num) + (side-condition (eq? (term any_numb) 4))) + with + [(--> (9 a) b) + (==> a b)])]) + (test (output + (λ () + (check-reduction-relation + T (curry equal? '(9 4)) + #:attempts 1 + #:decisions (decisions #:num (build-list 5 (λ (x) (λ _ x))))))) + #rx"no counterexamples")) + + (let ([U (reduction-relation L (--> (side-condition any #f) any))]) + (test (raised-exn-msg + exn:fail:redex:generation-failure? + (check-reduction-relation U (λ (_) #t))) + #rx"^check-reduction-relation: unable"))) + +; check-metafunction +(let () + (define-language empty) + + (define-metafunction empty + [(m 1) whatever] + [(m 2) whatever]) + (define-metafunction empty + [(n (side-condition any #f)) any]) + + (let ([generated null]) + (test (begin + (output + (λ () + (check-metafunction m (λ (t) (set! generated (cons t generated))) #:attempts 1))) + generated) + (reverse '((1) (2))))) + + (test + (let/ec k + (define-language L (n 2)) + (define-metafunction L + [(f n) + n + (where number_2 ,(add1 (term n))) + (where number_3 ,(add1 (term number_2))) + (side-condition (k (term number_3)))] + [(f any) 0]) + (check-metafunction f (λ (_) #t))) + 4) + + (test (output (λ () (check-metafunction m (λ (_) #t)))) #rx"no counterexamples") + (test (output (λ () (check-metafunction m (curry eq? 1)))) + #px"check-metafunction:.*counterexample found after 1 attempt with clause at .*:\\d+:\\d+") + (test (raised-exn-msg + exn:fail:contract? + (check-metafunction m (λ (_) #t) #:attempts 'NaN)) + #rx"check-metafunction: expected") + (test (raised-exn-msg + exn:fail:redex:generation-failure? + (check-metafunction n (λ (_) #t) #:retries 42)) + #rx"check-metafunction: unable .* in 42")) + +;; custom generators +(let () + (define-language L + (x variable)) + + (test + (generate-term + L x_1 0 + #:custom (λ (pat sz i-h acc env att rec def) + (match pat + ['x (values 'x env)] + [_ (def acc)]))) + 'x) + (test + (let/ec k + (equal? + (generate-term + L (x x) 0 + #:custom (let ([once? #f]) + (λ (pat sz i-h acc env att rec def) + (match pat + ['x (if once? + (k #f) + (begin + (set! once? #t) + (values 'x env)))] + [_ (def acc)])))) + '(x x))) + #t) + + (test + (hash-ref + (let/ec k + (generate-term + L (x (x)) 0 + #:custom (λ (pat sz i-h acc env att rec def) + (match pat + [(struct binder ('x)) + (values 'y (hash-set env pat 'y))] + [(list (struct binder ('x))) (k env)] + [_ (def acc)])))) + (make-binder 'x)) + 'y) + + (test + (generate-term + L (in-hole hole 7) 0 + #:custom (λ (pat sz i-h acc env att rec def) + (match pat + [`(in-hole hole 7) + (rec 'hole #:contractum 7)] + [_ (def acc)]))) + 7) + + (test + (let/ec k + (generate-term + L any 10 + #:attempt 42 + #:custom (λ (pat sz i-h acc env att rec def) (k (list sz att))))) + '(10 42)) + + (test + (let/ec k + (generate-term + L x 10 + #:custom (λ (pat sz i-h acc env att rec def) + (match pat + ['x (rec 7 #:size 0)] + [7 (k sz)] + [_ (def att)])))) + 0) + + (test + (generate-term + L (q 7) 0 + #:custom (λ (pat sz i-h acc env att rec def) + (match pat + ['q (rec '(7 7) #:acc 8)] + [7 (values (or acc 7) env)] + [_ (def att)]))) + '((8 8) 7))) + +;; parse/unparse-pattern +(let-syntax ([test-match (syntax-rules () [(_ p x) (test (match x [p #t] [_ #f]) #t)])]) + (define-language lang (x variable)) + (let ([pattern '((x_1 number) ... 3)]) + (test-match (list + (struct ellipsis + ('... + (list (struct binder ('x_1)) (struct binder ('number))) + _ + (list (struct binder ('number)) (struct binder ('x_1))))) + 3) + (parse-pattern pattern lang 'top-level)) + (test (unparse-pattern (parse-pattern pattern lang 'top-level)) pattern)) + (let ([pattern '((x_1 ..._1 x_2) ..._!_1)]) + (test-match (struct ellipsis + ((struct mismatch (i_1 '..._!_1)) + (list + (struct ellipsis + ('..._1 + (struct binder ('x_1)) + (struct class ('..._1)) + (list (struct binder ('x_1))))) + (struct binder ('x_2))) + _ + (list (struct binder ('x_2)) '..._1 (struct class ('..._1)) (struct binder ('x_1))))) + (car (parse-pattern pattern lang 'grammar))) + (test (unparse-pattern (parse-pattern pattern lang 'grammar)) pattern)) + (let ([pattern '((name x_1 x_!_2) ...)]) + (test-match (struct ellipsis + ('... `(name x_1 ,(struct mismatch (i_2 'x_!_2))) _ + (list (struct binder ('x_1)) (struct mismatch (i_2 'x_!_2))))) + (car (parse-pattern pattern lang 'grammar))) + (test (unparse-pattern (parse-pattern pattern lang 'grammar)) pattern)) + (let ([pattern '((x ...) ..._1)]) + (test-match (struct ellipsis + ('..._1 + (list + (struct ellipsis + ('... + (struct binder ('x)) + (struct class (c_1)) + (list (struct binder ('x)))))) + _ + (list (struct class (c_1)) (struct binder ('x))))) + (car (parse-pattern pattern lang 'top-level))) + (test (unparse-pattern (parse-pattern pattern lang 'top-level)) pattern)) + (let ([pattern '((variable_1 ..._!_1) ...)]) + (test-match (struct ellipsis + ('... + (list + (struct ellipsis + ((struct mismatch (i_1 '..._!_1)) + (struct binder ('variable_1)) + (struct class (c_1)) + (list (struct binder ('variable_1)))))) + _ + (list (struct class (c_1)) (struct mismatch (i_1 '..._!_1)) (struct binder ('variable_1))))) + (car (parse-pattern pattern lang 'grammar))) + (test (unparse-pattern (parse-pattern pattern lang 'grammar)) pattern)) + (test (parse-pattern '(cross x) lang 'grammar) '(cross x-x)) + (test (parse-pattern '(cross x) lang 'cross) '(cross x)) + (test (parse-pattern 'x lang 'grammar) 'x) + (test (parse-pattern 'variable lang 'grammar) 'variable)) + +(let () + (define-language lang (x variable)) + (define-syntax test-class-reassignments + (syntax-rules () + [(_ pattern expected) + (test (to-table (class-reassignments (parse-pattern pattern lang 'top-level))) + expected)])) + + (test-class-reassignments + '(x_1 ..._1 x_2 ..._2 x_2 ..._1) + '((..._2 . ..._1))) + (test-class-reassignments + '((x_1 ..._1 x_1 ..._2) (x_2 ..._1 x_2 ..._2) x_3 ..._2) + '((..._1 . ..._2) (..._2 . ..._2))) + (test-class-reassignments + '(x_1 ..._1 x ..._2 x_1 ..._2) + '((..._1 . ..._2))) + (test-class-reassignments + '(x_1 ..._1 x_2 ..._2 (x_1 x_2) ..._3) + '((..._1 . ..._3) (..._2 . ..._3))) + (test-class-reassignments + '((x_1 ..._1) ..._2 x_2 ..._3 (x_1 ..._4 x_2) ..._5) + '((..._1 . ..._4) (..._2 . ..._5) (..._3 . ..._5))) + (test-class-reassignments + '((x_1 ..._1) ..._2 (x_1 ..._3) ..._4 (x_1 ..._5) ..._6) + '((..._1 . ..._5) (..._2 . ..._6) (..._3 . ..._5) (..._4 . ..._6))) + (test-class-reassignments + '(x_1 ..._1 x_1 ..._2 x_2 ..._1 x_2 ..._4 x_2 ..._3) + '((..._1 . ..._3) (..._2 . ..._3) (..._4 . ..._3))) + (test + (hash-map + (class-reassignments (parse-pattern '(x_1 ... x_1 ..._!_1 x_1 ..._1) lang 'top-level)) + (λ (_ cls) cls)) + '(..._1 ..._1)) + (test-class-reassignments + '((3 ..._1) ..._2 (4 ..._1) ..._3) + '((..._2 . ..._3))) + (test-class-reassignments + '(x ..._1 x ..._2 variable ..._2 variable ..._3 variable_1 ..._3 variable_1 ..._4) + '((..._1 . ..._4) (..._2 . ..._4) (..._3 . ..._4)))) + +(print-tests-passed 'rg-test.ss) diff --git a/collects/redex/tests/run-tests.ss b/collects/redex/tests/run-tests.ss new file mode 100644 index 0000000000..46fe598acd --- /dev/null +++ b/collects/redex/tests/run-tests.ss @@ -0,0 +1,41 @@ +;; require this file to run all of the test suites for redex. + +#lang scheme/base +(require scheme/runtime-path + "config.ss" + "test-util.ss") + +(set-show-bitmaps? #f) + +(define test-files + '("lw-test.ss" + "matcher-test.ss" + "tl-test.ss" + "term-test.ss" + "rg-test.ss" + "keyword-macros-test.ss" + "core-layout-test.ss" + "bitmap-test.ss" + "pict-test.ss" + "hole-test.ss")) + +(define-runtime-path here ".") + +(define (flush) + ;; these flushes are here for running under cygwin, + ;; which somehow makes mzscheme think it isn't using + ;; an interative port + (flush-output (current-error-port)) + (flush-output (current-output-port))) + +(for-each + (λ (test-file) + (flush) + (printf "requiring ~a\n" test-file) + (flush) + (dynamic-require (build-path here test-file) #f) + (flush)) + test-files) + +(printf "\nWARNING: didn't run color-test.ss or subst-test.ss\n") +(flush) diff --git a/collects/redex/tests/term-test.ss b/collects/redex/tests/term-test.ss new file mode 100644 index 0000000000..ba09d15627 --- /dev/null +++ b/collects/redex/tests/term-test.ss @@ -0,0 +1,177 @@ +(module term-test scheme + (require "../private/term.ss" + "../private/matcher.ss" + "test-util.ss") + + (reset-count) + (test (term 1) 1) + (test (term (1 2)) (list 1 2)) + (test (term (1 ,(+ 1 1))) (list 1 2)) + (test (term-let ([x 1]) (term (x x))) (list 1 1)) + (test (term-let ([(x ...) (list 1 2 3)]) (term ((y x) ...))) '((y 1) (y 2) (y 3))) + + (test (term (in-hole (1 hole) 2)) (term (1 2))) + (test (term (in-hole (1 hole (hole x)) 2)) (term (1 2 (hole x)))) + + (test (equal? (term hole) (term hole)) #t) + (test (hole? (term hole)) #t) + (test (hole? (term (hole #f))) #f) + (test (hole? (term (hole the-name))) #f) + + (test (term-let-fn ((f (lambda (q) q))) + (term (f 1 2 3))) + (term (1 2 3))) + + (test (term-let-fn ((f (lambda (q) `(y ,(car q))))) + (term (f (zzzz)))) + (term (y (zzzz)))) + + (test (term-let-fn ((f (λ (x) (add1 (car x))))) + (term (f 2))) + (term 3)) + + (test (term-let ([((x ...) ...) (list (list 1 1) (list 2 2) (list 3 3))]) + (term-let-fn ((f (λ (x) (car x)))) + (term ((qq (f x) ...) ...)))) + (term ((qq 1 1) (qq 2 2) (qq 3 3)))) + + (test (term-let-fn ((f (lambda (x) (car x)))) + (term (f hole))) + (term hole)) + + (test (term-let-fn ((f (lambda (q) `(y ,(car q))))) + (term-let-fn ((g (lambda (x) `(ff ,(car x))))) + (term (g (f (zzzz)))))) + (term (ff (y (zzzz))))) + + (test (term-let-fn ((f (lambda (q) `(y ,(car q))))) + (term-let-fn ((g (lambda (x) `(ff ,(car x))))) + (term (f (g (f (zzzz))))))) + (term (y (ff (y (zzzz)))))) + + (test (term-let ([x 1]) + (term (x . y))) + (term (1 . y))) + + (test (term-let ([(x ...) (list 3 2 1)]) + (term (x ... . y))) + (term (3 2 1 . y))) + + (test (term-let ([(x . y) (cons 1 2)]) + (term (x y))) + (term (1 2))) + + ;; test that the implicit `plug' inserted by `in-hole' + ;; deals with ellipses properly + (test (term-let ([(E ...) '(1 2 3)]) + (term ((in-hole E x) ...))) + (term (1 2 3))) + + (test (term-let-fn ((metafun car)) + (term-let ((x 'whatever) + ((y ...) '(4 5 6))) + (term (((metafun x) y) ...)))) + '((whatever 4) (whatever 5) (whatever 6))) + + (test (term-let-fn ((metafun (λ (x) (car x)))) + (term-let (((y ...) '(4 5 6))) + (term ((y (metafun 1)) ...)))) + '((4 1) (5 1) (6 1))) + + (test (term-let-fn ((f (compose add1 car))) + (term-let (((x ...) '(1 2 3)) + ((y ...) '(a b c))) + (term (((f x) y) ...)))) + '((2 a) (3 b) (4 c))) + + (test (term-let-fn ((f (curry foldl + 0))) + (term-let (((x ...) '(1 2 3))) + (term (f x ...)))) + 6) + + (test (term-let-fn ((f (compose add1 car))) + (term-let (((x ...) '(1 2 3)) + (((y ...) ...) '((a b c) (d e f) (g h i)))) + (term ((((f x) y) ...) ...)))) + '(((2 a) (3 b) (4 c)) ((2 d) (3 e) (4 f)) ((2 g) (3 h) (4 i)))) + + (test (term-let-fn ((f (curry foldl + 0))) + (term-let ((((x ...) ...) '((1 2) (3 4 5) (6)))) + (term ((f x ...) ...)))) + '(3 12 6)) + + (define-namespace-anchor here) + (define ns (namespace-anchor->namespace here)) + + (let ([src 'term-template]) + (test + (parameterize ([current-namespace ns]) + (runtime-error-source + '(term-let ([(x ...) '(a b c)] + [((y ...) ...) '((1 2) (4 5 6) (7 8 9))]) + (term (((x y) ...) ...))) + src)) + src)) + + (let ([src 'term-template-metafunc]) + (test + (parameterize ([current-namespace ns]) + (runtime-error-source + '(term-let-fn ((f car)) + (term-let ([(x ...) '(a b c)] + [((y ...) ...) '((1 2) (4 5 6) (7 8 9))]) + (term ((((f x) y) ...) ...)))) + src)) + src)) + + (let ([src 'ellipsis-args]) + (test + (parameterize ([current-namespace ns]) + (runtime-error-source + '(term-let-fn ((f car)) + (term-let ([(x ...) '(a b)] + [(y ...) '(c d e)]) + (term (f ((x y) ...))))) + src)) + src)) + + (let ([src 'ellipsis-args/map]) + (test + (parameterize ([current-namespace ns]) + (runtime-error-source + '(term-let-fn ((f car)) + (term-let ([(x ...) '(a b)] + [(y ...) '(c d e)]) + (term ((f (x y)) ...)))) + src)) + src)) + + (let ([src 'ellipsis-args/in-hole]) + (test + (parameterize ([current-namespace ns]) + (runtime-error-source + '(term-let ([(x ...) '(a b)] + [(y ...) '(c d e)]) + (term ((in-hole hole (x y)) ...))) + src)) + src)) + + (let ([src 'term-let-rhs]) + (test + (parameterize ([current-namespace ns]) + (runtime-error-source + '(term-let ([(x ...) 'a]) + 3) + src)) + src)) + + (let ([src 'term-template]) + (test + (parameterize ([current-namespace ns]) + (syntax-error-sources + '(term-let ([(x ...) '(a b c)]) + (term x)) + src)) + (list src))) + + (print-tests-passed 'term-test.ss)) diff --git a/collects/redex/tests/test-util.ss b/collects/redex/tests/test-util.ss new file mode 100644 index 0000000000..8c88e0ecb6 --- /dev/null +++ b/collects/redex/tests/test-util.ss @@ -0,0 +1,132 @@ +#lang scheme + +(require "../private/matcher.ss" + errortrace/errortrace-lib + errortrace/errortrace-key) +(provide test test-syn-err tests reset-count + syn-err-test-namespace + print-tests-passed + equal/bindings? + runtime-error-source syntax-error-sources) + +(define syn-err-test-namespace (make-base-namespace)) +(parameterize ([current-namespace syn-err-test-namespace]) + (eval '(require redex/reduction-semantics))) + +(define-syntax (test stx) + (syntax-case stx () + [(_ expected got) + (with-syntax ([line (syntax-line (syntax got))] + [fn (if (path? (syntax-source (syntax got))) + (path->string (syntax-source (syntax got))) + "")]) + (syntax/loc stx (test/proc (λ () expected) got line fn)))])) + +(define-syntax (test-syn-err stx) + (syntax-case stx () + [(_ exp regexp) + (syntax/loc stx + (test + (parameterize ([current-namespace syn-err-test-namespace]) + (with-handlers ((exn:fail:syntax? exn-message)) + (expand 'exp) + 'no-error-raised)) + regexp))])) + +(define tests 0) +(define failures 0) +(define (reset-count) + (set! tests 0) + (set! failures 0)) + +(define (print-tests-passed filename) + (cond + [(= 0 failures) + (printf "~a: all ~a tests passed.\n" filename tests)] + [else + (printf "~a: ~a test~a failed.\n" filename failures (if (= 1 failures) "" "s"))])) + +(define (test/proc run expected line filename) + ;(printf "testing line ~s:~s\n" filename line) + (let ([got (with-handlers ((exn:fail? values)) (run))]) + (set! tests (+ tests 1)) + (unless (and (not (exn? got)) + (matches? got expected)) + (set! failures (+ 1 failures)) + (fprintf (current-error-port) + "test/proc: file ~a line ~a:\n got ~s\nexpected ~s\n\n" + filename + line + got + expected)))) + +(define (matches? got expected) + (cond + [(regexp? expected) + (and (string? got) (regexp-match expected got) #t)] + [else + (equal/bindings? got expected)])) + +;; equal/bindings? : any any -> boolean +;; compares two sexps (with embedded bindings) for equality. +;; uses an order-insensitive comparison for the bindings +(define (equal/bindings? fst snd) + (let loop ([fst fst] + [snd snd]) + (cond + [(pair? fst) + (and (pair? snd) + (loop (car fst) (car snd)) + (loop (cdr fst) (cdr snd)))] + [(mtch? fst) + (and (mtch? snd) + (loop (mtch-bindings fst) + (mtch-bindings snd)) + (let ([g1 (gensym 'run-match-test-sym)]) + (equal/bindings? (mtch-context fst) + (mtch-context snd))) + (equal/bindings? (mtch-hole fst) + (mtch-hole snd)))] + [(bindings? fst) + (and (bindings? snd) + (let ([fst-table (bindings-table fst)] + [snd-table (bindings-table snd)]) + (and (= (length fst-table) + (length snd-table)) + (andmap + loop + (sort fst-table rib-lt) + (sort snd-table rib-lt)))))] + [(and (bind? fst) + (bind? snd) + (context? (bind-exp fst)) + (context? (bind-exp snd))) + (and (equal? (bind-name fst) (bind-name snd)) + (let ([g (gensym 'run-match-test-sym2)]) + (equal/bindings? (bind-exp fst) + (bind-exp snd))))] + [(and (hole? fst) + (hole? snd)) + #t] + [else (equal? fst snd)]))) + +;; rib-lt : rib rib -> boolean +(define (rib-lt r1 r2) (string<=? (format "~s" (bind-name r1)) + (format "~s" (bind-name r2)))) + +(define (runtime-error-source sexp src) + (let/ec return + (cadar + (continuation-mark-set->list + (exn-continuation-marks + (with-handlers ((exn:fail? values)) + (parameterize ([current-compile (make-errortrace-compile-handler)]) + (eval (read-syntax src (open-input-string (format "~s" sexp))))) + (return 'no-source))) + errortrace-key)))) + +(define (syntax-error-sources sexp src) + (let ([p (read-syntax src (open-input-string (format "~s" sexp)))]) + (with-handlers ((exn:srclocs? (λ (x) (map srcloc-source ((exn:srclocs-accessor x) x))))) + (expand p) + null))) diff --git a/collects/redex/tests/tl-test.ss b/collects/redex/tests/tl-test.ss new file mode 100644 index 0000000000..c45255a96b --- /dev/null +++ b/collects/redex/tests/tl-test.ss @@ -0,0 +1,1850 @@ +(module tl-test scheme + (require "../reduction-semantics.ss" + "test-util.ss" + (only-in "../private/matcher.ss" make-bindings make-bind) + scheme/match + "../private/struct.ss") + + (reset-count) + + +; +; +; ;; +; ; +; ; ;;; ;; ;; ;; ;;;; ;; ;;; ;; ;; ;;; +; ; ; ; ;; ; ; ;; ; ; ; ; ; ;; ; ; +; ; ;;;; ; ; ; ; ; ; ;;;; ; ; ;;;;; +; ; ; ; ; ; ; ; ; ; ; ; ; ; ; +; ; ; ; ; ; ; ; ; ;; ; ; ; ; ; +; ;;;;; ;;;;;;;; ;;; ;;;; ;; ;; ;;;;; ;;;; ;;;; +; ; ; +; ;;; ;;; +; +; + + + (define-language empty-language) + + (define-language grammar + (M (M M) + number) + (E hole + (E M) + (number E)) + (X (number any) + (any number)) + (Q (Q ...) + variable) + (UN (add1 UN) + zero)) + + (test (pair? (redex-match grammar M '(1 1))) #t) + (test (pair? (redex-match grammar M '(1 1 1))) #f) + (test (pair? (redex-match grammar + (side-condition (M_1 M_2) (equal? (term M_1) (term M_2))) + '(1 1))) + #t) + (test (pair? (redex-match grammar + (side-condition (M_1 M_2) (equal? (term M_1) (term M_2))) + '(1 2))) + #f) + + (test (pair? ((redex-match grammar M) '(1 1))) + #t) + + ;; next 3: test naming of subscript-less non-terminals + (test (pair? (redex-match grammar (M M) (term (1 1)))) #t) + (test (pair? (redex-match grammar (M M) (term (1 2)))) #f) + (test (pair? (redex-match grammar (M_1 M_2) (term (1 2)))) #t) + + (define-language base-grammar + (q 1) + (e (+ e e) number) + (x (variable-except +))) + + (define-extended-language extended-grammar + base-grammar + (e .... (* e e)) + (x (variable-except + *)) + (r 2)) + + (test (pair? (redex-match extended-grammar e '(+ 1 1))) #t) + (test (pair? (redex-match extended-grammar e '(* 2 2))) #t) + (test (pair? (redex-match extended-grammar r '2)) #t) + (test (pair? (redex-match extended-grammar q '1)) #t) + (test (pair? (redex-match extended-grammar x '*)) #f) + (test (pair? (redex-match extended-grammar x '+)) #f) + (test (pair? (redex-match extended-grammar e '....)) #f) + + ;; make sure that `language' with a four period ellipses signals an error + (test (regexp-match #rx"[.][.][.][.]" (with-handlers ([exn? exn-message]) + (let () + (define-language x (e ....)) + 12))) + '("....")) + + + + ;; test multiple variable non-terminals + (let () + (define-language lang + ((l m) (l m) x) + (x variable-not-otherwise-mentioned)) + (test (pair? (redex-match lang m (term x))) + #t)) + + ;; test multiple variable non-terminals + (let () + (define-language lang + ((l m) (l m) x) + (x variable-not-otherwise-mentioned)) + (test (pair? (redex-match lang l (term x))) + #t)) + + (let () + (define-language lang + ((x y) 1 2 3)) + (define-extended-language lang2 lang + (x .... 4)) + (test (pair? (redex-match lang2 x 4)) #t) + (test (pair? (redex-match lang2 y 4)) #t) + (test (pair? (redex-match lang2 x 1)) #t) + (test (pair? (redex-match lang2 y 2)) #t)) + + ;; test that the variable "e" is not bound in the right-hand side of a side-condition + ;; this one signaled an error at some point + (let () + (define-language bad + (e 2 (side-condition (e) #t))) + (test (pair? (redex-match bad e '(2))) + #t)) + + ;; test that the variable "e" is not bound in the right-hand side of a side-condition + ;; this one tests to make sure it really isn't bound + (let ([x #f]) + (define-language bad + (e 2 (side-condition (e) (set! x (term e))))) + (redex-match bad e '(2)) + (test x 'e)) + + ;; test multiple variable non-terminals being extended + (let () + (define-language lang + ((x y) 1 2 3)) + (define-extended-language lang2 lang + (x .... 4)) + (test (pair? (redex-match lang2 x 4)) #t) + (test (pair? (redex-match lang2 y 4)) #t) + (test (pair? (redex-match lang2 x 1)) #t) + (test (pair? (redex-match lang2 y 2)) #t)) + + ;; test multiple variable non-terminals in an extended language + (let () + (define-language lang + ((x y) 1 2 3)) + (define-extended-language lang2 lang + ((z w) 5 6 7)) + (test (pair? (redex-match lang2 z 5)) #t) + (test (pair? (redex-match lang2 w 6)) #t)) + + ;; test cases that ensure that extending any one of a + ;; multiply defined non-terminal gets extended properly + (let () + (define-language iswim + ((V U W) AA)) + + (define-extended-language iswim-cont + iswim + (W .... QQ)) + + (test (pair? (redex-match iswim-cont U (term QQ))) + #t)) + + (let () + (define-language iswim + ((V U W) AA)) + + (define-extended-language iswim-cont + iswim + (W .... QQ)) + + (test (pair? (redex-match iswim-cont V (term QQ))) + #t) + (test (pair? (redex-match iswim-cont U (term QQ))) + #t) + (test (pair? (redex-match iswim-cont W (term QQ))) + #t)) + + (let () + (define-language iswim + ((V U W) AA)) + + (define-extended-language iswim-cont + iswim + (V .... QQ)) + + (test (pair? (redex-match iswim-cont V (term QQ))) + #t) + (test (pair? (redex-match iswim-cont U (term QQ))) + #t) + (test (pair? (redex-match iswim-cont W (term QQ))) + #t)) + + (let () + (define-language okay + [(X Y) z]) + + (define-extended-language replace-both + okay + [(X Y) q]) + + ;; this test ran into an infinite loop in an earlier version of redex. + (test (redex-match replace-both X (term explode)) #f)) + + (test (with-handlers ([exn? exn-message]) + (let () + (define-language main + [(X Y) z]) + (define-extended-language new + main + [(X Y Z) q]) + (void))) + "extend-language: new language extends old non-terminal X and also adds new shortcut Z") + + (test (with-handlers ([exn? exn-message]) + (let () + (define-language main + [(X Y) z] + [(P Q) w]) + (define-extended-language new + main + [(X P) q]) + (void))) + "extend-language: new language does not have the same non-terminal aliases as the old, non-terminal P was not in the same group as X in the old language") + + ;; test caching + (let () + (define match? #t) + + (define-language lang + (x (side-condition any match?))) + + (test (pair? (redex-match lang x 1)) #t) + (set! match? #f) + (test (pair? (redex-match lang x 1)) #t) + (parameterize ([caching-enabled? #f]) + (test (pair? (redex-match lang x 1)) #f))) + + + (let () + (define sc-eval-count 0) + (define-language lang + (x (side-condition any (begin (set! sc-eval-count (+ sc-eval-count 1)) + #t)))) + + (redex-match lang x 1) + (redex-match lang x 1) + (parameterize ([caching-enabled? #f]) + (redex-match lang x 1)) + (test sc-eval-count 2)) + + (let () + (define rhs-eval-count 0) + (define-metafunction empty-language + [(f any) ,(begin (set! rhs-eval-count (+ rhs-eval-count 1)) + 1)]) + + (term (f 1)) + (term (f 1)) + (parameterize ([caching-enabled? #f]) + (term (f 1))) + (test rhs-eval-count 2)) + + (define-namespace-anchor here) + (define ns (namespace-anchor->namespace here)) + + (let ([src 'bad-underscore]) + (test + (parameterize ([current-namespace ns]) + (syntax-error-sources + '(define-language L (n m_1)) + src)) + (list src))) + +; +; +; ;;; ; +; ; ; ; +; ;;; ; ;;; ;;;;; ;;; ;;;;; ;; ;; ;; ;; ;;;; ;;;;; ;;; ;;; ;; ;; ;;;; +; ; ; ; ; ; ; ; ; ; ; ; ;; ; ; ; ; ; ; ; ;; ; ; ; +; ; ; ; ;;;;; ; ;;;; ; ; ; ; ; ; ; ; ; ; ; ; ;;; +; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; +; ; ; ; ; ; ; ; ; ; ; ;; ; ; ; ; ; ; ; ; ; ; ; ; ; +; ;;;;;;; ;;;; ;;; ;;;;; ;;;;; ;; ;;;;; ;;; ;;; ;;; ;;;;; ;;; ;;; ;;; ;;;; +; +; +; +; + + + (define-metafunction grammar + [(f (side-condition (number_1 number_2) + (< (term number_1) + (term number_2)))) + x] + [(f (number 1)) y] + [(f (number_1 2)) ,(+ (term number_1) 2)] + [(f (4 4)) q] + [(f (4 4)) r]) + + (define-metafunction grammar + [(g X) x]) + + (test (term (f (1 17))) 'x) + (test (term (f (11 1))) 'y) + (test (term (f (11 2))) 13) + + + ;; match two clauess => take first one + (test (term (f (4 4))) 'q) + + ;; match one clause two ways => error + (let () + (define-metafunction empty-language + [(ll (number_1 ... number_2 ...)) (number_1 ...)]) + (test (with-handlers ((exn? (λ (x) 'exn-raised))) + (term (ll ())) + 'no-exn) + 'no-exn) + (test (with-handlers ((exn? (λ (x) 'exn-raised))) + (term (ll (4 4))) + 'no-exn) + 'exn-raised)) + + ;; match no ways => error + (test (with-handlers ((exn? (λ (x) 'exn-raised))) (term (f mis-match)) 'no-exn) + 'exn-raised) + + (define-metafunction grammar + [(h (M_1 M_2)) ((h M_2) (h M_1))] + [(h number_1) ,(+ (term number_1) 1)]) + + (test (term (h ((1 2) 3))) + (term (4 (3 2)))) + + (define-metafunction grammar + [(h2 (Q_1 ...)) ((h2 Q_1) ...)] + [(h2 variable) z]) + + (test (term (h2 ((x y) a b c))) + (term ((z z) z z z))) + + (let () + (define-metafunction empty-language + [(f (1)) 1] + [(f (2)) 2] + [(f 3) 3]) + (test (in-domain? (f 1)) #f) + (test (in-domain? (f (1))) #t) + (test (in-domain? (f ((1)))) #f) + (test (in-domain? (f 3)) #t) + (test (in-domain? (f 4)) #f)) + + (let () + (define-metafunction empty-language + f : number -> number + [(f 1) 1]) + (test (in-domain? (f 1)) #t) + (test (in-domain? (f 2)) #t) + (test (in-domain? (f x)) #f)) + + (let () + (define-metafunction empty-language + [(f x) x]) + (test + (term-let ((y 'x)) + (in-domain? (f y))) + #t) + (test + (term-let ((y 'z)) + (in-domain? (f y))) + #f)) + + ;; mutually recursive metafunctions + (define-metafunction grammar + [(odd zero) #f] + [(odd (add1 UN_1)) (even UN_1)]) + + (define-metafunction grammar + [(even zero) #t] + [(even (add1 UN_1)) (odd UN_1)]) + + (test (term (odd (add1 (add1 (add1 (add1 zero)))))) + (term #f)) + + (let () + (define-metafunction empty-language + [(pRe xxx) 1]) + + (define-metafunction empty-language + [(Merge-Exns any_1) any_1]) + + (test (term (pRe (Merge-Exns xxx))) + 1)) + + (let () + (define-metafunction empty-language + [(f (x)) ,(term-let ([var-should-be-lookedup 'y]) (term (f var-should-be-lookedup)))] + [(f y) y] + [(f var-should-be-lookedup) var-should-be-lookedup]) ;; taking this case is bad! + + (test (term (f (x))) (term y))) + + (let () + (define-metafunction empty-language + [(f (x)) (x ,@(term-let ([var-should-be-lookedup 'y]) (term (f var-should-be-lookedup))) x)] + [(f y) (y)] + [(f var-should-be-lookedup) (var-should-be-lookedup)]) ;; taking this case is bad! + + (test (term (f (x))) (term (x y x)))) + + (let () + (define-metafunction empty-language + [(f (any_1 any_2)) + case1 + (side-condition (not (equal? (term any_1) (term any_2)))) + (side-condition (not (equal? (term any_1) 'x)))] + [(f (any_1 any_2)) + case2 + (side-condition (not (equal? (term any_1) (term any_2))))] + [(f (any_1 any_2)) + case3]) + (test (term (f (q r))) (term case1)) + (test (term (f (x y))) (term case2)) + (test (term (f (x x))) (term case3))) + + (let () + (define-metafunction empty-language + [(f (n number)) (n number)] + [(f (a any)) (a any)] + [(f (v variable)) (v variable)] + [(f (s string)) (s string)]) + (test (term (f (n 1))) (term (n 1))) + (test (term (f (a (#f "x" whatever)))) (term (a (#f "x" whatever)))) + (test (term (f (v x))) (term (v x))) + (test (term (f (s "x"))) (term (s "x")))) + + ;; test ..._1 patterns + (let () + (define-metafunction empty-language + [(zip ((variable_id ..._1) (number_val ..._1))) + ((variable_id number_val) ...)]) + + (test (term (zip ((a b) (1 2)))) (term ((a 1) (b 2))))) + + (let () + (define-metafunction empty-language + [(f any_1 any_2 any_3) (any_3 any_2 any_1)]) + (test (term (f 1 2 3)) + (term (3 2 1)))) + + (let () + (define-metafunction empty-language + [(f (any_1 any_2 any_3)) 3]) + (define-metafunction/extension f empty-language + [(g (any_1 any_2)) 2]) + (define-metafunction/extension g empty-language + [(h (any_1)) 1]) + (test (term (h (1))) 1) + (test (term (h (1 2))) 2) + (test (term (h (1 2 3))) 3)) + + (let () + (define-metafunction empty-language + [(f any_1 any_2 any_3) 3]) + (define-metafunction/extension f empty-language + [(g any_1 any_2) 2]) + (define-metafunction/extension g empty-language + [(h any_1) 1]) + (test (term (h 1)) 1) + (test (term (h 1 2)) 2) + (test (term (h 1 2 3)) 3)) + + (let () + (define-metafunction empty-language + [(f number_1 number_2) (f number_1)]) + (define-metafunction/extension f empty-language + [(g number_1) number_1]) + (define-metafunction empty-language + [(h number_1 number_2) (h number_1)] + [(h number_1) number_1]) + (test (term (g 11 17)) 11) + (test (term (h 11 17)) 11)) + + (let () + (define-metafunction empty-language + [(f (number_1 number_2)) + number_3 + (where number_3 ,(+ (term number_1) (term number_2)))]) + (test (term (f (11 17))) 28)) + + (let () + (define-metafunction empty-language + [(f variable) + (any_x any_x) + (where any_x (variable variable))]) + (test (term (f z)) + (term ((z z) (z z))))) + + (let () + (define-metafunction empty-language + [(f number_1) + number_1 + (where number_2 ,(add1 (term number_1))) + (where number_3 ,(add1 (term number_2))) + (side-condition (and (number? (term number_3)) + (= (term number_3) 4)))] + [(f any) 0]) + (test (term (f 2)) 2)) + + (let () + (define-language x-lang + (x variable)) + (define-metafunction x-lang + f : x x -> x + [(f x_1 x_2) x_1]) + (test (term (f p q)) (term p)) + (test (in-domain? (f p q)) #t)) + + (let () + (define-metafunction empty-language + [(err number_1 ... number_2 ...) (number_1 ...)]) + (test (term (err)) (term ())) + (test (with-handlers ((exn:fail:redex? (λ (x) 'right-exn)) + ((λ (x) #t) (λ (x) 'wrong-exn))) + (term (err 1 2)) + 'no-exn) + 'right-exn)) + + (let () + (define-metafunction empty-language + err : number ... -> number + [(err number ...) 1]) + (test (with-handlers ((exn:fail:redex? (λ (x) 'right-exn)) + ((λ (x) #t) (λ (x) 'wrong-exn))) + (term (err #f #t)) + 'no-exn) + 'right-exn)) + + (let () + (define-metafunction empty-language + err : number ... -> number + [(err number ...) #f]) + (test (with-handlers ((exn:fail:redex? (λ (x) 'right-exn)) + ((λ (x) #t) (λ (x) 'wrong-exn))) + (term (err 1 2)) + 'no-exn) + 'right-exn)) + + (let () + (define-metafunction empty-language + err : number ... -> (number number) + [(err number ...) (number ...)]) + (test (with-handlers ((exn:fail:redex? (λ (x) 'right-exn)) + ((λ (x) #t) (λ (x) 'wrong-exn))) + (term (err 1 2)) + 'no-exn) + 'no-exn) + (test (with-handlers ((exn:fail:redex? (λ (x) 'right-exn)) + ((λ (x) #t) (λ (x) 'wrong-exn))) + (term (err 1 1)) + 'no-exn) + 'no-exn)) + + (let () + ;; test that 'where' clauses can contain recursive calls. + (define-metafunction empty-language + [(f (any)) + x + (where x (f any))] + [(f any) any]) + (test (term (f ((((x)))))) + (term x))) + + (let () + (define-language lamv + (z variable hole)) + + (define-metafunction lamv + foo : z -> any + [(foo hole) dontcare] + [(foo variable) docare]) + + (test (term (foo hole)) + (term dontcare)) + (test (term (foo y)) + (term docare))) + + (let () + (define f-called? #f) + (define-metafunction empty-language + f : (side-condition any_1 (begin (set! f-called? #t) #t)) -> any + [(f any_1) any_1]) + (test (term (f 1)) 1) + (test f-called? #t)) + + (let () + (define g-called? #f) + (define-metafunction empty-language + g : any -> (side-condition any_1 (begin (set! g-called? #t) #t)) + [(g any_1) any_1]) + (test (term (g 1)) 1) + (test g-called? #t)) + + ;; test that tracing works properly + ;; note that caching comes into play here (which is why we don't see the recursive calls) + (let () + (define-metafunction empty-language + [(f 0) 0] + [(f number) (f ,(- (term number) 1))]) + + (let ([sp (open-output-string)]) + (parameterize ([current-output-port sp]) + (term (f 1))) + (test (get-output-string sp) "")) + + (let ([sp (open-output-string)]) + (parameterize ([current-output-port sp] + [current-traced-metafunctions 'all]) + (term (f 1))) + (test (get-output-string sp) ">(f 1)\n<0\n")) + + (let ([sp (open-output-string)]) + (parameterize ([current-output-port sp] + [current-traced-metafunctions '(f)]) + (term (f 1))) + (test (get-output-string sp) ">(f 1)\n<0\n"))) + + (let () + (define-language var-lang [(x y z w) variable]) + + ;; this should produce the second case, + ;; since the where clause (should) fail to match + ;; in the first case. + (define-metafunction var-lang + [(f x) + first-case + (where (AnotherAtom y) (Atom x))] + [(f x) + second-case]) + + (test (term (f a)) (term second-case))) + + (let () + + ;; this is an ambiguous function + ;; and should signal an error if it is ever called + ;; with multiple different arguments, but if the + ;; arguments are all the same, it will return + ;; the same result for any parse, and thus should be allowed. + (define-metafunction empty-language + [(f any_x ... any_y any_z ...) + any_y]) + + (test (term (f 1 1 1 1 1)) (term 1))) + + (let () + (define-metafunction empty-language + [(ex variable_x) + variable_x + (where quote variable_x)]) + + (test (term (ex quote)) (term quote))) + + (let () + (define-metafunction empty-language + [(f any ...) + (any ...) + (where variable_1 x) + (side-condition #f) + (where (number ...) y)] + [(f any ...) + 12345]) + + (test (term (f 8)) 12345)) + + +; +; +; +; +; +; +; ;; ;;; ;; ;; ;; ;; +; ;; ;;; ;; ;; ;;; ;; +; ;;;;; ;;;; ;;;;; ;; ;; ;;; ;;;; ;;;; ;;;; ;; ;;;; ;;;;; ;; ;;;; ;; ;;; +; ;;;;;; ;; ;; ;;;; ;; ;;;;;; ;; ;; ;;;; ;; ;; ;; ;; ;; ;;;; ;; ;;;;;; ;;;;;; +; ;;; ;; ;;;;;;;; ;; ;; ;; ;; ;;;;;;;;;;;; ;; ;;;;;;;; ;; ;;;; ;;; ;; ;;; ;;; ;; ;; +; ;;; ;; ;;; ;; ;; ;; ;; ;;; ;;;; ;; ;;; ;; ;;; ;; ;;; ;; ;;; ;;; ;; ;; +; ;;;;;; ;;; ;; ;; ;; ;; ;; ;;; ;; ;; ;;; ;; ;; ;;; ;; ;;;; ;; ;;;;;; ;; ;; +; ;;;;; ;;;; ;; ;; ;; ;; ;;;; ;; ;;;; ;; ;;;;;; ;;; ;; ;;;; ;; ;; +; +; +; + + + (let () + (define-relation empty-language + [(<: any any) #t]) + + (test (term (<: 1 1)) #t) + (test (term (<: 1 2)) #f)) + + (let () + (define-relation empty-language + [(<: number_1 number_2) ,(< (term number_1) (term number_2))] + [(<: number_1 number_1) #t]) + + (test (term (<: 1 2)) #t) + (test (term (<: 1 1)) #t) + (test (term (<: 2 1)) #f)) + + (let () + (define-relation empty-language + [(<: number_1 ... number_2 number_3 ... number_2 number_4 ...) #t]) + + (test (term (<: 1 2 3 4)) #f) + (test (term (<: 1 1 2 3 4)) #t) + (test (term (<: 1 2 1 3 4)) #t) + (test (term (<: 1 2 3 1 4)) #t) + (test (term (<: 1 2 3 4 1)) #t)) + + (let () + (define-relation empty-language + [(<: number_1 number_1)]) + (test (term (<: 1 1)) #t) + (test (term (<: 1 2)) #f)) + + (let () + (define-relation empty-language + [(<: number_1 number_2 number_3) + ,(= (term number_1) (term number_2)) + ,(= (term number_2) (term number_3))]) + (test (term (<: 1 2 3)) #f) + (test (term (<: 1 1 2)) #f) + (test (term (<: 1 2 2)) #f) + (test (term (<: 1 1 1)) #t)) + + +; ;; ; ;; ; +; ; ; ; ; +; ;; ;; ;;; ;; ; ;; ;; ;;;; ;;;;; ;;; ;;; ;; ;; ;; ;; ;;; ; ;;; ;;;;; ;;; ;;; ;; ;; +; ;; ; ; ; ;; ; ; ; ; ; ; ; ; ;; ; ;; ; ; ; ; ; ; ; ; ; ;; ; +; ; ;;;;; ; ; ; ; ; ; ; ; ; ; ; ;;;;; ; ;;;;; ; ;;;; ; ; ; ; ; ; +; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; +; ; ; ; ; ; ;; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; +; ;;;;; ;;;; ;;;;; ;; ;; ;;; ;;; ;;;;; ;;; ;;; ;;; ;;;;; ;;;; ;;;;; ;;;;; ;;; ;;;;; ;;; ;;; ;;; +; +; +; +; + + + + (test (apply-reduction-relation + (reduction-relation + grammar + (--> (in-hole E_1 (number_1 number_2)) + (in-hole E_1 ,(* (term number_1) (term number_2))))) + '((2 3) (4 5))) + (list '(6 (4 5)))) + + (test (apply-reduction-relation + (reduction-relation + grammar + (~~> (number_1 number_2) + ,(* (term number_1) (term number_2))) + with + [(--> (in-hole E_1 a) (in-hole E_1 b)) (~~> a b)]) + '((2 3) (4 5))) + (list '(6 (4 5)))) + + (test (apply-reduction-relation + (reduction-relation + grammar + (==> (number_1 number_2) + ,(* (term number_1) (term number_2))) + with + [(--> (M_1 a) (M_1 b)) (~~> a b)] + [(~~> (M_1 a) (M_1 b)) (==> a b)]) + '((1 2) ((2 3) (4 5)))) + (list '((1 2) ((2 3) 20)))) + + (test (apply-reduction-relation + (reduction-relation + grammar + (~~> (number_1 number_2) + ,(* (term number_1) (term number_2))) + (==> (number_1 number_2) + ,(* (term number_1) (term number_2))) + with + [(--> (M_1 a) (M_1 b)) (~~> a b)] + [(--> (a M_1) (b M_1)) (==> a b)]) + '((2 3) (4 5))) + (list '(6 (4 5)) + '((2 3) 20))) + + (test (apply-reduction-relation + (reduction-relation + grammar + (--> (M_1 (number_1 number_2)) + (M_1 ,(* (term number_1) (term number_2)))) + (==> (number_1 number_2) + ,(* (term number_1) (term number_2))) + with + [(--> (a M_1) (b M_1)) (==> a b)]) + '((2 3) (4 5))) + (list '((2 3) 20) + '(6 (4 5)))) + + ; shortcuts like this fail if compilation fails to preserve + ; lexical context for side-conditions expressions. + (test (let ([x #t]) + (apply-reduction-relation + (reduction-relation + grammar + (==> variable variable) + with + [(--> (a (side-condition number x)) b) + (==> a b)]) + '(x 4))) + '(x)) + + (test (apply-reduction-relation/tag-with-names + (reduction-relation + grammar + (--> (number_1 number_2) + ,(* (term number_1) (term number_2)) + mul)) + '(4 5)) + (list (list "mul" 20))) + + (test (apply-reduction-relation/tag-with-names + (reduction-relation + grammar + (--> (number_1 number_2) + ,(* (term number_1) (term number_2)) + "mul")) + '(4 5)) + (list (list "mul" 20))) + + (test (apply-reduction-relation/tag-with-names + (reduction-relation + grammar + (--> (number_1 number_2) + ,(* (term number_1) (term number_2)))) + '(4 5)) + (list (list #f 20))) + + (test (apply-reduction-relation/tag-with-names + (reduction-relation + grammar + (==> (number_1 number_2) + ,(* (term number_1) (term number_2)) + mult) + with + [(--> (M_1 a) (M_1 b)) (==> a b)]) + '((2 3) (4 5))) + (list (list "mult" '((2 3) 20)))) + + (test (apply-reduction-relation + (union-reduction-relations + (reduction-relation empty-language + (--> x a) + (--> x b)) + (reduction-relation empty-language + (--> x c) + (--> x d))) + 'x) + (list 'a 'b 'c 'd)) + + (test (apply-reduction-relation + (union-reduction-relations + (reduction-relation empty-language (--> x a)) + (reduction-relation empty-language (--> x b)) + (reduction-relation empty-language (--> x c)) + (reduction-relation empty-language (--> x d))) + 'x) + (list 'a 'b 'c 'd)) + + (test (apply-reduction-relation + (reduction-relation + empty-language + (--> (number_1 number_2) + number_2 + (side-condition (< (term number_1) (term number_2)))) + (--> (number_1 number_2) + number_1 + (side-condition (< (term number_2) (term number_1))))) + '(1 2)) + (list 2)) + + (test (apply-reduction-relation + (reduction-relation + empty-language + (--> x #f)) + (term x)) + (list #f)) + + (define-language x-language + (x variable)) + + (test (apply-reduction-relation + (reduction-relation + x-language + (--> x (x x))) + 'y) + (list '(y y))) + + (test (apply-reduction-relation + (reduction-relation + x-language + (--> (x ...) ((x ...)))) + '(p q r)) + (list '((p q r)))) + + #; + (test (apply-reduction-relation + (reduction-relation + empty-language + #:main-arrow :-> + (:-> 1 2)) + 1) + '(2)) + + (test (apply-reduction-relation + (reduction-relation + empty-language + #:domain number + (--> 1 2)) + 1) + '(2)) + + + (test (let ([red + (reduction-relation + empty-language + #:domain number + (--> 1 2))]) + (with-handlers ((exn? exn-message)) + (apply-reduction-relation red 'x) + 'no-exception-raised)) + "reduction-relation: relation not defined for x") + + (test (let ([red + (reduction-relation + empty-language + #:domain number + (--> 1 x))]) + (with-handlers ((exn? exn-message)) + (apply-reduction-relation red 1) + 'no-exception-raised)) + "reduction-relation: relation reduced to x via rule #0 (counting from 0), which is outside its domain") + + (let* ([red1 + (reduction-relation + empty-language + #:domain (side-condition number_1 (even? (term number_1))) + (--> number number))] + [red2 + (reduction-relation + empty-language + #:domain (side-condition number_1 (odd? (term number_1))) + (--> number number))] + [red-c + (union-reduction-relations red1 red2)]) + + ;; ensure first branch of 'union' is checked + (test (with-handlers ((exn? exn-message)) + (apply-reduction-relation red-c 1) + 'no-exception-raised) + "reduction-relation: relation not defined for 1") + + ;; ensure second branch of 'union' is checked + (test (with-handlers ((exn? exn-message)) + (apply-reduction-relation red-c 2) + 'no-exception-raised) + "reduction-relation: relation not defined for 2")) + + (let () + (define-language l1 + (D 0 1 2)) + (define r1 + (reduction-relation + l1 + #:domain D + (--> D D))) + (define-language l2 + (D 0 1 2 3)) + (define r2 + (extend-reduction-relation r1 l2)) + + ;; test that the domain is re-interpreted for the extended reduction-relation + (test (apply-reduction-relation r2 3) + '(3))) + + (let () + (define-language l1 + (D 0 1 2)) + (define r1 + (reduction-relation + l1 + #:domain (D D) + (--> (D_1 D_2) (D_2 D_1)))) + + ;; test that duplicated identifiers in the domain contract do not have to be equal + (test (apply-reduction-relation r1 (term (1 2))) + (list (term (2 1))))) + + ;;test that #:arrow keyword works + (test (apply-reduction-relation + (reduction-relation + empty-language + #:arrow :-> + (:-> 1 2)) + 1) + '(2)) + + (let () + (define-language n-lang + [n number]) + (test (apply-reduction-relation + (reduction-relation n-lang [--> any ,(length (redex-match n-lang n 1))]) + 11) + '(1))) + + (parameterize ([current-namespace syn-err-test-namespace]) + (eval (quote-syntax + (define-language grammar + (M (M M) + number) + (E hole + (E M) + (number E)) + (X (number any) + (any number)) + (Q (Q ...) + variable) + (UN (add1 UN) + zero))))) + + (test-syn-err (reduction-relation + grammar + (~~> (number_1 number_2) + ,(* (term number_1) (term number_2))) + with + [(--> (M a) (M b)) (~~> a b)] + [(~~> (M a) (M b)) (==> a b)]) + #rx"no rules") + + (test-syn-err (reduction-relation grammar) + #rx"no rules use -->") + + (test-syn-err (reduction-relation + grammar + (~~> (number_1 number_2) + ,(* (term number_1) (term number_2)))) + #rx"~~> relation is not defined") + + (test-syn-err (reduction-relation + grammar + (--> (number_1 number_2) + ,(* (term number_1) (term number_2)) + mult) + (--> (number_1 number_2) + ,(* (term number_1) (term number_2)) + mult)) + #rx"same name on multiple rules") + + (test-syn-err (reduction-relation + grammar + (--> 1 2) + (==> 3 4)) + #rx"not defined.*==>") + + (test-syn-err (reduction-relation + empty-language + (--> 1 2) + (==> 3 4) + with + [(~> a b) (==> a b)]) + #rx"not defined.*~>") + + (test-syn-err (define-language bad-lang1 (e name)) #rx"name") + (test-syn-err (define-language bad-lang2 (name x)) #rx"name") + (test-syn-err (define-language bad-lang3 (x_y x)) #rx"x_y") + (test-syn-err (define-language bad-lang4 (a 1 2) (b)) #rx"no productions") + (test-syn-err (let () + (define-language good-lang (a 1 2)) + (define-extended-language bad-lang5 good-lang (a) (b 2))) + #rx"no productions") + + ;; expect union with duplicate names to fail + (test (with-handlers ((exn? (λ (x) 'passed))) + (union-reduction-relations + (reduction-relation + grammar + (--> (number_1 number_2) + ,(* (term number_1) (term number_2)) + mult)) + (reduction-relation + grammar + (--> (number_1 number_2) + ,(* (term number_1) (term number_2)) + mult))) + 'failed) + 'passed) + + (test (with-handlers ((exn? (λ (x) 'passed))) + (union-reduction-relations + (union-reduction-relations + (reduction-relation + grammar + (--> (number_1 number_2) + ,(* (term number_1) (term number_2)) + mult)) + (reduction-relation + grammar + (--> (number_1 number_2) + ,(* (term number_1) (term number_2)) + mult3))) + + (union-reduction-relations + (reduction-relation + grammar + (--> (number_1 number_2) + ,(* (term number_1) (term number_2)) + mult)) + (reduction-relation + grammar + (--> (number_1 number_2) + ,(* (term number_1) (term number_2)) + mult2)))) + 'passed) + 'passed) + + ;; sorting in this test case is so that the results come out in a predictable manner. + (test (sort + (apply-reduction-relation + (compatible-closure + (reduction-relation + grammar + (--> (number_1 number_2) + ,(* (term number_1) (term number_2)) + mult)) + grammar + M) + '((2 3) (4 5))) + (λ (x y) (string<=? (format "~s" x) (format "~s" y)))) + (list '((2 3) 20) + '(6 (4 5)))) + + (test (apply-reduction-relation + (compatible-closure + (reduction-relation + grammar + (--> (number_1 number_2) + ,(* (term number_1) (term number_2)) + mult)) + grammar + M) + '(4 2)) + (list '8)) + + (test (apply-reduction-relation + (context-closure + (context-closure + (reduction-relation grammar (--> 1 2)) + grammar + (y hole)) + grammar + (x hole)) + '(x (y 1))) + (list '(x (y 2)))) + + (test (apply-reduction-relation + (reduction-relation + grammar + (--> (variable_1 variable_2) + (variable_1 variable_2 x) + mul + (fresh x))) + '(x x1)) + (list '(x x1 x2))) + + (test (apply-reduction-relation + (reduction-relation + grammar + (~~> number + x + (fresh x)) + with + [(--> (variable_1 variable_2 a) (variable_1 variable_2 b)) (~~> a b)]) + '(x x1 2)) + (list '(x x1 x2))) + + (test (apply-reduction-relation + (reduction-relation + x-language + (--> (x_1 ...) + (x ...) + (fresh ((x ...) (x_1 ...))))) + '(x y x1)) + (list '(x2 x3 x4))) + + (test (apply-reduction-relation + (reduction-relation + empty-language + (--> (variable_1 ...) + (x ... variable_1 ...) + (fresh ((x ...) (variable_1 ...) (variable_1 ...))))) + '(x y z)) + (list '(x1 y1 z1 x y z))) + + (test (apply-reduction-relation + (reduction-relation + empty-language + (--> any (any_y x) + (where any_y x) + (fresh x))) + (term junk)) + (list '(x x1))) + + (test (apply-reduction-relation + (reduction-relation + empty-language + (--> (variable ...) (variable_0 ... variable_1 ...) + (fresh ((variable_0 ...) (variable ...))) + (fresh ((variable_1 ...) (variable ...))))) + (term (x y))) + (list '(variable_0 variable_1 variable_2 variable_3))) + + + ;; test that redex match can be used in a side-condition + ;; with the same language that is used to define the + ;; reduction relation. + (test (apply-reduction-relation + (reduction-relation + empty-language + (--> any_1 3 + (side-condition (redex-match empty-language (any_1 any_2) (term any_1))))) + '(a b)) + '(3)) + + (test (apply-reduction-relation + (reduction-relation + empty-language + (--> variable_1 + (x variable_1) + (fresh (x variable_1)))) + 'q) + (list '(q1 q))) + + (test (apply-reduction-relation + (extend-reduction-relation (reduction-relation empty-language (--> 1 2)) + empty-language + (--> 1 3)) + 1) + '(3 2)) + + (let () + (define-language e1 + (e 1)) + (define-language e2 + (e 2)) + (define red1 (reduction-relation e1 (--> e (e e)))) + (define red2 (extend-reduction-relation red1 e2 (--> ignoreme ignoreme))) + (test (apply-reduction-relation red1 1) '((1 1))) + (test (apply-reduction-relation red1 2) '()) + (test (apply-reduction-relation red2 1) '()) + (test (apply-reduction-relation red2 2) '((2 2)))) + + (let () + (define red1 (reduction-relation empty-language + (--> a (a a) + a) + (--> b (b b) + b) + (--> q x))) + (define red2 (extend-reduction-relation red1 + empty-language + (--> a (c c) + a) + (--> q z))) + (test (apply-reduction-relation red1 (term a)) (list (term (a a)))) + (test (apply-reduction-relation red1 (term b)) (list (term (b b)))) + (test (apply-reduction-relation red1 (term q)) (list (term x))) + (test (apply-reduction-relation red2 (term a)) (list (term (c c)))) + (test (apply-reduction-relation red2 (term b)) (list (term (b b)))) + (test (apply-reduction-relation red2 (term q)) (list (term z) (term x)))) + + (let () + (define red1 + (reduction-relation + empty-language + (==> a (a a) + a) + (==> b (b b) + b) + (==> q w) + with + [(--> (X a) (X b)) (==> a b)])) + + (define red2 + (extend-reduction-relation + red1 + empty-language + (==> a (c c) + a) + (==> q z) + with + [(--> (X a) (X b)) (==> a b)])) + + (test (apply-reduction-relation red1 (term (X a))) (list (term (X (a a))))) + (test (apply-reduction-relation red1 (term (X b))) (list (term (X (b b))))) + (test (apply-reduction-relation red1 (term (X q))) (list (term (X w)))) + (test (apply-reduction-relation red2 (term (X a))) (list (term (X (c c))))) + (test (apply-reduction-relation red2 (term (X b))) (list (term (X (b b))))) + (test (apply-reduction-relation red2 (term (X q))) (list (term (X z)) + (term (X w))))) + + (test (reduction-relation->rule-names + (reduction-relation + empty-language + (--> x y a))) + '(a)) + + (test (reduction-relation->rule-names + (reduction-relation + empty-language + (--> x y a) + (--> y z b) + (--> z w c))) + '(a b c)) + + (test (reduction-relation->rule-names + (reduction-relation + empty-language + (--> x y a) + (--> y z b) + (--> z w c) + (--> p q z) + (--> q r y) + (--> r p x))) + '(a b c z y x)) + + (test (reduction-relation->rule-names + (extend-reduction-relation + (reduction-relation + empty-language + (--> x y a) + (--> y z b) + (--> z w c)) + empty-language + (--> p q z) + (--> q r y) + (--> r p x))) + '(a b c z y x)) + + (test (reduction-relation->rule-names + (union-reduction-relations + (reduction-relation + empty-language + (--> x y a) + (--> y z b) + (--> z w c)) + (reduction-relation + empty-language + (--> p q z) + (--> q r y) + (--> r p x)))) + '(a b c z y x)) + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; + ;; examples from doc.txt + ;; + + (define-language lc-lang + (e (e e ...) + x + v) + (c (v ... c e ...) + hole) + (v (lambda (x ...) e)) + (x variable-not-otherwise-mentioned)) + + (test (let ([m (redex-match lc-lang e (term (lambda (x) x)))]) + (and m (length m))) + 1) + + (define-extended-language qabc-lang lc-lang (q a b c)) + + (test (redex-match qabc-lang + e + (term (lambda (a) a))) + #f) + + (test (let ([m (redex-match qabc-lang + e + (term (lambda (z) z)))]) + (and m (length m))) + 1) + + (require (lib "list.ss")) + (let () + (define-metafunction lc-lang + free-vars : e -> (x ...) + [(free-vars (e_1 e_2 ...)) + (∪ (free-vars e_1) (free-vars e_2) ...)] + [(free-vars x) (x)] + [(free-vars (lambda (x ...) e)) + (- (free-vars e) (x ...))]) + + (define-metafunction lc-lang + ∪ : (x ...) ... -> (x ...) + [(∪ (x_1 ...) (x_2 ...) (x_3 ...) ...) + (∪ (x_1 ... x_2 ...) (x_3 ...) ...)] + [(∪ (x_1 ...)) + (x_1 ...)] + [(∪) ()]) + + (define-metafunction lc-lang + - : (x ...) (x ...) -> (x ...) + [(- (x ...) ()) (x ...)] + [(- (x_1 ... x_2 x_3 ...) (x_2 x_4 ...)) + (- (x_1 ... x_3 ...) (x_2 x_4 ...)) + (side-condition (not (memq (term x_2) (term (x_3 ...)))))] + [(- (x_1 ...) (x_2 x_3 ...)) + (- (x_1 ...) (x_3 ...))]) + + (test (term (∪)) (term ())) + (test (term (∪ (x y) (z a) (b c))) (term (x y z a b c))) + + (test (term (- (x y) ())) (term (x y))) + (test (term (- (x y) (x))) (term (y))) + (test (term (- (y x) (x))) (term (y))) + (test (term (- (x x x x x) (x))) (term ())) + + (test (term (free-vars (lambda (x) (x y)))) (list 'y)) + (test (term (free-vars (a (b (c (d e)))))) (term (a b c d e)))) + + (test (variable-not-in (term (x y z)) 'x) + (term x1)) + + (test (variable-not-in (term (y z)) 'x) + (term x)) + (test (variable-not-in (term (x x1 x2 x3 x4 x5 x6 x7 x8 x9 x10)) 'x) + (term x11)) + (test (variable-not-in (term (x x11)) 'x) + (term x1)) + (test (variable-not-in (term (x x1 x2 x3)) 'x1) + (term x4)) + (test (variable-not-in (term (x x1 x1 x2 x2)) 'x) + (term x3)) + + (test (variables-not-in (term (x y z)) '(x)) + '(x1)) + (test (variables-not-in (term (x2 y z)) '(x x x)) + '(x x1 x3)) + + (test ((term-match/single empty-language + [(variable_x variable_y) + (cons (term variable_x) + (term variable_y))]) + '(x y)) + '(x . y)) + + (test ((term-match/single empty-language + [(side-condition (variable_x variable_y) + (eq? (term variable_x) 'x)) + (cons (term variable_x) + (term variable_y))]) + '(x y)) + '(x . y)) + + + (test (with-handlers ((exn:fail:redex? (λ (x) 'right-exn)) + ((λ (x) #t) (λ (x) 'wrong-exn))) + ((term-match/single empty-language + [(number_1 ... number_2 ...) 1]) + '(1 2 3)) + 'no-exn) + 'right-exn) + + (test (with-handlers ((exn:fail:redex? (λ (x) 'right-exn)) + ((λ (x) #t) (λ (x) 'wrong-exn))) + ((term-match/single empty-language + [(number_1 ... number_2 ...) 1]) + 'x) + 'no-exn) + 'right-exn) + + (test ((term-match empty-language + [(number_1 ... number_2 ...) 1]) + 'x) + '()) + + (define-language x-is-1-language + [x 1]) + + (test ((term-match/single x-is-1-language + [(x x) + 1]) + '(1 1)) + 1) + + (test (call-with-values + (λ () + ((term-match/single empty-language + [() (values 1 2)]) + '())) + list) + '(1 2)) + + (test (let ([x 0]) + (cons ((term-match empty-language + [(any_a ... number_1 any_b ...) + (begin (set! x (+ x 1)) + (term number_1))]) + '(1 2 3)) + x)) + '((3 2 1) . 3)) + + (test ((term-match empty-language + [number_1 + (term number_1)] + [number_1 + (term number_1)]) + '1) + '(1 1)) + + (test (apply-reduction-relation + (reduction-relation + x-language + (--> (x_one x_!_one x_!_one x_!_one) + (x_one x_!_one))) + (term (a a b c))) + (list (term (a x_!_one)))) + + ;; tests `where' clauses in reduction relation + (test (apply-reduction-relation + (reduction-relation empty-language + (--> number_1 + any_y + (where any_y ,(+ 1 (term number_1))))) + 3) + '(4)) + + ;; tests `where' clauses scoping + (test (let ([x 5]) + (apply-reduction-relation + (reduction-relation empty-language + (--> any + any_z + (where any_y ,x) + (where any_x 2) + (where any_z ,(+ (term any_y) (term any_x))))) + 'whatever)) + '(7)) + + ;; tests `where' clauses bind in side-conditions + (test (let ([x 'unk]) + (apply-reduction-relation + (reduction-relation empty-language + (--> any + the-result + (where any_y any) + (side-condition (eq? (term any_y) 'whatever)))) + 'whatever)) + '(the-result)) + + ;; test that where clauses bind in side-conditions that follow + (let ([save1 #f] + [save2 #f]) + (term-let ([any_y (term outer-y)]) + (test (begin (apply-reduction-relation + (reduction-relation empty-language + (--> number_1 + any_y + (side-condition (set! save1 (term any_y))) + (where any_y inner-y) + (side-condition (set! save2 (term any_y))))) + 3) + (list save1 save2)) + (list 'outer-y 'inner-y)))) + + (test (apply-reduction-relation + (reduction-relation empty-language + (--> any + any_y + (fresh x) + (where any_y x))) + 'x) + '(x1)) + + (let () + ;; tests where's ability to have redex patterns, not just syntax-case patterns + (define-language var-lang [(x y z w) variable]) + + (define red + (reduction-relation + var-lang + (--> (x ...) + (y ... z ...) + (where (y ... w z ...) (x ...))))) + + (test (apply-reduction-relation red (term (a b c))) + (list (term (a b)) (term (a c)) (term (b c))))) + + + (let ([r (reduction-relation + grammar + (->1 1 2) + (->2 3 4) + (->4 5 6) + with + [(--> (side-condition (a number) (even? (term number))) b) + (->1 a b)] + [(--> (X + (number number) + (X_1 X_1) + (M_!_1 M_!_1) + (1 ..._1 1 ..._1) + (1 ..._!_1 1 ..._!_1)) + b) + (->2 X b)] + [(--> (a 1) b) + (->3 a b)] + [(->3 (a 2) b) + (->4 a b)])]) + + ; test that names are properly bound for side-conditions in shortcuts + (let* ([lhs ((rewrite-proc-lhs (first (reduction-relation-make-procs r))) grammar)] + [proc (third lhs)] + [name (cadadr lhs)] + [bind (λ (n) (make-bindings (list (make-bind name n))))]) + (test (and (proc (bind 4)) (not (proc (bind 3)))) #t)) + + ; test binder renaming + (let ([sym-mtch? (λ (rx) (λ (s) (and (symbol? s) (regexp-match? rx (symbol->string s)))))]) + (match (rewrite-proc-lhs (second (reduction-relation-make-procs r))) + [`(3 + (,(and n1 (? (sym-mtch? #px"^number_\\d+$"))) ,n1) + (,(and n2 (? (sym-mtch? #px"^X_1\\d+$"))) ,n2) + (,(and m1 (? (sym-mtch? #px"^M_!_1\\d+$"))) ,m1) + (1 ,(and ...1 (? (sym-mtch? #px"^\\.\\.\\._1\\d+$"))) 1 ,...1) + (1 ,(and ...!1 (? (sym-mtch? #px"^\\.\\.\\._!_1\\d+$"))) 1 ,...!1)) + #t] + [else #f])) + + ; test shortcut in terms of shortcut + (test (match ((rewrite-proc-lhs (third (reduction-relation-make-procs r))) grammar) + [`(((side-condition 5 ,(? procedure?) ,_) 2) 1) #t] + [else #f]) + #t)) + + (let ([< (λ (c d) (string number (q ,(add1 (term number))) + (side-condition (odd? (term number))) + side-condition) + (--> 1 4 plain) + (==> 2 t + shortcut) + with + [(--> (q a) b) + (==> a b)])] + [c (make-coverage R)]) + (parameterize ([relation-coverage (list c)]) + (apply-reduction-relation R 4) + (test (sort (covered-cases c) <) + '(("plain" . 0) ("shortcut" . 0) ("side-condition" . 0))) + + (apply-reduction-relation R 3) + (test (sort (covered-cases c) <) + '(("plain" . 0) ("shortcut" . 0) ("side-condition" . 1))) + + (apply-reduction-relation* R 1) + (test (sort (covered-cases c) <) + '(("plain" . 1) ("shortcut" . 1) ("side-condition" . 2))))) + + (let* ([S (reduction-relation + empty-language + (--> 1 1 uno))] + [S+ (extend-reduction-relation + S empty-language + (--> 2 2 dos))]) + (let ([c (make-coverage S+)]) + (parameterize ([relation-coverage (list c)]) + (apply-reduction-relation S (term 1)) + (test (sort (covered-cases c) <) + '(("dos" . 0) ("uno" . 1))))) + (let ([c (make-coverage S)]) + (parameterize ([relation-coverage (list c)]) + (apply-reduction-relation S+ (term 1)) + (test (sort (covered-cases c) <) + '(("uno" . 1)))))) + + (let* ([T (reduction-relation empty-language (--> any any))] + [c (make-coverage T)]) + (parameterize ([relation-coverage (list c)]) + (apply-reduction-relation T (term q)) + (test (and (regexp-match #px"tl-test.ss:\\d+:\\d+" (caar (covered-cases c))) #t) + #t)))) + + (let* ([R (reduction-relation + empty-language + (--> any any id))] + [c (make-coverage R)] + [c* (make-coverage R)]) + (parameterize ([relation-coverage (list c c*)]) + (apply-reduction-relation R 4) + (test (covered-cases c) '(("id" . 1))) + (test (covered-cases c*) '(("id" . 1))))) + + (let* ([< (λ (c d) + (let ([line-no (compose + string->number + second + (curry regexp-match #px".*:(\\d+):\\d+"))]) + (< (line-no (car c)) (line-no (car d)))))] + [src-ok? (curry regexp-match? #px"tl-test.ss:\\d+:\\d+")] + [sorted-counts (λ (cc) (map cdr (sort (covered-cases cc) <)))]) + (define-metafunction empty-language + [(f 1) 1] + [(f 2) 2]) + (define-metafunction/extension f empty-language + [(g 3) 3]) + (define-relation empty-language + [(R number) + ,(even? (term number))] + [(R number) + ,(= 3 (term number))]) + + (let ([fc (make-coverage f)] + [rc (make-coverage (reduction-relation empty-language (--> any any)))]) + (parameterize ([relation-coverage (list rc fc)]) + (term (f 2)) + (test (andmap (compose src-ok? car) (covered-cases fc)) + #t) + (test (sorted-counts fc) '(0 1)) + + (term (f 1)) + (term (f 1)) + (test (sorted-counts fc) '(2 1)))) + + (let ([c (make-coverage f)]) + (parameterize ([relation-coverage (list c)]) + (term (g 1)) + (test (sorted-counts c) '(1 0)))) + (let ([c (make-coverage g)]) + (parameterize ([relation-coverage (list c)]) + (term (f 1)) + (test (sorted-counts c) '(1 0 0)))) + + (let ([c (make-coverage R)]) + (parameterize ([relation-coverage (list c)]) + (term (R 2)) + (term (R 3)) + (term (R 5)) + (test (sorted-counts c) '(1 1)))) + + (let ([c (make-coverage f)] + [c* (make-coverage f)]) + (parameterize ([relation-coverage (list c* c)]) + (term (f 1)) + (test (sorted-counts c) '(1 0)) + (test (sorted-counts c*) '(1 0))))) + +; +; +; +; +; ;;; +; ;; ;; ; ;; ;; +; ;; ;; ; ;; ;; +; ;;;;; ;;; ;;; ;;;;; ;; ;;; ;;;; ;;;; +; ;; ;; ;; ;; ; ;; ;;;;;;;; ;; ;;; ;; ; ;; ;; +; ;; ;;;;; ;;; ;; ;;; ;; ; ;; ;; ;; ;; +; ;; ;; ;; ;; ;;; ;; ;;;; ;; ;; ;; +; ;; ;; ; ; ;; ;; ;; ;; ;; ;; ; ;; ;; +; ;;;; ;;; ;;; ;;;; ; ;;;;; ;; ;;;; ;;;; +; +; +; + + + (define-syntax-rule + (capture-output arg1 args ...) + (let ([p (open-output-string)]) + (parameterize ([current-output-port p] + [current-error-port p]) + arg1 args ...) + (get-output-string p))) + + (let () + (define red (reduction-relation empty-language (--> 1 2))) + (test (capture-output (test-->> red 1 2) (test-results)) + "One test passed.\n") + (test (capture-output (test-->> red 2 3) (test-results)) + #rx"FAILED tl-test.ss:[0-9.]+\nexpected: 3\n actual: 2\n1 test failed \\(out of 1 total\\).\n")) + + (let () + (define red-share (reduction-relation + empty-language + (--> a b) + (--> a c) + (--> c d) + (--> b d))) + (test (capture-output (test-->> red-share (term a) (term d)) (test-results)) + "One test passed.\n")) + + (let () + (define red-cycle (reduction-relation + empty-language + (--> a a))) + (test (capture-output (test-->> red-cycle #:cycles-ok (term a)) (test-results)) + "One test passed.\n") + (test (capture-output (test-->> red-cycle (term a)) (test-results)) + #rx"FAILED tl-test.ss:[0-9.]+\nfound a cycle in the reduction graph\n1 test failed \\(out of 1 total\\).\n")) + + (let () + (define-metafunction empty-language [(f any) ((any))]) + (test (capture-output (test-equal (term (f 1)) (term ((1)))) + (test-results)) + "One test passed.\n")) + + (let () + (test (capture-output (test-predicate odd? 1) + (test-results)) + "One test passed.\n")) + + (let () + (define red (reduction-relation empty-language (--> any (any)))) + (test (capture-output (test--> red (term (1 2 3)) (term ((1 2 3)))) (test-results)) + "One test passed.\n")) + + (let () + (define red (reduction-relation empty-language + (--> any (any)) + (--> (any) any))) + (test (capture-output (test--> red (term (x)) (term ((x))) (term x)) (test-results)) + "One test passed.\n") + (test (capture-output (test--> red (term (x)) (term x) (term ((x)))) (test-results)) + "One test passed.\n")) + + (print-tests-passed 'tl-test.ss)) From 8fe66b993524e14391b3391220deaed6ebc31b02 Mon Sep 17 00:00:00 2001 From: Casey Klein Date: Tue, 26 Jan 2010 17:33:38 +0000 Subject: [PATCH 069/113] Somehow managed to copy the tests instead of moving them! svn: r17837 --- collects/redex/private/bitmap-test.ss | 167 -- .../private/bmps-macosx/extended-language.png | Bin 1989 -> 0 bytes .../extended-reduction-relation.png | Bin 394 -> 0 bytes .../private/bmps-macosx/language-nox.png | Bin 3006 -> 0 bytes .../redex/private/bmps-macosx/language.png | Bin 6006 -> 0 bytes collects/redex/private/bmps-macosx/lw.png | Bin 1232 -> 0 bytes .../metafunction-Name-vertical.png | Bin 4823 -> 0 bytes .../private/bmps-macosx/metafunction-Name.png | Bin 4440 -> 0 bytes .../private/bmps-macosx/metafunction-T.png | Bin 4705 -> 0 bytes .../private/bmps-macosx/metafunction-TL.png | Bin 4667 -> 0 bytes .../bmps-macosx/metafunction-multi-arg.png | Bin 8456 -> 0 bytes .../bmps-macosx/metafunction-subst.png | Bin 4418 -> 0 bytes .../private/bmps-macosx/metafunction.png | Bin 1076 -> 0 bytes .../bmps-macosx/metafunctions-multiple.png | Bin 9319 -> 0 bytes collects/redex/private/bmps-macosx/red2.png | Bin 5232 -> 0 bytes .../bmps-macosx/reduction-relation.png | Bin 1801 -> 0 bytes .../private/bmps-macosx/superscripts.png | Bin 944 -> 0 bytes .../bmps-macosx/unix-extended-language.png | Bin 2109 -> 0 bytes .../unix-extended-reduction-relation.png | Bin 507 -> 0 bytes .../private/bmps-macosx/unix-language-nox.png | Bin 3129 -> 0 bytes .../private/bmps-macosx/unix-language.png | Bin 5597 -> 0 bytes .../redex/private/bmps-macosx/unix-lw.png | Bin 1181 -> 0 bytes .../unix-metafunction-Name-vertical.png | Bin 4545 -> 0 bytes .../bmps-macosx/unix-metafunction-Name.png | Bin 3738 -> 0 bytes .../bmps-macosx/unix-metafunction-T.png | Bin 4027 -> 0 bytes .../bmps-macosx/unix-metafunction-TL.png | Bin 4547 -> 0 bytes .../unix-metafunction-multi-arg.png | Bin 7208 -> 0 bytes .../bmps-macosx/unix-metafunction-subst.png | Bin 5287 -> 0 bytes .../private/bmps-macosx/unix-metafunction.png | Bin 1158 -> 0 bytes .../unix-metafunctions-multiple.png | Bin 10731 -> 0 bytes .../bmps-macosx/unix-reduction-relation.png | Bin 1956 -> 0 bytes collects/redex/private/color-test.ss | 69 - collects/redex/private/config.ss | 5 - collects/redex/private/core-layout-test.ss | 82 - collects/redex/private/hole-test.ss | 32 - collects/redex/private/keyword-macros-test.ss | 46 - collects/redex/private/lw-test-util.ss | 43 - collects/redex/private/lw-test.ss | 282 --- collects/redex/private/matcher-test.ss | 820 -------- collects/redex/private/pict-test.ss | 53 - collects/redex/private/rg-test.ss | 1081 ---------- collects/redex/private/run-tests.ss | 41 - collects/redex/private/term-test.ss | 177 -- collects/redex/private/test-util.ss | 132 -- collects/redex/private/tl-test.ss | 1850 ----------------- 45 files changed, 4880 deletions(-) delete mode 100644 collects/redex/private/bitmap-test.ss delete mode 100644 collects/redex/private/bmps-macosx/extended-language.png delete mode 100644 collects/redex/private/bmps-macosx/extended-reduction-relation.png delete mode 100644 collects/redex/private/bmps-macosx/language-nox.png delete mode 100644 collects/redex/private/bmps-macosx/language.png delete mode 100644 collects/redex/private/bmps-macosx/lw.png delete mode 100644 collects/redex/private/bmps-macosx/metafunction-Name-vertical.png delete mode 100644 collects/redex/private/bmps-macosx/metafunction-Name.png delete mode 100644 collects/redex/private/bmps-macosx/metafunction-T.png delete mode 100644 collects/redex/private/bmps-macosx/metafunction-TL.png delete mode 100644 collects/redex/private/bmps-macosx/metafunction-multi-arg.png delete mode 100644 collects/redex/private/bmps-macosx/metafunction-subst.png delete mode 100644 collects/redex/private/bmps-macosx/metafunction.png delete mode 100644 collects/redex/private/bmps-macosx/metafunctions-multiple.png delete mode 100644 collects/redex/private/bmps-macosx/red2.png delete mode 100644 collects/redex/private/bmps-macosx/reduction-relation.png delete mode 100644 collects/redex/private/bmps-macosx/superscripts.png delete mode 100644 collects/redex/private/bmps-macosx/unix-extended-language.png delete mode 100644 collects/redex/private/bmps-macosx/unix-extended-reduction-relation.png delete mode 100644 collects/redex/private/bmps-macosx/unix-language-nox.png delete mode 100644 collects/redex/private/bmps-macosx/unix-language.png delete mode 100644 collects/redex/private/bmps-macosx/unix-lw.png delete mode 100644 collects/redex/private/bmps-macosx/unix-metafunction-Name-vertical.png delete mode 100644 collects/redex/private/bmps-macosx/unix-metafunction-Name.png delete mode 100644 collects/redex/private/bmps-macosx/unix-metafunction-T.png delete mode 100644 collects/redex/private/bmps-macosx/unix-metafunction-TL.png delete mode 100644 collects/redex/private/bmps-macosx/unix-metafunction-multi-arg.png delete mode 100644 collects/redex/private/bmps-macosx/unix-metafunction-subst.png delete mode 100644 collects/redex/private/bmps-macosx/unix-metafunction.png delete mode 100644 collects/redex/private/bmps-macosx/unix-metafunctions-multiple.png delete mode 100644 collects/redex/private/bmps-macosx/unix-reduction-relation.png delete mode 100644 collects/redex/private/color-test.ss delete mode 100644 collects/redex/private/config.ss delete mode 100644 collects/redex/private/core-layout-test.ss delete mode 100644 collects/redex/private/hole-test.ss delete mode 100644 collects/redex/private/keyword-macros-test.ss delete mode 100644 collects/redex/private/lw-test-util.ss delete mode 100644 collects/redex/private/lw-test.ss delete mode 100644 collects/redex/private/matcher-test.ss delete mode 100644 collects/redex/private/pict-test.ss delete mode 100644 collects/redex/private/rg-test.ss delete mode 100644 collects/redex/private/run-tests.ss delete mode 100644 collects/redex/private/term-test.ss delete mode 100644 collects/redex/private/test-util.ss delete mode 100644 collects/redex/private/tl-test.ss diff --git a/collects/redex/private/bitmap-test.ss b/collects/redex/private/bitmap-test.ss deleted file mode 100644 index e5f73397d9..0000000000 --- a/collects/redex/private/bitmap-test.ss +++ /dev/null @@ -1,167 +0,0 @@ -#lang scheme -(require "bitmap-test-util.ss" - "../main.ss") - -;; tests: -;; - language, -;; - multi-line non-terminals, single-line non-terminals -(define-language lang - (e (e e) - x - (λ (x) e) - number) - (v number (λ (x) e)) - ((x y) variable-not-otherwise-mentioned)) - -(test (render-language lang) "language.png") - -(test (render-language lang #:nts '(e v)) "language-nox.png") - -(define-extended-language lang++ lang - (e .... number (+ e e)) - (v .... number)) - -(test (render-language lang++) "extended-language.png") - -(define red - (reduction-relation - lang - (--> ((λ (x) e) v) (S x v e)))) - -;; tests: reduction-relation -(test (render-reduction-relation red) - "reduction-relation.png") - -(test (render-reduction-relation - (extend-reduction-relation red lang (--> 1 2))) - "extended-reduction-relation.png") - -;; this test should fail because it gets the order wrong -;; for the where/side-conditions -(define red2 - (reduction-relation - lang - (--> (number_a number_b number_c number_d) - any_z - (where (any_x any_y) (number_a number_b)) - (side-condition (= (term number_c) 5)) - (where any_z any_x) - (side-condition (= (term number_d) 5))))) - -(test (render-reduction-relation red2) - "red2.png") - -(define-metafunction lang - [(S x v e) e]) - -(test (render-metafunction S) - "metafunction.png") - -(define-metafunction lang - [(T x y) - 1 - (side-condition (not (eq? (term x) (term y))))] - [(T x x) - (any_1 any_2) - (where any_1 2) - (where any_2 2)]) - -;; in this test, the metafunction has 2 clauses -;; with a side-condition on the first clause -;; and a 'where' in the second clause -(test (render-metafunction T) "metafunction-T.png") - -;; in this test, teh `x' is italic and the 'z' is sf, since 'x' is in the grammar, and 'z' is not. -(test (render-lw - lang - (to-lw ((λ (x) (x x)) - (λ (z) (z z))))) - "lw.png") - -(define-metafunction lang - [(TL 1) (a - ,(term-let ((x (term 1))) - (term x)) - below-only)] - [(TL 2) (a - ,(term-let ((x (term 1))) - (term x)) beside - below)]) - -;; this tests that term-let is sucked away properly -;; when the metafunction is rendered -(test (render-metafunction TL) "metafunction-TL.png") - -(define-metafunction lang - [(Name (name x-arg arg)) - ,(term-let ((x-term-let (term 1))) - (term (x-where x-term-let))) - (where x-where 2)]) - -;; this tests that the three variable bindings -;; (x-arg, x-term-let, and x-where) -;; all show up in the output. -(test (render-metafunction Name) "metafunction-Name.png") - -;; same as previous, but with vertical organization of the bindings -(test (parameterize ([metafunction-pict-style 'up-down/vertical-side-conditions]) - (render-metafunction Name)) - "metafunction-Name-vertical.png") - -;; makes sure that there is no overlap inside or across metafunction calls -;; or when there are unquotes involved -(define-metafunction lang - [(multi-arg a - b - c) - ((multi-arg a - b - c) - (multi-arg a - b - c))] - [(multi-arg unquote-test) - (,@(term (multi-arg with-unquote)) - ,@(term (multi-arg with-unquote)) - ,@(term (multi-arg with-unquote)))]) - -(test (render-metafunction multi-arg) "metafunction-multi-arg.png") - -;; makes sure that the LHS and RHS of metafunctions are appropriately -;; rewritten - -(define-metafunction lang - subst : e x e -> e - [(subst x x e) e] - [(subst number x e) number] - [(subst x_1 x_2 e) x_1] - [(subst (e_1 e_2) x e) - ((subst e_1 x e) (subst e_2 x e))] - [(subst (λ (x) e_b) x e) - (λ (x) e)] - [(subst (λ (x_f) e_f) x_a e_a) - (λ (x_f) (subst e_f x_a e_a))]) - -(define (subst-rw lws) - (list "" - (list-ref lws 2) - "{" - (list-ref lws 3) - ":=" - (list-ref lws 4) - "}")) - -(test (with-compound-rewriter 'subst subst-rw - (render-metafunction subst)) - "metafunction-subst.png") - - -;; make sure two metafunctions simultaneously rewritten line up properly -(test (render-metafunctions S T TL) "metafunctions-multiple.png") - -;; Non-terminal superscripts -(test (render-lw lang (to-lw (x_^abcdef x_q^abcdef))) - "superscripts.png") - -(printf "bitmap-test.ss: ") -(done) diff --git a/collects/redex/private/bmps-macosx/extended-language.png b/collects/redex/private/bmps-macosx/extended-language.png deleted file mode 100644 index 448f4f9bfb08c89fe4ec8b812451030d4c194ff7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1989 zcmV;$2RitPP)d2$tOB{Qh_wV<1GoAZhve>)G?1^SsY<&ilRxzJP)d z0$-xDvy(!h;PLpGE@T>9*Jd;t(P*@1uc+7S0|NsQ+t0J9f1jeFqBn2ecqzF`r4oz9 zO-)VzZ@RPEj7DQgNr}m1`n~F=VQ_FzBoZOE&ux`g2?z)%D=TYnZ}(tMlgX5uo6BOc zuvn}I(;~#j#~TcW+qZ9ne{HMqc)Uy|OG!!bV9u(ls<^l~0)b%lw70i&xm-`>XD}EQ z6%`W`6F=Fi%F4=wgak+XFGZzNNu|=Hq$E!zgb)@N7jNCV)z&#MFi=}t>#0kiP^dL) z)(8ZGA6q4rO1WGvm&+|KF18&P8ymZ0#|}IDC>m9qN0>a<@fL3Pn;^P@@i{q<#IWj&1Ntda=AP=H#Z?60Yb>*@s=)K+Sb+v z01%7Ct5>gXX=%yN&tJQC?aLRC`R?7jE^7Py`Lj$WBa_L$ z)RD8*b{1W>Y?)Xr_6GonM50TVE;TeX+`4t^!-o&H(`YmrjYhMx*=+Xi-Mj5BFmK+x zUnOsMb#-+t7OS$dQlrrT03JPh1R*4o$t5KvnVFg8<>lwkpSNotkH<$uL{O>J zfq{XmSFe&tBp0;}4Go2chN4g?0KohA?~zkbB9SPS$~$-NAj^`Pnrb`6#cDf?1_uYf zeft*3Lg+f7`6bhxVu+U<$T)TE{`SRs5nM|ovVlWu3Rtq7FjEv;*c*sZwgTd$X zr){6bVlkOai^cNO+Uo1;=g*&y*tNB_WHOmdCWnNCU@#cO&dSQN9q)RzokgEKd4j{? z!1e3bqobpno12YBqnoSAhJGoGMV}L`4Gb4;bA{NKdDp-A>6WM%eiysAcWP`)$7)+gAn%j_Y(*Nq<@)A z78Vxv>C-32_NS(%LPA0wJb2(vZLeRy_Ve>Io6WY)8#itwCMHhXo$J+h7OktRqf)8< z-@bh#5C~~$X#jx1!NCO!7GN+K>+>j=%lrEJkdI7OJ2^QyA|k@>$&HDLvGWK70wR&P zZQC}rT7CKQ<-L3NQYaK>wu_fcOG`_9e0*YJBJzGHEG+Eq?$&5D(b3UUQ&XLtoeG5_ zCnu+`ukY#8rx_U;R4UbMHn+C6mX?+R0K{T(Mn*<=cXw-RYkGQmU|^uxY-Y3BWo2cN zk&%w=zk2m5C@2W={FFtD7NODTv9YnRurPPVyIyT)(b3V-n3xzaIy$;|@#5_4Y@tvn zkx1U7cN{t>?KQgz(w3XR)!d$dt6Sw7k5$k&zKTpP!YLB^HZM zojTRg(SbxA+vjjN1qB7ub~NqFxu~e9v9ZzCI5yN7!C=?3BM$RD@Q>>@X&rPtM@B~W z?b`<-1pm9lS*-N*^myv1wnM2@78Vv73x86azt6jVzG|OI*~{$FE0lGh(w|zM~)N} z6yWjr(a}*mWj#GT-AjG_G7!R=nwrg9+S=OM+Pv{q&V77YS)W<_0RSWtX=G$X zrBcacvYk73{&aWweE$9W_wAeq4jkCCXOA~-CY?_A{Q2|Z;^KgS0Fg+vY11YEfWcsp zNF>$O)l#W+U|;~b_usvHH#|Ii=+Ge)3f0`)oSB&!6%|!eQULirB<0DzE?kgs3A3WY*8 zn{5}KRn~n72;tb+SW;5b#KeT-LpQ6e`wl;ZC6md7JpPUt3zT diff --git a/collects/redex/private/bmps-macosx/extended-reduction-relation.png b/collects/redex/private/bmps-macosx/extended-reduction-relation.png deleted file mode 100644 index 46e14cf70397c41c828ae06d48432c0ef290fe3d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 394 zcmV;50d@X~P)HEGAB93Dk>nN_ON(d1}5t$VLH~_3x zD^*pWdoE*aD&n_D&-G0pB4g|g;#poO9)kWU?xoH1IB!e#eku7<@#B}W+&3|%y6^kn zp1Xtx*OdUEu4~tI0pNH%=6U`UJcez}K@%?@$5K92yd7cnLQIzZT8by)s`xL1T of4-7&x-}DX;4gdfE07*qoM6N<$f>_b7d;kCd diff --git a/collects/redex/private/bmps-macosx/language-nox.png b/collects/redex/private/bmps-macosx/language-nox.png deleted file mode 100644 index 083d80cc662ff90c9748380ba1ad756aba9c5dc4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3006 zcmV;v3qkaWP)000YxNklzWOfb=yYNBqee}BJ_fLJWX+cY#ZELgBWb*Os^jjc5` zHH#K4nsPBF3J{4z4h|0Y@88eP&OUMC#Ms!FLB_pz@1DxvSdkOVq$rD`HL4X)V4!GLBYa> z3yEcYNKQ_!uC9g<>YhSd>y8~e9zT9Oojq&{00<$9qEe|;n}tH5&{&?5;o;%<_;{?W zdkSLf*RNmq?%k{ZTqXw~b@cZ3_Oi0FU+pE4NVr_?`1m*(OQHxgNOD}PzrWwg%F5Q( zR{t(<-@awBSadp_yj2+;!}z_mwbj$plfhv8`=S023=^M8PEP*t;e$bj`a>W$4m^W4 zX8dj(X8dj($nv{Vsl0#xK9k853WX0IJXp1ARc~)ENpqPZWci&=r^m*|Zr;2(D=W*= z(z30s4IdMpf!ym%XlQ6pPtT@Jn@F9-6d~8|5{YEy{!$|(`u*9nXW`-DR#sL*q453t z_vB4vijd-Wfk5Ez?>{jyv0}xFZQHh`rly*i&D=Qs1G3^X!^6XK=gtKHpeU+TDt}40 z^d~@iTxLu*wzkUUa&4^$g2-etg+ig{Xb6I+)#%?>e@o*+Zah+@k34kf zkfWpH)2B~$kE2abslQ^JUK?D=Vv(mKJS;sM)K5qG(7+$jHdZl#9{d z(uk1ty9x>V$mh?WkByBL78dGhuZI4LNt4i4lI3@zK9a}dg@uJxR#s~K1;*QJi)DIy zd-M5xV&Bfr&g|^$?Ck6d7cO8m+AOI9S$^;C?sjl+pwVd9p*9 z#_a5D6h*b!11+&kqGD2|tu!|`@9OFrA0O9dNi|4(-o)W>T3cHI06ZQqARu7bvSnD) z`Sa%+8yioZI;GKGM=Vny5U|;7e6L-*cJ=r7@7uSpqM|}3ld0scL`%v+-YqI#ANfo6 zGMNmknVg(dsr9reCQVdZNiBV(HhcXQlcu7rq?|rdqrLu$NmJ2Q&gdhJg9+#(rBW%M z&wudX0ZHQ<1rvDgVQy|-SXlV{`Ez40#E_VP-x&->Z*MR5j@5623HV(qm3DS^1_cEf zdm)B|#Q01`M#h>oYlen~&YU^p>gpgn z`}S>caPW;AH%K}!LqV3`84QNCwY86rPjz*5dV2cs@UToKn=@yQjg5_;pC15VaBz^v z-#Pc2z-5g*REX)0I098 z-@JKqTU%RGQCb5dgsF^P{4o z+S=M4J$e)w8996QY^74k;cyBI3te1Xh+)Whw-Q8s}*|%@s3JMAm5)%6Q`g(eL+}+)4Yir};;s5|mO-*iYZrB_6pFe-@>+5rH zaG=xa2!aR%f{cuew6wG>TebjAVaVFr+U?u7n~)0gztHK)<#H^903no0rC0{0k&zJ_ z8yg*6Y;0_>$9@WhVsvy=EpHQqaA;`A1g_&+n9)ZX2b0;DzZt*3->IqHGy%W=%XlO; zwVNj3cQWFU_}rG|<>krA$;XZz)6-t9N&jq@|FAUf-v>Qevu2GzAedfXYHByh${%S! z3?7e!6wq#(wYRtX`}3IVqzkKAg^D)_VDn)D#OCUZr!>CAxutA_Vo0`Dm^_txm+%aqJRDM7xoR3 zNF zqB%J^zP`T16H&8=5SEpdZP>5@Uqj4xsXH$wfDpcT@xsr~Pa=_AzkYpccS4w#mlsMv zP4_~bcqGy9@87>SGc!{vmDpimVBqP~ry+#jzki=KYZfu%pPD^{FefKx{`~oPo2sfR z7K??iAubYcNe2Mf+1Y*n{=K}soWtR$?UZTfk5r3Ca=F~LwlTOtk4NHjTVmSH($Z3Z({5H)R^mf!czf`-b~86O zS11(H>Gb8xmjj*JO`tI^CWKHd76%0djgF2Izbwulf1;adB~c zK0hrjt+}}wYbBtfs@#@Gj~>N-$uXLno0&{zN=k}Gdp@7<=jX@g z^C5&>E;lA7rmL$9GazQW)SVae|M%}|djZe1^GB)}9v;RDD2l3H8^f;MI=ZN?)MH~~ z#Fx!;IK AvH$=8 diff --git a/collects/redex/private/bmps-macosx/language.png b/collects/redex/private/bmps-macosx/language.png deleted file mode 100644 index 1275c7b26c55d8302e3a19fd7a03b2ae2a86e8a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6006 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 Kg{+W&9{xYJ4^3DA diff --git a/collects/redex/private/bmps-macosx/metafunction-Name.png b/collects/redex/private/bmps-macosx/metafunction-Name.png deleted file mode 100644 index e4f7dc5331411cc3d70ad2ac520c16b4fd70e938..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4440 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 G;r{`2*`}QU diff --git a/collects/redex/private/bmps-macosx/metafunction-T.png b/collects/redex/private/bmps-macosx/metafunction-T.png deleted file mode 100644 index 23606d0bd557bf61c3efc56bcf6a8d00c535c1b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4705 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 Uvvc7u!J{KUM?+7&Qq?Z>f9Z_+@c;k- diff --git a/collects/redex/private/bmps-macosx/metafunction-TL.png b/collects/redex/private/bmps-macosx/metafunction-TL.png deleted file mode 100644 index 1b0410ede7f8c957006607bac0a4f4a11825d2dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4667 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 Pg`nG-dK!gl7XJSMoS8#V diff --git a/collects/redex/private/bmps-macosx/metafunction-multi-arg.png b/collects/redex/private/bmps-macosx/metafunction-multi-arg.png deleted file mode 100644 index 0ae325b3b04c5e9e410aae691ebec93a43c5526d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8456 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%0AO0sn_OvrXz<4EHPdzac#Bj-%?(?9|AVKhK7c4 zAmV$p=Nzs80o3-m=j3uX>15{Tc^6Pl(5x$triO;Eb$E{3WKVFAAd*yJ`baR&AC(>r zPk?{}aoX56p8K!>?d|U^&1FACLhW8XDl1v+rj)NgBGl?|`zMZjfY- z@pN%XhSb#J_VYrg=_U#H;acw!hkFzh6t=djkYeMCb?f0GNS=P#N>d0)d3iaccWrG- zSnY&YuU4vmRf-Lu$2e_^0bSwY`?EA~5zsq@juZmMwUuRMJCmm;6^8sEc85us@SkcK z8b$`1r5s=lcE^CL3!RCI#^YC+BlG zcIudu_WccxTSrHSNybm_x&aJ~M$Z6&gekD4bwd(0B#UWmYC;2c0}()iQ3KN~dK`N4 z#oOB(+7^780vpu_`Mj)P5MOQ4mq+2l&`^R{<@gTs4J=iHDkO}{Z|_Dx#sC}z$24n+ ziS*!;0A1PH*(1M`SqRbtHjS28QUuGv0gR;g7JImY&q9(Vc&M$dEd+tX0yy;0kUjnd zFehwWs6OG|I|W*xw)@T7*Yv1p%7MB(_2)ETZVilsG#61EP9xy zhl3Or7KVj|IXOG`<`a1kk=hjEs1Jd>URYRIA1-PJx%%zfMc)EuDykxME3p-G!_gLr z-y{(NBx6+Nf`#IOh&UW`?OuZcA?uk6)OZZJ4|7bGcJ|k=U(*5(tU=!TePLq3CHP27 z+zNquyz0E(C0J?DjR72hL3M$rGVzCphto`mI*84lo|i!Gs#u#cpXEO2c&roVO%i@{ zb2Hp3R(l1U3vRzu z)I{+d)GDy+U0q8oo`Vor{Z?ShVM7N;We|Rgg|xvTjz|)!dAr*jSCFzx&6IFf{80p; z)7HLUxWX1R`*>Func79d^XMWyi3T~=_qn|@krFbNs@B;}==ti*tB=KcATnfUS6KZ6ACcRRD$2}!4C&vACmcV0@m|T! zNW%}c&(hAoCXq4+RQ-Iftzi$xF6Yx5=U@*YtKIybcibh z-|D+wwdfWBOaF1=)EXQ5{JBk(rp+5g5)u*(jqaB(DSwQQ>X~@bYX~WqByyfPzKlJcILEeSQ7ox-#+e**dChv5?~}{ro9=Eg{e)lD7YJ zFZt(WgQKnOEmw9L#edIsKSfzw zp(H$O8qqlb@&>o%zPR^;>~FmplsH&fS+8BQh9nSzX5#A0mUDdzFsOK$m$mdFi5Ypi zmvw(6MltaQxAAwU$g9Q-W(#oXe#Ad7)&6r5LxFjlt!h`lFkKMHmo52EZ?!)CeN~!Y zkxn2=&=sa$2?Ly$XM{Uhu15boj!zS0N31B~0gNIFhLFC~^Sa_G3{6AOs;0qD6O93a za;SlN0T1QCV3Q`1aXE!!Xgnx}BYj%*=}X_UnINDleSj zQ`v_<31~k1TY$p!UMr<&rrTzWgb2*#r`e}ZY9Im^78kE#6p^4AtU8-`{1rY=R14yXSOGF5v8bu`nQlyH2 z6lnqJReCQ9C_S`)-do@L-(4%YE4gRRoSAdZ-g|D0sj(gtJr_L$0%6iez>(lS2|jn| zD8aXQ*z;=;$i?&eaBcIaS--NMnVJuswe>(L8|jS0)b%=Vgh6lihRgLavuj^cY^L#e zZE8qkUalpIhkNH2(y@EPX>&{Z7~fOqnp#sT>UgnQqglcPk(c<=Myb)`@3&9p)%N{s z{5QS#z5O>Qck54WzXyM>S+3vr+Ha~?p%aJ*$s!UZO09pct$iTq!WO*I7)(P-%0N>j z1D-3T?chq^mc6(4pGuD(WHR}ZdXARB)2$h8FE1|(i@(B~|6ICES+>5|+nXF0XJ}%Q z^y!nryk1d${=sY%zoew(C4PLHia_0+z5V@bDk>|^w<#f6+1WRtSQ*_VxeJI9k%-Zf3L1Cqr7h<5@}-Mc(dVb_~@|z{l|}q zPZQloK8h5GTB@OLDO($%YZ@813G>PkgR>rznaHoBLXcp*|J zlzV(&V4$n3u&nG)8$U)$LP8aD`UN4}+1-6Jr<+77C@450uNO~FOguq{#mlLxjtvZi zyO)=gc=`K_ainA`GFu2lurz_|)hmI8QfsNHQkOQo!d-TH>MW+pc>3`0a6dmkuvQxz z8(L<*tc(nuTrPh82Cvzs+2$x>(%<6uRNVPu)1d`sQXKw%e$XVGlnv6uO?d)wOD8r`~ORcK8C8LbQ4-FFgE6-*2a=O9m>Jo$1k7q_&u1PQ6HuLt8& zak%wO_;SLhPd?7h(2sqst`-@eVu%iA7VURv5WHg*{; z#ZEtzR=55ATJEzw{PTj}U%!S#Md{hwPrNn6ZA{h0RmQ=gpcHuPs7o%4*=(EAB7|8N zut;JS9=|piqFZ>tv9z*($FYE60h=Wy+tO($Io!NKX{NPZKrfL=EG5OxBCV! z+fH_SOG`^v7h_#wz|*JIwYB`${EUd^lwI5$m0c4P_5v*T>iHO`!j^L}d_UwhHBX1E zP<3agM@9~RROx;fqRYc}d=QWjdl}D1kNEib5~HIX*Pf=Nq%1Bj7FZSU?d-TdFyfoP zG4Od|)+tU^^FFvyUnn9GiA235J~@?F_A;Blex;HY8529+@Tc43goK222wUXc^{eDR zAK%+9u@Rk`XL|O)8r0Oty@VU%emp!p_SIgq^KD6&vlu(OGnGe*?B2&=cOkzJOuVAS zxZ&a9y1F_7fiUj3;9w$uPw&CXm1E7R;o-`^ySY5B=}hekhx+9`PwW^S9mNXiQJy=e zr>DovuX)_WARGN{uA`$vw*CMrAOMjtKp?~=CAoNbCTjgXU0oMuW*mcpg0!?C5nBhp z=V6wG`9($45W2`F<>{bLA3i+j$1kK=>ENs3<9=VX?nEVa4hIFMd@`*9RTS zUtt+Z`Hbm^1d+12ySu|+FcfOKzrTNH=LykV5{r2B!%KY5i;Vhr4t9h;m^AO|Xp?LIPgYnjh4EcKYyO3X?68J3|4@}VnNpP^Yb+V_q6D0Yin;A8I6yR3q)ipd8h^K zh(~O#4HYytHnKDg4_n&V*$Ka!n!2N>*9J;3Tl3j?Tifzdccwg^Q8foiv@dhjN268! zSotx>zx}75MP=If`R(<;HH=XR-knTEC018WtkK z#n!@Nad~;amD>{nk%Ym(QZq6#gjr*fl9G_b6Ao12?6GcrCD6adKgbaEn?itlYqX6EK@&dupuy~xeY4cGw7!5;3V zK|I3QM-R>%E~J>$A1-mbVgu0Vx9{I4B_^Kk{qO|5vAViSAKBE=At5GqHz-J5QgUsg z#)qZpN0sLhnGAIRc+ASm%6C0DXs#uu$gT?5mY0{4$pH&CuVd14a{eix3FRnkO%9l* z7rz_mOEiyFHzk^b5ZhfAbfXx-@2O#cl7u?b{Pbwup8;im5ed!ba}jTm)HF1Y#>*w7 zr9B$Ms2LO0H8tze+e=@+Y6UbLEjTe47aD%8%~Ag}+X;Z7u}QEeA&T~9oNq@pe@vvm z2)e}70rz=JsPs}OtfN`r<%X>9XHHR$V3ZLbmBEN%HW_QpIG(!T#A2|{iUelrnIDCj z!;?2KF_E$SF-3PLQwOOBPYflof9~mapW+}Pps8#9H$U3fc(3-qW#4ZKI@ofuva*81 zsrJrsyNq+16`aUYpz}a~sO1)13<=`Vf605Dyz-{6?{;i(9vmtGgOR$r;LoVLy*g6| zFS=sO6#1KVfNMH4Gc&*dG!WA91XKxQ@C~@GZq7CT4X{D&xc{7~D?b@a z*P>HUP*C=q>iQ{2P1$JYS?9YpD6wF8AO-w+{J+2ZK<9XR%34YSM7yC$$jQkuHZ&Z# z@^PutqQKIj+DlMX^>V&~3aPVmZhjsnDH#wLIMCl88yBbiaCByIks7kKyUTm|a$|zu z@^{`AaUnkT3MF51ZO`Y=pZBK%nMYRU=Y`nmA193Kc0N+E&*Uz9sO9Th5gvYyOoO_8 z`yxQ(ln&!u&4iz-N^)|yEi4qTTnVXF6|k(Vs=}qEz1FoyqYwWqk}M>LCTsnHssU{4 zCG>N&R7gpwvaF1C21fg4^Je!xsdw} zWq~e~NbRI%;7C51fB0GjQ3w>+SBZ4Ms4~FI_H-8j43Ix(l?)WT@{Wq@So-JM+Dtqi zj8j!p`!EC@iVc4NE2S5OID%`jGqv3%d~_D606NJ-$PLCLDf{|#dGE=X7M&Rq2{JAi z!$Gv<5w@ITH=>&bsv`L8#DAd_`^!sJ3`}FGVtxmH(!*q<1kn*sHE?luPPWYAAZqip zSj@3^wI%VlwYI+Q;re|6_n=P_$iyl_ll^H-JP%Ts zwPVrS{taLv|IIr#HkXB>w9?bl0imz`{ORgtL_^?{z%}>%m?$AV-3xkdchtrI;1 z*`P$qyQDD5)U}nqH^uej4@=xmOx}XuzvM+@4>KO#1O^u<1tO@asmI2~?xh%s25!_W zb8&IClV{c*=bL{3oc{awtz4q8q$_|9;=@=ImJP%R2`=@C3{u;B@0# zw}>Yur6FPV(F(E>&PMg3asR{?p3dUd7#0@R+uIAX`WT;(aPgYsdWTYgeZ_;n`V6Sn zl)kit{rc8;hA@71X6Pp*QgHQ(SJ^9b$%^vwG)z zCdXdpY!Qb7BKAHF8p)JO(Tp7HWxnDTD;rx(UHsP(S2<)w>hpFm0Agxty46U_Pe&C7lCZF_02Igw3d0-t?Ay>e zUnRcRy-s$~A9C$wa0YM1Ombc#grhF-QfBQdt{&pFlCUo^KYtGJmJ$L~ zASi*dvN8bbVJ8=wf>)v$~WNwmx0$wT_4CDnGu!1-PD~f)CvQD}z=hn!S&%W1Jju6+xC6 z+@RV-At{Qi+~;Sz4B4|nIXOASSYrS}zBCXi#SxA&3gI6J{WGstQ7?wrx(%6LRjui+ zy02YF7Bwxa?3@@@>^|rwsmfWR%zFMUr~hEMsRR@As)#OM`RoPbBpUzlW^Cl-rPb~% zr!!VZ^@4(ut)A*y8oR=UYY@V4@S8*&>$SHEt|rC)%o6na9Qd)!qJV# zhLCq;I~;pS3p#np3UdAFs@ta`0s12bRC%)~XTmRMXQxim0wOQupJz43$A(lM(ncO9 zh7VEWGNK&acSLJXMdYATuFK!DFI80P_zE&8DJflGW;U~;Dc!w#Y$$cr-bjk;i;>?y zkWhy?J5AtLu4a2vX(_&a>IM`CkeMbX%s1Uwta@HyRF?@cSLWQj1^Yp=fxhq-)AcAa zeSSg$9AIv49uXOd4hWcPz+jBslC4c98`J~$3bV5vJUpcL(hxAt6qPU<*%axs7k+tG z#dj8sOK+<)KU8n$c>i#iofVDr&2S})Awfc62-$^cYVk>5W>q2*Q5PS&KP)dT3ie_h5VYEx9~sa zMSpdcVDK3kvBwgZZ@MKH1{uf5|7R|UY{y@^Z%v3l1XT-;jPhb) zv`97z#gU#>lq5TSjlCv+5rZ=2JlIz3Yw5x^L=U}NR|5|(?+NJTZ_aXgqLklliWxxK mdC_<&-Popp_?^PuGm6q#uSD2L1q!?yf#}~fhJVy?4EsN}vZG@F diff --git a/collects/redex/private/bmps-macosx/metafunction.png b/collects/redex/private/bmps-macosx/metafunction.png deleted file mode 100644 index 5eb6cdbeffbaa9e4488ac3e2e9f6afd316a1eb7a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1076 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 diff --git a/collects/redex/private/bmps-macosx/reduction-relation.png b/collects/redex/private/bmps-macosx/reduction-relation.png deleted file mode 100644 index 1da77851c26e875dbfd20794e8aa37abe62f8493..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1801 zcmV+k2ln`hP)oL+}q~%Y&ZxemM7X&pii_t5Wy=zWAKS-{X1TXYj(~ zVIYLyFE9+_a5(<>$B!S;(b3V-(GUjYT7sWHe}-8b33E|k5B)-Oia*=$-d9$Yiw*>xpL*FPoE41!uzJC3R5PJ0J(cZm#>9yV6 z-IbMf?%ZhrjuF+DxKp`igG)Y;joR4Rj+^Con6nEn0z0)c?RU;qF)1^} z9*<{ma8NFnhcIETBR1GOi(E+U&f2wWIUJ75jA4LJo%`Gcywa_S3~J3Bik zCx`fy@%en^<>ed>$7;0_hC-nrn&l6E87h^ks;Y_{{9;%D@b>N7lP6EEU%wszSS(g) zX(^Y>#W3tQzp4QMfc#zd*WaB50K0eZzIpQ|lgZ4@&6UYyQBhIn&!7MGOZgAN1c3YZ z@2l17yLa#I*s+7p=jZ3=zj^Z}blJ?z%#$Zi5)%{6X7kghPq%K}Iyg8;*GwjpR4Uc$ z^#EWr8p-n)ozI^?>vTGuPFGP;v49;dCQJZ`kB`4~>z2deXm4*XDJgmJ;)Oz?pifm~ zf=%QUf(_Yp0#5C}9j47@d+^`^LWslR?A*EY>eZ`XzI=&^i3#{G3kvj!oKCdu*$WuF;&HlH0h#X9@SiE`j zW{pNOG&BSNIF9S}`d6=BWo2cBuB1=oZnxWDFi_@r`jAc6f=%te9VUy#s;{s2`Fu%9 zNeKxFOP4M!D=Vw0s5pH1aIl)^&!0=BQlHP4nwom>;K9<;QYMoL01XWd`}gmE_Usv1 zj*E*+Nl7U#E+(9ST3%kB!{Io7{CHhm-T3%8m&=XJX8$!T0NA*3V@F5Fz`($_Z{NgX zu|OaQU87VgTU%S>;^F|{`t|EGGc&|7?e%)o($Xm9 zl%ph|#$YhWtr;C1wOA}xt95E>iU=04$NBU36dH`4o}S6cNdRE8*~A0SO`A6Hc)W-% r%Wk(14-b=Xnw*@xV#SJx-jvQCDjvs}SOm{T00000NkvXXu0mjf7chxx diff --git a/collects/redex/private/bmps-macosx/superscripts.png b/collects/redex/private/bmps-macosx/superscripts.png deleted file mode 100644 index 69484218f2decdc0365848277dc928f7cc4c18c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 944 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≻cyrZhlDoHSYdX%-Abim7zQG$sydxcDNFmzt#$YNeMM1Ls}%q&mrG64 x%H=Y3dcT}br}swFXf&v^vx!DpKZq3l;0MDPgqgq^{l5SJ002ovPDHLkV1jVP>wN$K diff --git a/collects/redex/private/bmps-macosx/unix-language-nox.png b/collects/redex/private/bmps-macosx/unix-language-nox.png deleted file mode 100644 index a05ce95394ac8c60651378d72a98fca9a09db418..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3129 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 RW$;P>K>x6}s4@3V{SS=q43q!> diff --git a/collects/redex/private/bmps-macosx/unix-language.png b/collects/redex/private/bmps-macosx/unix-language.png deleted file mode 100644 index cb88a9a4d92e2ff3cf89d78687bca196cdd604f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5597 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 PEky01mQtC5Rmgt;9){&b diff --git a/collects/redex/private/bmps-macosx/unix-lw.png b/collects/redex/private/bmps-macosx/unix-lw.png deleted file mode 100644 index 708c9df4aa9e473580a6e096b6bcfceb06847b34..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1181 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 JN7&=Y{{a}I;I9Ax diff --git a/collects/redex/private/bmps-macosx/unix-metafunction-Name.png b/collects/redex/private/bmps-macosx/unix-metafunction-Name.png deleted file mode 100644 index b299b86abdddc528abe1b6087fcc97d092731cdc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3738 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 diff --git a/collects/redex/private/bmps-macosx/unix-metafunction-T.png b/collects/redex/private/bmps-macosx/unix-metafunction-T.png deleted file mode 100644 index 05edef44444f9588e0589d0410e6f3951feb2ff4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4027 zcmZ8kbyyT#`yM4F1%q(ucmYM4ml9mML0CdsVg;!M1SM8rr5pA|TpEc5WJx8ZL~;oM z38iy+3F&6xH-5i=zUzDDnwc{*=Ug*$p8L7)`$QY+YtT}$QUL%!tEH)G1fD;EyB_6r z@E9Wg6TF~DX{kbCuQRu@0e0Fb#V;Ud(b(amTGt~C zkeh3T5Bh@}4Lw13@M4b?^^Dohj#9;?lp;h7*^VM1xx+^le*MPMVrMJ>XlQ6SI5;py ztMW1?ztu^5*gO0PqwDAA7s1)n+j~Q{xUB3ShbthYs;UZkezdTAa&+W(dUWx7f1{#R zTJld66cpT~42!seVn?4b`ymjMb)FpCq0=m^tk(e;42Gazo;)4J8dzIfPn26z1J16l zXosO~lGohHQL0*jf%0^bJ}+Npe$`Bsry=K2QfkFwvAMZ+rQPEDNxPW*+S>6SKW?LP zhZN6gfXbj#Z(3SfB_$=v^UX~+VPRnvl@2M_aR3mye}7BTGlZV7J4Sy$}e22MMAFKeO})#w{GH}GO>#y7xBT9QQsvcB`qi_0_VoU+#GC2)z*FftY=`Lk)Wfk zZDnPpczNQ`JLCSdnom*^=A4SbV3vt?nhBfj*MO+_cU zJUDQE@d6HqU!E)_8l8%Z{)r^t0_JMbJR}`mWd4T_BV%KH(cmyPV16)5zNDmNczBrf zI#kGZcXwA=$y?w6CnGk@w$Qo@sjJv=b$KKStx-yiCvu!q2ZZCWh*5yMU08y(n{dc(|Liyokv5 zLPzA$(UG%G7mAD;{072Mj#8DF&b7!6uUD@$YA2LcRKN`4@%THd$S$6MMBP%hk;}_B zK0f=@Ob;n>$o4DT<0#=I5*E=)`s`(9qNK#A@2v#CU#l^h`1A}R3Xke4~qe10r`9^YS@IR6fg+F|s4c5p58Bs&b_oLGSADmaI zMy~l6!vn^VSqj<1w*wI7Vof#(RzIt{x;o`(py!+HtIuCgMO^P}zN8}Rv!AXoF{yc` z6j-g#N5#b{1RNA^s-SNSo}A30pYGbazt{Y$f<+~%&X@;hlKiIW?3~+(KBzt@I;P?y zv1@1J*va3Q)AlRzdiL>`#+Mt7lY5w|vdmT+iGF*sMxg*7x5YR2TyPfa>q?M|Rdx6v zg@r}?xnGqmL^i>Yd`D*5>@sxjT_%I&r71#HT^%fpjEsyN8L#Vrp{Xg{!y^HPvuU<4 zHufQ&9a=4YG^+rCWoB)S94*qD9!LT4wKY|T*5nlt5#iv-nX2<70aDOtE=um3lptht z-kg=Bq!=L(qUlwJgQmm-*G_v+pFI#Vx+;}acWZg;AYF|2NRjG{3<$CeSVfyag<8tT zH%zTsd`Sc$4y`{kkAf|70$IX?F6q}>xjeC!!t?;3Go#Qt(>OZttE=~g4b0H_YQF6z zTJUSWA+d1Mi;5eT){CP(Iw)-!ojgw;oQSEoz~L2r*Z;v{pBox}UmeJ}2Ec?4!D0kC zL^BnQHny>0x9?p*^x^T_v(1)IpJFmH@Fu@i)zlsZ9IS!;LGGHWeD=1rRVho~KwrPe zs02bsINxrqsHh;kX@C}2eb>P?z3T3bx$>Pk{yg@iJrC)WYMB`CVZ-14dMd-avh$x!0e6V)B)-dWq(9fA{ zIGz|)QYDMLl;!%pQ1cfMLPCapIBwgTnQoK(&g3LN$U4a>YkWcvRyjqJ59So6^^2zi&&_wl?J&t)6~R-t17MyUX!1nFC{5yWo?ZsD@#vL z2Y{%az>RU7wzf790#?`E*v@8Y>5OI{f<7A?n>Z#jHI?tzdnWSOF}S zK(0{FH_sP&RRW?7qh>FaUrQ zs;;j7A>RL4d;$RcAXVfbx*WMJKh{eH0A_X;7M6P(n_E?Y7kC(0|&fE%FG@%0^t6zq$p3@p`e{ zyZ2|tK{hKExRgOd${(UT?VaH8uFlTg@zNn~Q4I}J%iVYTo~Wnh=A1R1ZEZlfG7AUC zP*2a=_I7LVRZDz4?SyXhbC!tQI-BpyD=R;zrl0)=~x z55H(nN?kcS++b&C2NeU<6hT2j`>QYjaCLR%!ak$Scix{5Fhp1WSt5Ttj~ z7fzvJZ9SvGfeh+88p(qFtdlWV*x|H$GOCQ+mKo7~@^Gobxxkk8$Y__;B5qJ#OtL2ZjRw+&3$K z9T>=iEi5bqMIN+fyo@E))#Bpfd$Y}f2H6Vj3y2#xZgeMd%+)-nk5&a8LO5sfr%x~g zgT%UC(6A^gD<_qQu~Ikp9A3ju*SRq>!<|3Io?4|`28yI}L@ zhMt^HRC&!g6=VyBJbVA9%3_n^F0|F_S&?3i$spTAL9+Zcfz_^PLqMglNSs2{Zy zp&jz2#(o@C%=Op(96Kv}+io9yM5ekXGU3iJWh&s@*zYr@g#35u{t58SOtJY8q977; z@yeY~zUlXg_h(cj=UZFy*g}@dVnz8x$sr55=ibQOE_e+Ri3F`eMSgzAl)=?}$Z6^P z+2*u?-ki}E^}C@sHY1>IxOi(?jfmWlXGlp&0RS+U3kwUus$Eyb?u|9_Zo;;Xl)^b; z65TZRFPoI*z|AjDYsvjYQ;t8=EBe;zwl(z8MIJCYwN7$=11&_ zuMmjGyot<=AO7=@n%k$e*Sg8i$E`fZWnjA(j1OmOmrfvzfpVi+rXY_B(m?f8MBBS`9hPcCCQXj~LR-T@opwXtM zrx(Y7%&0KNlV09a>7`z1WMX2n^5q`(F(s+8udkH%msi_1VDj2?D8Gh0J3(5Rf(Q%> z3QAfkE-s#(oh>abEnyouaI_$BW$`jNKY23DF(LB6n5AobXMk5xQBh1xtVe7QZ3)_U zQ5p%1E(ZrkL8f-$;_gX(eSKbDUdG>^i->x#DmYCT7#MC-g?B8piCV#61z7CylxM3~ zMiB9E;-wsMZv_v9Lb>A_zWDEx1M{1kR%T`z`NPvQGbAJ=WY1f_eN%-{Nl8h4cs@8X zV#LOl6&iZ2WOeG8^m1NPM~8(Gc)@X16@#Du2{Y;s5_r1-Z5(R|8L4AfUtE73*5-aQP@9(?2 zyOUMqH8q_pQqhpBeCw?F>87F4otX)V_MA8;Yn_Z#&fA=BK&$7|($Rrxm5`WdT=D~y zBcaqrCp-tHM3um$CXNRH)nzVRdHLOE{juf@#r<-*pkYnYEQpGtWck%X-yfn-V6T=7 zl0_sP8>5Bq;kt=Osk|Z`yMm0UXq(<-JXciGdBQSRIH!P^7(>J}mc1nJ_|ef(riWJb z&ch#Wu*RyB`?~}L1Q;8SHuw-YDPMq@_w@V=-8*uIJZ7+R0W*k@u`)Mj_6B)BrhBP@ zo}#i%F|w&C(8!3<8^XW<eh>>NJ=J?Y&}>-?OUvX@iRXiq$kn8G z;BV{b;P3tI!8u1Y*w^=~Iq>*f6Y}^bBLpNlP?0-3J9}K9(9np8uAUxBZwn(Mdl#1* z(4^Q{{P*wQWA5CSl#+^%i=%_c03ADPYtFj5aq;osVj-=r?s!P)s(%7p1cYs97K@3X y86dj+#)!}kl#0NA;O<6E`Tu_Y&*C@r>N+Nu*X&JC2?|`416peOs^!XdsQ&|reY{x! diff --git a/collects/redex/private/bmps-macosx/unix-metafunction-TL.png b/collects/redex/private/bmps-macosx/unix-metafunction-TL.png deleted file mode 100644 index 378e0fd05bd9cc4e62bf22865beca217e8c10ff1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4547 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 IqJ|3o7vKN$#{d8T diff --git a/collects/redex/private/bmps-macosx/unix-metafunction-multi-arg.png b/collects/redex/private/bmps-macosx/unix-metafunction-multi-arg.png deleted file mode 100644 index 6753b06610c91138ac899994f5552dbcce5ed2c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7208 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 diff --git a/collects/redex/private/bmps-macosx/unix-metafunction-subst.png b/collects/redex/private/bmps-macosx/unix-metafunction-subst.png deleted file mode 100644 index 3f00d4671a50c2fb46f2794e82bb80ab9502099b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5287 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 BAZY*q diff --git a/collects/redex/private/bmps-macosx/unix-metafunction.png b/collects/redex/private/bmps-macosx/unix-metafunction.png deleted file mode 100644 index b9d908c4acc0117dbac44ffbcd52f880a3c48ed5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1158 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 diff --git a/collects/redex/private/bmps-macosx/unix-reduction-relation.png b/collects/redex/private/bmps-macosx/unix-reduction-relation.png deleted file mode 100644 index d2196e527cf0deb34f2c0ac4abebf33bd96d756a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1956 zcmV;V2V3}wP)k?gBetft?wGce{5p+kAc5=O6Dme$ROx&-3^^ z?jA9O5QGRMocW%>|DRBa15T*K0Vh=AfDns=+TUf49Z0_5kj|b-xdf2R;$%(3YxyBr$;On1As!I zKnUgL<_ZJ?l}d#WG8hbDVPP{fGhXu;3{K_%>+Tz*47dP;dz>S>XVX^va+(yo;_PrQ?qK-s;sOm z(!XfYB2rJwV6)lw@87T0YRT;%6%`c|6Vun%#}WbnGMVh<%a`PHYisM;wQJ+z;@Cs5 zKtc^c8&9j#Dn02>=%^TsV31GltyLa#QIZA+FuP*=qLa4mFT&Yx2d*0m~9UaAS zd}L&VG!+U(VPPTdcZ3#hu~@ck+h(;|34(}^kKem@FZHbl4;}~vf*(JA&@$Y;dl$#? z(a}+a(6?{j($dn%tCA&zBsn=bEG+EFlPB&@_K-gd_;L6ELg>Yd7ZDK=4u^wuxtk>= zCGNL&OG^u%&;R`SvwI46{h2doVq;_DCMx&uQ*+c#y)E@OABfsp~v*+BobCj26`otgo#KeR| zA{iSS^FM8HLVg>6>WionI~)$RTCLaXy_!Dpsdu?t85tSf-Q9jB3|dGK_}4mo`t*s# z^a+dJ<#JgpmRV&BPDl{&bsL75Goe@V0Vh=AfDKBdN~PpOM@PpzPB$|%GbJSj!!WsAPCj&Xbe4$*Ck&)fq-D}pYVF~N) z?Tw3z!!S&#R04ontriM}>FMcAdYw)u5{Z^BT}r+Z>+0%CNJx-KBwk-YQ*?E8sZ^@; z^mLg_rqya^`?LL5KnNW;Z~((FwOW1S#toCn^EiGNKVueg5yLt1b&$VId9x=hx2l5I_t7*Z30|1A^(P%UpjmG724Gaui zzka=-pddUveEat8?7?MaWeSC2-MV#Gu3Ygs64eLd^Z8X(Rh^xkEMltFbnV(T(nGbH z794nAU*F}+mm3-y0D!~c$mMdmT>jz1hvw#HpC$I%Jz|2X59Ae=R?~umBNPf78yg1) z2i?7PyPfRgvcS|mVuGm;kbEiTeohVK7G2fveINSg@=dB<#N4VpPZb` zv?`UAl{%e{$K%=U_J)QAyWL)2U;p#x&$_z0*RNl%U%#Hu=X(v5$z)QgG&MDq@-XSu zYPD9Y&CJYU_ z|I#WFi3o!D{{6d1B&w*WVA@baLqkTRap%sRey;9p^#G8WnQ66J&1Q2 (number_1 word) - (,(+ (term number_1) 1) word) - inc)) - '(1 word) - #:pred color-range-pred)) - -(let () - (define-language empty-language) - - (define (last-color-pred sexp term-node) - (if (null? (term-node-children term-node)) - "green" - "white")) - - (traces (reduction-relation - empty-language - (--> (number_1 word) - (,(+ (term number_1) 1) word) - inc) - (--> (number_1 word) - (,(* (term number_1) 2) word) - dup)) - '(1 word) - #:pred last-color-pred)) diff --git a/collects/redex/private/config.ss b/collects/redex/private/config.ss deleted file mode 100644 index 721ab32da1..0000000000 --- a/collects/redex/private/config.ss +++ /dev/null @@ -1,5 +0,0 @@ -#lang scheme -(provide set-show-bitmaps? get-show-bitmaps?) -(define show-bitmaps? #t) -(define (set-show-bitmaps? sb?) (set! show-bitmaps? sb?)) -(define (get-show-bitmaps?) show-bitmaps?) \ No newline at end of file diff --git a/collects/redex/private/core-layout-test.ss b/collects/redex/private/core-layout-test.ss deleted file mode 100644 index b1edc2bc72..0000000000 --- a/collects/redex/private/core-layout-test.ss +++ /dev/null @@ -1,82 +0,0 @@ -#lang scheme/base - -(require "core-layout.ss" - "loc-wrapper.ss" - "lw-test-util.ss" - "test-util.ss" - (lib "struct.ss")) - -(require (lib "mrpict.ss" "texpict") - (lib "mred.ss" "mred") - (lib "class.ss")) -(dc-for-text-size (make-object bitmap-dc% (make-object bitmap% 1 1))) - -(reset-count) - -(let ([content - (list (make-lw 'x 15 1 35 0 #f #f) - (make-lw (list - (make-lw "(" 15 0 35 1 #f #f) - (make-lw 'a 15 0 36 1 #f #f) - (make-lw 'b 16 0 36 1 #f #f) - (make-lw ")" 16 0 37 1 #f #f)) - 15 1 35 3 #f #f))]) - (test (find-enclosing-loc-wrapper content) - (build-lw content - 15 1 35 3))) - -(define (replace-pict-tokens x) - (let loop ([x x]) - (cond - [(line? x) (make-line (line-n x) (loop (line-tokens x)))] - [(pair? x) (cons (loop (car x)) - (loop (cdr x)))] - [(pict-token? x) - (copy-struct pict-token x [pict-token-pict 'pict])] - [else x]))) - -(test (replace-pict-tokens - (build-lines - '() - (normalize-lw - (to-lw - ,(term - (a b c)))))) - (list (make-line 0 - (list (make-spacer-token 0 2) - (make-string-token 2 1 "(" 'roman) - (make-string-token 3 1 "a" 'swiss) - (make-string-token 4 1 " " 'roman) - (make-string-token 5 1 "b" 'swiss) - (make-string-token 6 1 " " 'roman) - (make-string-token 7 1 "c" 'swiss) - (make-string-token 8 1 ")" 'roman))) - (make-line 0 - (list (make-string-token 0 0 "" 'roman) - (make-pict-token 0 1 'pict) - (make-pict-token 1 0 'pict))))) - -(test (replace-pict-tokens - (build-lines - '() - (normalize-lw - (to-lw - ,(term - (a b - c)))))) - (list (make-line 1 - (list (make-spacer-token 0 5) - (make-string-token 5 1 "c" 'swiss) - (make-string-token 6 1 ")" 'roman))) - (make-line 0 - (list (make-spacer-token 0 2) - (make-string-token 2 1 "(" 'roman) - (make-string-token 3 1 "a" 'swiss) - (make-string-token 4 1 " " 'roman) - (make-string-token 5 1 "b" 'swiss))) - (make-line 0 - (list (make-string-token 0 0 "" 'roman) - (make-pict-token 0 1 'pict) - (make-pict-token 1 0 'pict))))) - -(print-tests-passed "core-layout.ss") diff --git a/collects/redex/private/hole-test.ss b/collects/redex/private/hole-test.ss deleted file mode 100644 index 7536526d5a..0000000000 --- a/collects/redex/private/hole-test.ss +++ /dev/null @@ -1,32 +0,0 @@ -#lang scheme -(require redex) - -(define-language tl-grammar - [v (cont (hide-hole E))] - [E hole - (v ... E)]) - -(define test1 - (reduction-relation - tl-grammar - [--> (in-hole E_1 (explode)) - (in-hole E_1 1)])) - -(test--> test1 - (term ((cont hole) (explode))) - (term ((cont hole) 1))) - -(define test2 - (reduction-relation - tl-grammar - [--> (in-hole E_1 (explode)) - (asplode E_1)])) - -(define-metafunction tl-grammar - asplode : E -> any - [(asplode ((cont hole) hole)) - okay]) - -(test--> test2 - (term ((cont hole) (explode))) - (term okay)) diff --git a/collects/redex/private/keyword-macros-test.ss b/collects/redex/private/keyword-macros-test.ss deleted file mode 100644 index ab3ddc8dbb..0000000000 --- a/collects/redex/private/keyword-macros-test.ss +++ /dev/null @@ -1,46 +0,0 @@ -#lang scheme - -(require "keyword-macros.ss" - "test-util.ss") - -(reset-count) - -(let* ([formals `((#:b . ,#'1) (#:c . ,#'2))] - [parse - (λ (actuals) - (map syntax-e - (parse-kw-args formals (cdr (syntax-e actuals)) actuals)))]) - (let-syntax ([msg-src - (syntax-rules () - [(_ expr) - (with-handlers ([exn:fail:syntax? - (λ (exn) - (values (exn-message exn) - (exn:fail:syntax-exprs exn)))]) - (begin expr (values 'no-msg 'no-src)))])]) - (let () - (test (parse #'(a #:c 3 #:b 4)) '(4 3)) - (test (parse #'(a #:b 4 #:c 3)) '(4 3)) - (test (parse #'(a #:c 3)) '(1 3)) - (let*-values ([(kw) #'#:b] - [(msg src) (msg-src (parse #`(a #,kw)))]) - (test msg #rx"a: missing argument expression after keyword") - (test src (list kw))) - (let*-values ([(arg) #'1] - [(msg src) (msg-src (parse #`(a #:b 1 #,arg)))]) - (test msg #rx"a: expected a keyword") - (test src (list arg))) - (let*-values ([(kw) #'#:c] - [(msg src) (msg-src (parse #`(a #:c 1 #:b 2 #,kw 3)))]) - (test msg #rx"a: repeated keyword") - (test src (list kw))) - (let*-values ([(kw) #'#:c] - [(msg src) (msg-src (parse #`(a #:b #,kw 3)))]) - (test msg #rx"a: expected an argument expression") - (test src (list kw))) - (let*-values ([(kw) #'#:typo] - [(msg src) (msg-src (parse #`(a #:b 3 #,kw 4)))]) - (test msg #rx"a: invalid keyword") - (test src (list kw)))))) - -(print-tests-passed 'keyword-macros-test.ss) diff --git a/collects/redex/private/lw-test-util.ss b/collects/redex/private/lw-test-util.ss deleted file mode 100644 index fb6e335dc4..0000000000 --- a/collects/redex/private/lw-test-util.ss +++ /dev/null @@ -1,43 +0,0 @@ -(module lw-test-util mzscheme - (require "loc-wrapper.ss") - (provide normalize-lw) - - (define (normalize-lw lw) - (define-values (min-line min-column) (find-min-line/col lw)) - (define (normalize/lw lw) - (cond - [(lw? lw) - (make-lw (normalize/e (lw-e lw)) - (- (lw-line lw) min-line) - (lw-line-span lw) - (- (lw-column lw) min-column) - (lw-column-span lw) - (lw-unq? lw) - (lw-metafunction? lw))] - [else lw])) - (define (normalize/e e) - (cond - [(symbol? e) e] - [(string? e) e] - [else (map normalize/lw e)])) - (normalize/lw lw)) - - (define (find-min-line/col lw) - (define min-line #f) - (define min-col #f) - (define (find-min/lw lw) - (when (lw? lw) - (set! min-line (if min-line - (min min-line (lw-line lw)) - (lw-line lw))) - (set! min-col (if min-col - (min min-col (lw-column lw)) - (lw-column lw))) - (find-min/e (lw-e lw)))) - (define (find-min/e e) - (cond - [(symbol? e) (void)] - [(string? e) (void)] - [else (for-each find-min/lw e)])) - (find-min/lw lw) - (values min-line min-col))) diff --git a/collects/redex/private/lw-test.ss b/collects/redex/private/lw-test.ss deleted file mode 100644 index 109b17c9a5..0000000000 --- a/collects/redex/private/lw-test.ss +++ /dev/null @@ -1,282 +0,0 @@ -#| - - DO NOT TABIFY THIS FILE - -|# - - -; -; -; ;;;; -; ; ; ; -; ; ; ;;; ;; ;; ;;; ;;;;; -; ; ; ; ; ;; ; ; ; ; -; ; ; ; ; ; ; ; ; ; -; ; ; ; ; ; ; ; ; ; -; ; ; ; ; ; ; ; ; ; ; -; ;;;; ;;; ;;; ;;; ;;; ;;; -; -; -; -; -; -; -; ;; ; ;;; -; ; ; ; -; ;;;;; ;;; ; ;; ;;; ;;;;; ;;; ;;; -; ; ; ; ;; ; ; ; ; ; -; ; ;;;; ; ; ; ; ; ; -; ; ; ; ; ; ; ; ; ; -; ; ; ; ; ; ; ; ; ;; -; ;;; ;;;;;;;;;; ;;;;; ;;;;; ; -; ; -; ;;;; -; -; -; -; -; ;; ; ;;; ; ;; -; ; ; ; ; -; ;;;;; ; ;; ;;; ;;;; ;;;;; ;;; ; ;;; -; ; ;; ; ; ; ; ; ; ; ; ; -; ; ; ; ; ;;; ; ; ; ;;;;; -; ; ; ; ; ; ; ; ; ; -; ; ; ; ; ; ; ; ; ; ; ; -; ;;; ;;; ;;; ;;;;; ;;;; ;;;;; ;;;;; ;;;;; ;;;; -; -; -; -; - - -(module lw-test mzscheme - (require "test-util.ss" - "loc-wrapper.ss" - "lw-test-util.ss") - - (reset-count) - - (test (normalize-lw (to-lw ())) - (build-lw (list (build-lw "(" 0 0 0 1) - (build-lw ")" 0 0 1 1)) - 0 0 0 2)) - - (test (normalize-lw (to-lw "x")) - (build-lw "“x”" 0 0 0 3)) - - (test (normalize-lw (to-lw "#f")) - (build-lw "“#f”" 0 0 0 4)) - - (test (normalize-lw (to-lw #f)) - (build-lw "#f" 0 0 0 2)) - - (test (normalize-lw (to-lw/uq ())) - (make-lw (list (make-lw "(" 0 0 0 1 #t #f) - (make-lw ")" 0 0 1 1 #t #f)) - 0 0 0 2 #t #f)) - - (test (normalize-lw (to-lw (a))) - (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)) - - (test (normalize-lw (to-lw (a - b))) - (build-lw (list (build-lw "(" 0 0 0 1) - (build-lw 'a 0 0 1 1) - (build-lw 'b 1 0 1 1) - (build-lw ")" 1 0 2 1)) - 0 1 0 3)) - - (test (normalize-lw (to-lw (a b))) - (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)) - - - (test (normalize-lw (to-lw (a - (b c) - d))) - (build-lw (list (build-lw "(" 0 0 0 1) - (build-lw 'a 0 0 1 1) - (build-lw - (list (build-lw "(" 1 0 1 1) - (build-lw 'b 1 0 2 1) - (build-lw 'c 1 0 4 1) - (build-lw ")" 1 0 5 1)) - 1 0 1 5) - (build-lw 'd 2 0 1 1) - (build-lw ")" 2 0 2 1)) - 0 2 0 3)) - - (test (normalize-lw (to-lw (abcdefghijkl - b))) - (build-lw (list (build-lw "(" 0 0 0 1) - (build-lw 'abcdefghijkl 0 0 1 12) - (build-lw 'b 1 0 1 1) - (build-lw ")" 1 0 2 1)) - 0 1 0 3)) - - (test (normalize-lw (to-lw ((a b) - c))) - (build-lw (list (build-lw "(" 0 0 0 1) - (build-lw - (list (build-lw "(" 0 0 1 1) - (build-lw 'a 0 0 2 1) - (build-lw 'b 0 0 4 1) - (build-lw ")" 0 0 5 1)) - 0 0 1 5) - (build-lw 'c 1 0 1 1) - (build-lw ")" 1 0 2 1)) - 0 1 0 3)) - - (test (normalize-lw (to-lw (aaa bbb - (ccc - ddd)))) ;; <--- the ddd should be lined up under the aaa - (build-lw (list (build-lw "(" 0 0 0 1) - (build-lw 'aaa 0 0 1 3) - (build-lw 'bbb 0 0 5 3) - (build-lw - (list - (build-lw "(" 1 0 5 1) - (build-lw 'ccc 1 0 6 3) - (build-lw 'ddd 2 0 1 3) - (build-lw ")" 2 0 4 1)) - 1 1 1 4) - (build-lw ")" 2 0 5 1)) - 0 2 0 6)) - - (test (normalize-lw (to-lw (aaa bbb - (ccc - ddd ;; <--- the ddd should be lined up under the aaa - eee)))) ;; <--- the eee should be lined up under the ccc - (build-lw (list (build-lw "(" 0 0 0 1) - (build-lw 'aaa 0 0 1 3) - (build-lw 'bbb 0 0 5 3) - (build-lw - (list - (build-lw "(" 1 0 5 1) - (build-lw 'ccc 1 0 6 3) - (build-lw 'ddd 2 0 1 3) - (build-lw 'eee 3 0 6 3) - (build-lw ")" 3 0 9 1)) - 1 2 1 9) - (build-lw ")" 3 0 10 1)) - 0 3 0 11)) - - (test (normalize-lw (to-lw ([{}]))) - (build-lw (list (build-lw "(" 0 0 0 1) - (build-lw - (list - (build-lw "[" 0 0 1 1) - (build-lw - (list - (build-lw "{" 0 0 2 1) - (build-lw "}" 0 0 3 1)) - 0 0 2 2) - (build-lw "]" 0 0 4 1)) - 0 0 1 4) - (build-lw ")" 0 0 5 1)) - 0 0 0 6)) - - (test (normalize-lw (to-lw ,x)) - (make-lw - (list - (make-lw "" 0 0 0 0 #f #f) - 'spring - (make-lw 'x 0 0 1 1 #t #f)) - 0 0 0 2 #f #f)) - - (test (normalize-lw (to-lw ,@x)) - (make-lw - (list - (make-lw "" 0 0 0 0 #f #f) - 'spring - (make-lw 'x 0 0 2 1 #t #f)) - 0 0 0 3 #f #f)) - - (test (normalize-lw (to-lw 'x)) - (make-lw - (list - (make-lw "'" 0 0 0 1 #f #f) - 'spring - (make-lw 'x 0 0 1 1 #f #f)) - 0 0 0 2 #f #f)) - - (test (normalize-lw (to-lw ,(term x))) - (make-lw - (list - (make-lw "" 0 0 0 0 #f #f) - 'spring - (make-lw - (list - (make-lw "" 0 0 1 0 #t #f) - 'spring - (make-lw 'x 0 0 7 1 #f #f)) - 0 0 1 7 #t #f)) - 0 0 0 8 #f #f)) - - (test (normalize-lw (to-lw (term x))) - (build-lw - (list - (build-lw "(" 0 0 0 1) - (build-lw 'term 0 0 1 4) - (build-lw 'x 0 0 6 1) - (build-lw ")" 0 0 7 1)) - 0 0 0 8)) - - (test (normalize-lw (to-lw '(term x))) - (build-lw - (list - (build-lw "'" 0 0 0 1) - 'spring - (build-lw - (list - (build-lw "(" 0 0 1 1) - (build-lw 'term 0 0 2 4) - (build-lw 'x 0 0 7 1) - (build-lw ")" 0 0 8 1)) - 0 - 0 - 1 - 8)) - 0 0 0 9)) - - (test (normalize-lw (to-lw ''x)) - (build-lw - (list - (build-lw "'" 0 0 0 1) - 'spring - (build-lw - (list - (build-lw "'" 0 0 1 1) - 'spring - (build-lw 'x 0 0 2 1)) - 0 - 0 - 1 - 2)) - 0 0 0 3)) - - ;; this one seems suspicious: why does the second comma start at 1 instead of 0? - ;; rendering seems to work, however, so we'll go with it .. - (test (normalize-lw (to-lw ,,x)) - (build-lw - (list - (build-lw "" 0 0 0 0) - 'spring - (make-lw - (list - (make-lw "," 0 0 1 1 #t #f) - 'spring - (make-lw 'x 0 0 2 1 #t #f)) - 0 0 1 2 - #t #f)) - 0 0 0 3)) - - (print-tests-passed "lw-test.ss")) - diff --git a/collects/redex/private/matcher-test.ss b/collects/redex/private/matcher-test.ss deleted file mode 100644 index 6866eae34a..0000000000 --- a/collects/redex/private/matcher-test.ss +++ /dev/null @@ -1,820 +0,0 @@ -(module matcher-test mzscheme - (require "matcher.ss" - (only "test-util.ss" equal/bindings?) - (lib "list.ss")) - - (error-print-width 500) - - (define (make-test-mtch a b c) (make-mtch a (build-flat-context b) c)) - - (define (test) - (print-struct #t) - (test-empty 'any 1 (list (make-test-mtch (make-bindings (list (make-bind 'any 1))) 1 none))) - (test-empty 'any 'true (list (make-test-mtch (make-bindings (list (make-bind 'any 'true))) 'true none))) - (test-empty 'any "a" (list (make-test-mtch (make-bindings (list (make-bind 'any "a"))) "a" none))) - (test-empty 'any '(a b) (list (make-test-mtch (make-bindings (list (make-bind 'any '(a b)))) '(a b) none))) - (test-empty 'any #t (list (make-test-mtch (make-bindings (list (make-bind 'any #t))) #t none))) - (test-empty 1 1 (list (make-test-mtch (make-bindings null) 1 none))) - (test-empty 1 '() #f) - (test-empty 99999999999999999999999999999999999999999999999 - 99999999999999999999999999999999999999999999999 - (list (make-test-mtch (make-bindings null) - 99999999999999999999999999999999999999999999999 - none))) - (test-empty 99999999999999999999999999999999999999999999999 - '() - #f) - (test-empty 'x 'x (list (make-test-mtch (make-bindings null) 'x none))) - (test-empty 'x '() #f) - (test-empty 1 2 #f) - (test-empty "a" "b" #f) - (test-empty "a" '(x) #f) - (test-empty "a" '() #f) - (test-empty "a" "a" (list (make-test-mtch (make-bindings null) "a" none))) - (test-empty 'number 1 (list (make-test-mtch (make-bindings (list (make-bind 'number 1))) 1 none))) - (test-empty 'number 'x #f) - (test-empty 'number '() #f) - (test-empty 'natural 1 (list (make-test-mtch (make-bindings (list (make-bind 'natural 1))) 1 none))) - (test-empty 'natural 'x #f) - (test-empty 'natural '() #f) - (test-empty 'natural -1 #f) - (test-empty 'natural 1.0 #f) - (test-empty 'integer -1 (list (make-test-mtch (make-bindings (list (make-bind 'integer -1))) -1 none))) - (test-empty 'integer 'x #f) - (test-empty 'integer '() #f) - (test-empty 'integer 1.0 #f) - (test-empty 'real 1.1 (list (make-test-mtch (make-bindings (list (make-bind 'real 1.1))) 1.1 none))) - (test-empty 'real 'x #f) - (test-empty 'real '() #f) - (test-empty 'real 2+3i #f) - (test-empty 'string "a" (list (make-test-mtch (make-bindings (list (make-bind 'string "a"))) "a" none))) - (test-empty 'string 1 #f) - (test-empty 'string '() #f) - (test-empty 'variable 'x (list (make-test-mtch (make-bindings (list (make-bind 'variable 'x))) 'x none))) - (test-empty 'variable 1 #f) - (test-empty '(variable-except x) 1 #f) - (test-empty '(variable-except x) 'x #f) - (test-empty '(variable-except x) 'y (list (make-test-mtch (make-bindings null) 'y none))) - (test-lang 'x 'y (list (make-mtch (make-bindings (list (make-bind 'x 'y))) 'y none)) - (list (make-nt 'x (list (make-rhs '(variable-except x)))))) - (test-empty '(variable-prefix x:) 'x: (list (make-test-mtch (make-bindings null) 'x: none))) - (test-empty '(variable-prefix x:) 'x:x (list (make-test-mtch (make-bindings null) 'x:x none))) - (test-empty '(variable-prefix x:) ': #f) - (test-empty '(variable-prefix x:) '() #f) - - (test-empty 'hole 1 #f) - (test-empty `hole - the-hole - (list (make-test-mtch (make-bindings (list)) the-hole none))) - (test-empty '(in-hole (hole 2) 1) - '(1 2) - (list (make-test-mtch (make-bindings (list)) `(1 2) none))) - - (test-empty '(in-hole (name E_1 ((hide-hole hole) hole)) x) - `(,the-hole x) - (list (make-test-mtch (make-bindings (list (make-bind 'E_1 `(,the-not-hole ,the-hole)))) - `(,the-hole x) - none))) - - - - (test-empty '(name x number) 1 (list (make-test-mtch (make-bindings (list (make-bind 'x 1) (make-bind 'number 1))) 1 none))) - (test-empty 'number_x 1 (list (make-test-mtch (make-bindings (list (make-bind 'number_x 1))) 1 none))) - (test-empty 'string_y "b" (list (make-test-mtch (make-bindings (list (make-bind 'string_y "b"))) "b" none))) - (test-empty 'any_z '(a b) (list (make-test-mtch (make-bindings (list (make-bind 'any_z '(a b)))) '(a b) none))) - - (test-empty '(name x_!_1 number) 1 (list (make-test-mtch (make-bindings (list (make-bind 'number 1))) 1 none))) - (test-empty '((name x_!_1 number) (name x_!_1 number)) '(1 1) #f) - (test-empty '((name x_!_1 number_a) (name x_!_1 number_b)) '(1 2) - (list (make-test-mtch (make-bindings (list (make-bind 'number_a 1) - (make-bind 'number_b 2))) - '(1 2) - none))) - (test-empty '(number_!_1 number_!_1) '(1 1) #f) - (test-empty '(number_!_1 number_!_1) '(1 2) (list (make-test-mtch (make-bindings (list)) '(1 2) none))) - (test-empty '(number_!_1 ...) '(1 2) (list (make-test-mtch (make-bindings (list)) '(1 2) none))) - (test-empty '(number_!_1 ...) '(1 2 3 4 5) (list (make-test-mtch (make-bindings (list)) '(1 2 3 4 5) none))) - (test-empty '(number_!_1 ...) '(1 2 3 1 5) (list (make-test-mtch (make-bindings (list)) '(1 2 3 1 5) none))) - (test-empty '((number_!_1 ...) (number_!_1 ...)) - '((1 2 3 1 5) (1 2 3 1 5)) - #f) - (test-empty '((number_!_1 ...) (number_!_1 ...)) - '((17 2 3 1 5) (1 2 3 1 5)) - (list (make-test-mtch (make-bindings (list)) '((17 2 3 1 5) (1 2 3 1 5)) none))) - (test-empty '((number_!_1 number_!_1) ... number_!_1 ...) '((1 1) (2 2) 1 3) #f) - (test-empty '((number_!_1 number_!_1) ... number_!_1 ...) '((1 1) (2 3) 1 2) #f) - (test-empty '((number_!_1 number_!_1) ... number_!_1 ...) - '((1 1) (2 3) 1 4) - (list (make-test-mtch (make-bindings (list)) '((1 1) (2 3) 1 4) none))) - - (test-ellipses '(a) '(a)) - (test-ellipses '(a ...) `(,(make-repeat 'a '() #f #f))) - (test-ellipses '((a ...) ...) `(,(make-repeat '(a ...) '() #f #f))) - (test-ellipses '(a ... b c ...) `(,(make-repeat 'a '() #f #f) b ,(make-repeat 'c '() #f #f))) - (test-ellipses '((name x a) ...) `(,(make-repeat '(name x a) (list (make-bind 'x '())) #f #f))) - (test-ellipses '((name x (a ...)) ...) - `(,(make-repeat '(name x (a ...)) (list (make-bind 'x '())) #f #f))) - (test-ellipses '(((name x a) ...) ...) - `(,(make-repeat '((name x a) ...) (list (make-bind 'x '())) #f #f))) - (test-ellipses '((1 (name x a)) ...) - `(,(make-repeat '(1 (name x a)) (list (make-bind 'x '())) #f #f))) - (test-ellipses '((any (name x a)) ...) - `(,(make-repeat '(any (name x a)) (list (make-bind 'any '()) - (make-bind 'x '())) - #f #f))) - (test-ellipses '((number (name x a)) ...) - `(,(make-repeat '(number (name x a)) (list (make-bind 'number '()) - (make-bind 'x '())) - #f #f))) - (test-ellipses '((variable (name x a)) ...) - `(,(make-repeat '(variable (name x a)) (list (make-bind 'variable '()) - (make-bind 'x '())) - #f #f))) - (test-ellipses '(((name x a) (name y b)) ...) - `(,(make-repeat '((name x a) (name y b)) (list (make-bind 'x '()) (make-bind 'y '())) #f #f))) - (test-ellipses '((name x (name y b)) ...) - `(,(make-repeat '(name x (name y b)) (list (make-bind 'x '()) (make-bind 'y '())) #f #f))) - (test-ellipses '((in-hole (name x a) (name y b)) ...) - `(,(make-repeat '(in-hole (name x a) (name y b)) - (list (make-bind 'x '()) (make-bind 'y '())) #f #f))) - - (test-ellipses '(a ..._1) - `(,(make-repeat 'a (list) '..._1 #f))) - (test-ellipses '(a ..._!_1) - `(,(make-repeat 'a (list) '..._!_1 #t))) - - (test-empty '() '() (list (make-test-mtch (make-bindings null) '() none))) - (test-empty '(a) '(a) (list (make-test-mtch (make-bindings null) '(a) none))) - (test-empty '(a) '(b) #f) - (test-empty '(a b) '(a b) (list (make-test-mtch (make-bindings null) '(a b) none))) - (test-empty '(a b) '(a c) #f) - (test-empty '() 1 #f) - (test-empty '(#f x) '(#f x) (list (make-test-mtch (make-bindings null) '(#f x) none))) - (test-empty '(#f (name y any)) '(#f) #f) - (test-empty '(in-hole (z hole) a) '(z a) (list (make-test-mtch (make-bindings (list)) '(z a) none))) - (test-empty '(in-hole (z hole) (in-hole (x hole) a)) - '(z (x a)) - (list (make-test-mtch (make-bindings (list)) '(z (x a)) none))) - - (run-test/cmp 'in-hole-zero-holes - (with-handlers ([exn:fail? (λ (e) (regexp-match #rx"zero holes" (exn-message e)))]) - (test-empty '(in-hole (1 2) 2) '(1 2) 'never-gets-here) - 'should-have-raised-an-exception) - '("zero holes") - equal?) - - - (test-empty '(in-hole (in-hole (x hole) hole) y) - '(x y) - (list (make-test-mtch (make-bindings (list)) '(x y) none))) - - (test-empty '(number number) '(1 1) (list (make-test-mtch (make-bindings (list (make-bind 'number 1))) '(1 1) none))) - (test-empty '((name x number) (name x number)) '(1 1) (list (make-test-mtch (make-bindings (list (make-bind 'x 1) (make-bind 'number 1))) '(1 1) none))) - (test-empty '((name x number_q) (name x number_r)) '(1 1) (list (make-test-mtch (make-bindings (list (make-bind 'x 1) - (make-bind 'number_q 1) - (make-bind 'number_r 1))) - '(1 1) - none))) - (test-empty '(number number) '(1 2) #f) - (test-empty '((name x number) (name x number)) '(1 2) #f) - (test-empty '((name x number_q) (name x number_r)) '(1 2) #f) - - (test-empty '(a ...) '() (list (make-test-mtch (make-bindings empty) '() none))) - (test-empty '(a ...) '(a) (list (make-test-mtch (make-bindings empty) '(a) none))) - (test-empty '(a ...) '(a a) (list (make-test-mtch (make-bindings empty) '(a a) none))) - (test-empty '((name x a) ...) '() (list (make-test-mtch (make-bindings (list (make-bind 'x '()))) '() none))) - (test-empty '((name x a) ...) '(a) (list (make-test-mtch (make-bindings (list (make-bind 'x '(a)))) '(a) none))) - (test-empty '((name x a) ...) '(a a) (list (make-test-mtch (make-bindings (list (make-bind 'x '(a a)))) '(a a) none))) - - (test-empty '(b ... a ...) '() (list (make-test-mtch (make-bindings empty) '() none))) - (test-empty '(b ... a ...) '(a) (list (make-test-mtch (make-bindings empty) '(a) none))) - (test-empty '(b ... a ...) '(b) (list (make-test-mtch (make-bindings empty) '(b) none))) - (test-empty '(b ... a ...) '(b a) (list (make-test-mtch (make-bindings empty) '(b a) none))) - (test-empty '(b ... a ...) '(b b a a) (list (make-test-mtch (make-bindings empty) '(b b a a) none))) - (test-empty '(b ... a ...) '(a a) (list (make-test-mtch (make-bindings empty) '(a a) none))) - (test-empty '(b ... a ...) '(b b) (list (make-test-mtch (make-bindings empty) '(b b) none))) - - (test-empty '(a ..._1 a ..._2) - '(a) - (list (make-test-mtch (make-bindings (list (make-bind '..._1 1) (make-bind '..._2 0))) '(a) none) - (make-test-mtch (make-bindings (list (make-bind '..._1 0) (make-bind '..._2 1))) '(a) none))) - (test-empty '(a ..._1 a ..._1) '(a) #f) - (test-empty '(a ..._1 a ..._1) - '(a a) - (list (make-test-mtch (make-bindings (list (make-bind '..._1 1))) '(a a) none))) - - (test-empty '((name x a) ..._!_1 (name y a) ..._!_1) - '(a a) - (list (make-test-mtch (make-bindings (list (make-bind 'x '()) (make-bind 'y '(a a)))) '(a a) none) - (make-test-mtch (make-bindings (list (make-bind 'x '(a a)) (make-bind 'y '()))) '(a a) none))) - - (test-empty '((name y b) ... (name x a) ...) '() - (list (make-test-mtch (make-bindings (list (make-bind 'x '()) - (make-bind 'y '()))) - '() - none))) - (test-empty '((name y b) ... (name x a) ...) '(a) - (list (make-test-mtch (make-bindings (list (make-bind 'x '(a)) - (make-bind 'y '()))) - '(a) - none))) - (test-empty '((name y b) ... (name x a) ...) '(b) - (list (make-test-mtch (make-bindings (list (make-bind 'x '()) - (make-bind 'y '(b)))) - '(b) - none))) - (test-empty '((name y b) ... (name x a) ...) '(b b a a) - (list (make-test-mtch (make-bindings (list (make-bind 'x '(a a)) - (make-bind 'y '(b b)))) - '(b b a a) - none))) - (test-empty '((name y a) ... (name x a) ...) '(a) - (list (make-test-mtch (make-bindings (list (make-bind 'x '()) - (make-bind 'y '(a)))) - '(a) - none) - (make-test-mtch (make-bindings (list (make-bind 'x '(a)) - (make-bind 'y '()))) - '(a) - none))) - (test-empty '((name y a) ... (name x a) ...) '(a a) - (list (make-test-mtch (make-bindings (list (make-bind 'x '()) - (make-bind 'y '(a a)))) - '(a a) - none) - (make-test-mtch (make-bindings (list (make-bind 'x '(a)) - (make-bind 'y '(a)))) - '(a a) - none) - (make-test-mtch (make-bindings (list (make-bind 'x '(a a)) - (make-bind 'y '()))) - '(a a) - none))) - - (test-ab '(bb_y ... aa_x ...) '() - (list (make-test-mtch (make-bindings (list (make-bind 'aa_x '()) - (make-bind 'bb_y '()))) - '() - none))) - (test-ab '(bb_y ... aa_x ...) '(a) - (list (make-test-mtch (make-bindings (list (make-bind 'aa_x '(a)) - (make-bind 'bb_y '()))) - '(a) - none))) - (test-ab '(bb_y ... aa_x ...) '(b) - (list (make-test-mtch (make-bindings (list (make-bind 'aa_x '()) - (make-bind 'bb_y '(b)))) - '(b) - none))) - (test-ab '(bb_y ... aa_x ...) '(b b a a) - (list (make-test-mtch (make-bindings (list (make-bind 'aa_x '(a a)) - (make-bind 'bb_y '(b b)))) - '(b b a a) - none))) - (test-ab '(aa_y ... aa_x ...) '(a) - (list (make-test-mtch (make-bindings (list (make-bind 'aa_x '()) - (make-bind 'aa_y '(a)))) - '(a) - none) - (make-test-mtch (make-bindings (list (make-bind 'aa_x '(a)) - (make-bind 'aa_y '()))) - '(a) - none))) - (test-ab '(aa_y ... aa_x ...) '(a a) - (list (make-test-mtch (make-bindings (list (make-bind 'aa_x '()) - (make-bind 'aa_y '(a a)))) - '(a a) - none) - (make-test-mtch (make-bindings (list (make-bind 'aa_x '(a)) - (make-bind 'aa_y '(a)))) - '(a a) - none) - (make-test-mtch (make-bindings (list (make-bind 'aa_x '(a a)) - (make-bind 'aa_y '()))) - '(a a) - none))) - - (test-empty '((name x number) ...) '(1 2) (list (make-test-mtch (make-bindings (list (make-bind 'x '(1 2)) (make-bind 'number '(1 2)))) '(1 2) none))) - - (test-empty '(a ...) '(b) #f) - (test-empty '(a ... b ...) '(c) #f) - (test-empty '(a ... b) '(b c) #f) - (test-empty '(a ... b) '(a b c) #f) - - (test-empty '((name x any) - ((name x number) ...)) - '((1 1) (1 1)) - (list (make-test-mtch (make-bindings (list (make-bind 'x '(1 1)) - (make-bind 'any '(1 1)) - (make-bind 'number '(1 1)))) - '((1 1) (1 1)) - none))) - - (test-empty '((variable_1 variable_1) ...) - '((x y)) - #f) - - - (test-empty '(number ...) '() - (list (make-test-mtch (make-bindings (list (make-bind 'number '()))) '() none))) - (test-ab '(aa ...) '() - (list (make-test-mtch (make-bindings (list (make-bind 'aa '()))) '() none))) - - - ;; testing block-in-hole - (test-empty '(hide-hole a) 'b #f) - (test-empty '(hide-hole a) 'a (list (make-test-mtch (make-bindings '()) 'a none))) - (test-empty '(hide-hole a) '(block-in-hole a) #f) - (test-empty '(in-hole (x (hide-hole hole)) 1) '(x 1) #f) - (test-empty '(in-hole (x hole) 1) '(x 1) (list (make-test-mtch (make-bindings '()) '(x 1) none))) - (test-empty '(in-hole ((hole #f) (hide-hole hole)) junk) - '(junk junk2) - #f) - - (test-xab 'lsts '() (list (make-test-mtch (make-bindings (list (make-bind 'lsts '()))) '() none))) - (test-xab 'lsts '(x) (list (make-test-mtch (make-bindings (list (make-bind 'lsts '(x)))) '(x) none))) - (test-xab 'lsts 'x (list (make-test-mtch (make-bindings (list (make-bind 'lsts 'x))) 'x none))) - (test-xab 'lsts #f (list (make-test-mtch (make-bindings (list (make-bind 'lsts #f))) #f none))) - (test-xab 'split-out '1 (list (make-test-mtch (make-bindings (list (make-bind 'split-out 1))) '1 none))) - - (test-xab 'exp 1 (list (make-test-mtch (make-bindings (list (make-bind 'exp 1))) 1 none))) - (test-xab 'exp '(+ 1 2) (list (make-test-mtch (make-bindings (list (make-bind 'exp '(+ 1 2)))) '(+ 1 2) none))) - (test-xab '(in-hole ctxt any) - '1 - (list (make-test-mtch (make-bindings (list (make-bind 'ctxt the-hole) (make-bind 'any 1))) 1 none))) - (test-xab '(in-hole ctxt (name x any)) - '1 - (list (make-test-mtch (make-bindings (list (make-bind 'ctxt the-hole) (make-bind 'x 1) (make-bind 'any 1))) 1 none))) - (test-xab '(in-hole (name c ctxt) (name x any)) - '(+ 1 2) - (list (make-test-mtch (make-bindings (list (make-bind 'ctxt (build-context the-hole)) - (make-bind 'c (build-context the-hole)) - (make-bind 'x '(+ 1 2)) - (make-bind 'any '(+ 1 2)))) - '(+ 1 2) none) - (make-test-mtch (make-bindings (list (make-bind 'ctxt (build-context `(+ ,the-hole 2))) - (make-bind 'c (build-context `(+ ,the-hole 2))) - (make-bind 'x 1) - (make-bind 'any 1))) - '(+ 1 2) none) - (make-test-mtch (make-bindings (list (make-bind 'ctxt (build-context `(+ 1 ,the-hole))) - (make-bind 'c (build-context `(+ 1 ,the-hole))) - (make-bind 'x 2) - (make-bind 'any 2))) - '(+ 1 2) none))) - (test-xab '(in-hole (name c ctxt) (name i (+ number_1 number_2))) - '(+ (+ 1 2) (+ 3 4)) - (list (make-test-mtch - (make-bindings (list (make-bind 'i '(+ 1 2)) - (make-bind 'number_1 1) - (make-bind 'number_2 2) - (make-bind 'ctxt (build-context `(+ ,the-hole (+ 3 4)))) - (make-bind 'c (build-context `(+ ,the-hole (+ 3 4)))))) - '(+ (+ 1 2) (+ 3 4)) - none) - (make-test-mtch (make-bindings (list (make-bind 'i '(+ 3 4)) - (make-bind 'number_1 3) - (make-bind 'number_2 4) - (make-bind 'ctxt `(+ (+ 1 2) ,the-hole)) - (make-bind 'c `(+ (+ 1 2) ,the-hole)))) - '(+ (+ 1 2) (+ 3 4)) - none))) - - (test-empty '(in-hole ((z hole)) (name x any)) - '((z a)) - (list (make-test-mtch (make-bindings (list (make-bind 'x 'a) (make-bind 'any 'a))) '((z a)) none))) - (test-empty '(in-hole (name c (z ... hole z ...)) any) - '(z z) - (list - (make-test-mtch (make-bindings (list (make-bind 'c `(z ,the-hole)) (make-bind 'any 'z))) '(z z) none) - (make-test-mtch (make-bindings (list (make-bind 'c `(,the-hole z)) (make-bind 'any 'z))) '(z z) none))) - (test-empty '(in-hole (name c (z ... hole z ...)) any) - '(z z z) - (list - (make-test-mtch (make-bindings (list (make-bind 'c `(z z ,the-hole)) (make-bind 'any 'z))) '(z z z) none) - (make-test-mtch (make-bindings (list (make-bind 'c `(z ,the-hole z)) (make-bind 'any 'z))) '(z z z) none) - (make-test-mtch (make-bindings (list (make-bind 'c `(,the-hole z z)) (make-bind 'any 'z))) '(z z z) none))) - - (test-empty '(z (in-hole (name c (z hole)) a)) - '(z (z a)) - (list - (make-test-mtch (make-bindings (list (make-bind 'c `(z ,the-hole)))) - '(z (z a)) - none))) - - (test-empty '(a (in-hole (name c1 (b (in-hole (name c2 (c hole)) d) hole)) e)) - '(a (b (c d) e)) - (list - (make-test-mtch (make-bindings (list (make-bind 'c2 `(c ,the-hole)) - (make-bind 'c1 `(b (c d) ,the-hole)))) - '(a (b (c d) e)) - none))) - - (test-empty '(in-hole (in-hole hole hole) a) - 'a - (list (make-test-mtch (make-bindings (list)) 'a none))) - - (test-empty '(a (b (in-hole (name c1 (in-hole (name c2 (c hole)) (d hole))) e))) - '(a (b (c (d e)))) - (list - (make-test-mtch (make-bindings (list (make-bind 'c1 `(c (d ,the-hole))) - (make-bind 'c2 `(c ,the-hole)))) - '(a (b (c (d e)))) - none))) - - (test-empty `(+ 1 (side-condition any ,(lambda (bindings) #t) #t)) - '(+ 1 b) - (list (make-test-mtch (make-bindings (list (make-bind 'any 'b))) '(+ 1 b) none))) - (test-empty `(+ 1 (side-condition any ,(lambda (bindings) #f) #f)) - '(+ 1 b) - #f) - - (test-empty `(+ 1 (side-condition b ,(lambda (bindings) #t) #t)) - '(+ 1 b) - (list (make-test-mtch (make-bindings '()) '(+ 1 b) none))) - (test-empty `(+ 1 (side-condition a ,(lambda (bindings) #t)) #t) - '(+ 1 b) - #f) - - (test-empty `(side-condition (name x any) ,(lambda (bindings) (eq? (lookup-binding bindings 'x) 'a)) (eq? (term x) 'a)) - 'a - (list - (make-test-mtch (make-bindings (list (make-bind 'x 'a) - (make-bind 'any 'a))) - 'a - none))) - - (test-empty `(+ 1 (side-condition (name x any) ,(lambda (bindings) (eq? (lookup-binding bindings 'x) 'a)) (eq? (term x) 'a))) - '(+ 1 a) - (list - (make-test-mtch (make-bindings (list (make-bind 'x 'a) - (make-bind 'any 'a))) - '(+ 1 a) - none))) - - (test-empty `(side-condition (name x any) ,(lambda (bindings) (eq? (lookup-binding bindings 'x) 'a)) (eq? (term x) 'a)) - 'b - #f) - - (test-empty `(+ 1 (side-condition (name x any) ,(lambda (bindings) (eq? (lookup-binding bindings 'x) 'a)) (eq? (term x) 'a))) - '(+ 1 b) - #f) - - (test-empty `(side-condition ((any_1 ..._a) (any_2 ..._a)) - ,(lambda (bindings) (error 'should-not-be-called)) - (error 'should-not-be-called)) - '((1 2 3) (4 5)) - #f) - - (test-xab 'exp_1 - '(+ 1 2) - (list (make-test-mtch (make-bindings (list (make-bind 'exp_1 '(+ 1 2)))) '(+ 1 2) none))) - (test-xab '(exp_1 exp_2) - '((+ 1 2) (+ 3 4)) - (list (make-test-mtch (make-bindings (list (make-bind 'exp_1 '(+ 1 2)) (make-bind 'exp_2 '(+ 3 4)))) - '((+ 1 2) (+ 3 4)) - none))) - (test-xab '(exp_1 exp_1) - '((+ 1 2) (+ 3 4)) - #f) - (test-xab 'nesting-names - 'b - (list (make-test-mtch (make-bindings (list (make-bind 'nesting-names 'b))) 'b none))) - (test-xab 'nesting-names - '(a b) - (list (make-test-mtch (make-bindings (list (make-bind 'nesting-names '(a b)))) '(a b) none))) - (test-xab 'nesting-names - '(a (a b)) - (list (make-test-mtch (make-bindings (list (make-bind 'nesting-names '(a (a b))))) '(a (a b)) none))) - (test-xab '((name x a) nesting-names) - '(a (a (a b))) - (list (make-test-mtch (make-bindings (list (make-bind 'x 'a) - (make-bind 'nesting-names '(a (a b))))) - '(a (a (a b))) none))) - (test-xab 'nesting-names - '(a (a (a (a b)))) - (list (make-test-mtch (make-bindings (list (make-bind 'nesting-names '(a (a (a (a b))))))) - '(a (a (a (a b)))) none))) - - (test-xab 'same-in-nt - '(x x) - (list (make-test-mtch (make-bindings (list (make-bind 'same-in-nt '(x x)))) '(x x) none))) - (test-xab 'same-in-nt - '(x y) - #f) - - (test-xab '(in-hole (cross forever-list) 1) - '(a b c) - #f) - - (test-xab '(in-hole (cross forever-list) 1) - '(1 x x) - (list (make-test-mtch (make-bindings '()) '(1 x x) none))) - - (test-xab '(in-hole (cross forever-list) 1) - '(x 1 x) - (list (make-test-mtch (make-bindings '()) '(x 1 x) none))) - - - (test-xab '(in-hole (cross simple) g) - 'g - (list (make-mtch (make-bindings (list)) 'g none))) - - (test-xab 'var '+ #f) - (test-xab 'var 'anunusedvariable (list (make-mtch (make-bindings (list (make-bind 'var 'anunusedvariable))) 'anunusedvariable none))) - (test-xab 'var 'exp (list (make-mtch (make-bindings (list (make-bind 'var 'exp))) 'exp none))) - (test-xab 'var 'exp_x (list (make-mtch (make-bindings (list (make-bind 'var 'exp_x))) 'exp_x none))) - - (test-xab 'underscore '(+ 1 2) (list (make-mtch (make-bindings (list (make-bind 'underscore '(+ 1 2)))) '(+ 1 2) none))) - (test-xab 'underscore '2 (list (make-mtch (make-bindings (list (make-bind 'underscore 2))) 2 none))) - - (run-test - 'compatible-context-language1 - (build-compatible-context-language - (mk-hasheq '((exp . ()) (ctxt . ()))) - (list (make-nt 'exp - (list (make-rhs '(+ exp exp)) - (make-rhs 'number))) - (make-nt 'ctxt - (list (make-rhs '(+ ctxt exp)) - (make-rhs '(+ exp ctxt)) - (make-rhs 'hole))))) - (list - (make-nt 'ctxt-ctxt - (list (make-rhs 'hole) - (make-rhs `(+ (cross ctxt-ctxt) exp)) - (make-rhs `(+ ctxt (cross ctxt-exp))) - (make-rhs `(+ (cross ctxt-exp) ctxt)) - (make-rhs `(+ exp (cross ctxt-ctxt))))) - (make-nt 'ctxt-exp - (list (make-rhs `(+ (cross ctxt-exp) exp)) - (make-rhs `(+ exp (cross ctxt-exp))))) - (make-nt 'exp-ctxt - (list (make-rhs `(+ (cross exp-ctxt) exp)) - (make-rhs `(+ ctxt (cross exp-exp))) - (make-rhs `(+ (cross exp-exp) ctxt)) - (make-rhs `(+ exp (cross exp-ctxt))))) - (make-nt 'exp-exp - (list (make-rhs 'hole) - (make-rhs `(+ (cross exp-exp) exp)) - (make-rhs `(+ exp (cross exp-exp))))))) - - (run-test - 'compatible-context-language2 - (build-compatible-context-language - (mk-hasheq '((m . ()) (v . ()))) - (list (make-nt 'm (list (make-rhs '(m m)) (make-rhs '(+ m m)) (make-rhs 'v))) - (make-nt 'v (list (make-rhs 'number) (make-rhs '(lambda (x) m)))))) - (list - (make-nt 'v-v (list (make-rhs 'hole) (make-rhs (list 'lambda (list 'x) (list 'cross 'v-m))))) - (make-nt 'v-m - (list - (make-rhs (list (list 'cross 'v-m) 'm)) - (make-rhs (list 'm (list 'cross 'v-m))) - (make-rhs (list '+ (list 'cross 'v-m) 'm)) - (make-rhs (list '+ 'm (list 'cross 'v-m))) - (make-rhs (list 'cross 'v-v)))) - (make-nt 'm-v (list (make-rhs (list 'lambda (list 'x) (list 'cross 'm-m))))) - (make-nt 'm-m - (list - (make-rhs 'hole) - (make-rhs (list (list 'cross 'm-m) 'm)) - (make-rhs (list 'm (list 'cross 'm-m))) - (make-rhs (list '+ (list 'cross 'm-m) 'm)) - (make-rhs (list '+ 'm (list 'cross 'm-m))) - (make-rhs (list 'cross 'm-v)))))) - - (run-test - 'compatible-context-language3 - (build-compatible-context-language - (mk-hasheq '((m . ()) (seven . ()))) - (list (make-nt 'm (list (make-rhs '(m seven m)) (make-rhs 'number))) - (make-nt 'seven (list (make-rhs 7))))) - `(,(make-nt - 'm-m - `(,(make-rhs 'hole) ,(make-rhs `((cross m-m) seven m)) ,(make-rhs `(m seven (cross m-m))))) - ,(make-nt - 'seven-m - `(,(make-rhs `((cross seven-m) seven m)) ,(make-rhs `(m (cross seven-seven) m)) ,(make-rhs `(m seven (cross seven-m))))) - ,(make-nt 'seven-seven `(,(make-rhs 'hole))))) - - (run-test - 'compatible-context-language4 - (build-compatible-context-language - (mk-hasheq '((a . ()) (b . ()) (c . ()))) - (list (make-nt 'a (list (make-rhs 'b))) - (make-nt 'b (list (make-rhs 'c))) - (make-nt 'c (list (make-rhs 3))))) - (list (make-nt 'c-c (list (make-rhs 'hole))) - (make-nt 'c-b (list (make-rhs '(cross c-c)))) - (make-nt 'c-a (list (make-rhs '(cross c-b)))) - (make-nt 'b-b (list (make-rhs 'hole))) - (make-nt 'b-a (list (make-rhs '(cross b-b)))) - (make-nt 'a-a (list (make-rhs 'hole))))) - - #; - (test-xab '(in-hole (cross exp) (+ number number)) - '(+ (+ 1 2) 3) - (list (make-bindings (list (make-bind 'hole (make-hole-binding (list '+ 1 2) (list 'cdr 'car) #f)))))) - - (run-test/cmp 'split-underscore1 (split-underscore 'a_1) 'a eq?) - (run-test/cmp 'split-underscore2 (split-underscore 'a_!_1) 'a eq?) - (run-test/cmp 'split-underscore3 - (with-handlers ([exn:fail? (λ (e) (cadr (regexp-match #rx"^([^:]+):" (exn-message e))))]) - (split-underscore 'a_b_1)) - "compile-pattern" - equal?) - - (test-ellipsis-binding '((number_1 number_2) ...) '((1 2))) - (test-ellipsis-binding '((name x number_1) ...) '(1 2)) - (test-ellipsis-binding '(((number_1 ...) (number_2 ...)) ...) '(((1) (2)))) - (test-ellipsis-binding '(number ... variable) '(1 x)) - - (cond - [(= failures 0) - (printf "matcher-test.ss: all ~a tests passed.\n" test-count)] - [else - (printf "matcher-test.ss: ~a test~a failed.\n" - failures - (if (= failures 1) - "" - "s"))])) - - ;; mk-hasheq : (listof (cons sym any)) -> hash-table - ;; builds a hash table that has the bindings in assoc-list - (define (mk-hasheq assoc-list) - (let ([ht (make-hash-table)]) - (for-each - (lambda (a) - (hash-table-put! ht (car a) (cdr a))) - assoc-list) - ht)) - - ;; test-empty : sexp[pattern] sexp[term] answer -> void - ;; returns #t if pat matching exp with the empty language produces ans. - (define (test-empty pat exp ans) - (run-match-test - `(match-pattern (compile-pattern (compile-language 'pict-stuff-not-used '() '()) ',pat #t) ',exp) - (match-pattern - (compile-pattern (compile-language 'pict-stuff-not-used '() '()) pat #t) - exp) - ans)) - - ;; test-lang : sexp[pattern] sexp[term] answer (list/c nt) -> void - ;; returns #t if pat matching exp with the language defined by the given nts - (define (test-lang pat exp ans nts) - (let ([nt-map (map (λ (x) (list (nt-name x))) nts)]) - (run-match-test - `(match-pattern (compile-pattern (compile-language 'pict-stuff-not-used ',nts ',nt-map) ',pat #t) ',exp) - (match-pattern - (compile-pattern (compile-language 'pict-stuff-not-used nts nt-map) pat #t) - exp) - ans))) - - (define xab-lang #f) - ;; test-xab : sexp[pattern] sexp[term] answer -> void - ;; returns #t if pat matching exp with a simple language produces ans. - (define (test-xab pat exp ans) - (unless xab-lang - (let ([nts - (list (make-nt 'exp - (list (make-rhs '(+ exp exp)) - (make-rhs 'number))) - (make-nt 'ctxt - (list (make-rhs '(+ ctxt exp)) - (make-rhs '(+ exp ctxt)) - (make-rhs 'hole))) - - (make-nt 'ec-one - (list (make-rhs '(+ (hole xx) exp)) - (make-rhs '(+ exp (hole xx))))) - - (make-nt 'same-in-nt (list (make-rhs '((name x any) (name x any))))) - - (make-nt 'forever-list (list (make-rhs '(forever-list forever-list ...)) - (make-rhs 'x))) - - (make-nt 'lsts - (list (make-rhs '()) - (make-rhs '(x)) - (make-rhs 'x) - (make-rhs '#f))) - (make-nt 'split-out - (list (make-rhs 'split-out2))) - (make-nt 'split-out2 - (list (make-rhs 'number))) - - (make-nt 'simple (list (make-rhs 'simple-rhs))) - - (make-nt 'nesting-names - (list (make-rhs '(a (name x nesting-names))) - (make-rhs 'b))) - (make-nt 'var (list (make-rhs `variable-not-otherwise-mentioned))) - - (make-nt 'underscore (list (make-rhs 'exp_1))) - )]) - (set! xab-lang - (compile-language 'pict-stuff-not-used - nts - (map (λ (x) (list (nt-name x))) nts))))) - (run-match-test - `(match-pattern (compile-pattern xab-lang ',pat #t) ',exp) - (match-pattern (compile-pattern xab-lang pat #t) exp) - ans)) - - (define ab-lang #f) - ;; test-xab : sexp[pattern] sexp[term] answer -> void - ;; returns #t if pat matching exp with a simple language produces ans. - (define (test-ab pat exp ans) - (unless ab-lang - (set! ab-lang - (compile-language - 'pict-stuff-not-used - (list (make-nt 'aa - (list (make-rhs 'a))) - (make-nt 'bb - (list (make-rhs 'b)))) - '((aa) (bb))))) - (run-match-test - `(match-pattern (compile-pattern ab-lang ',pat #t) ',exp) - (match-pattern (compile-pattern ab-lang pat #t) exp) - ans)) - - ;; test-ellipses : sexp sexp -> void - (define (test-ellipses pat expected) - (run-test - `(rewrite-ellipses test-suite:non-underscore-binder? ',pat (lambda (x) (values x #f))) - (let-values ([(compiled-pattern has-hole?) (rewrite-ellipses test-suite:non-underscore-binder? pat (lambda (x) (values x #f)))]) - (cons compiled-pattern has-hole?)) - (cons expected #f))) - - (define (test-suite:non-underscore-binder? x) - (memq x '(number any variable string))) - - ;; test-ellipsis-binding: sexp sexp -> boolean - ;; Checks that `extract-empty-bindings' produces bindings in the same order - ;; as the matcher, as required by `collapse-single-multiples' - (define (test-ellipsis-binding pat exp) - (define (binding-names bindings) - (map (λ (b) - (cond [(bind? b) (bind-name b)] - [(mismatch-bind? b) (mismatch-bind-name b)])) - bindings)) - (run-test - `(test-ellipsis-binding ,pat) - (binding-names - (bindings-table-unchecked - (mtch-bindings - (car - ((compiled-pattern-cp - (compile-pattern (compile-language 'pict-stuff-not-used '() '()) pat #t)) - exp - #t))))) - (binding-names (extract-empty-bindings test-suite:non-underscore-binder? pat)))) - - ;; run-test/cmp : sexp any any (any any -> boolean) - ;; compares ans with expected. If failure, - ;; prints info about the test and increments failures - (define failures 0) - (define test-count 0) - (define (run-test/cmp symbolic ans expected cmp?) - (set! test-count (+ test-count 1)) - (cond - [(cmp? ans expected) - '(printf "passed: ~s\n" symbolic)] - [else - (set! failures (+ failures 1)) - (fprintf (current-error-port) - " test: ~s\nexpected: ~e\n got: ~e\n" - symbolic expected ans)])) - - (define (run-test symbolic ans expected) (run-test/cmp symbolic ans expected equal/bindings?)) - - ;; run-match-test : sexp got expected - ;; expects both ans and expected to be lists or both to be #f and - ;; compares them using a set-like equality if they are lists - (define (run-match-test symbolic ans expected) - (run-test/cmp - symbolic ans expected - (λ (xs ys) - (cond - [(and (not xs) (not ys)) #t] - [(and (list? xs) - (list? ys)) - (and (andmap (λ (x) (memf (λ (y) (equal/bindings? x y)) ys)) xs) - (andmap (λ (y) (memf (λ (x) (equal/bindings? x y)) xs)) ys) - (= (length xs) (length ys)))] - [else #f])))) - - (define (build-context c) - (let loop ([c c]) - (cond - [(eq? c the-hole) the-hole] - [(pair? c) (build-cons-context (loop (car c)) (loop (cdr c)))] - [(or (null? c) - (number? c) - (symbol? c)) - (build-flat-context c)] - [else (error 'build-context "unknown ~s" c)]))) - - (test)) diff --git a/collects/redex/private/pict-test.ss b/collects/redex/private/pict-test.ss deleted file mode 100644 index c80da26ac0..0000000000 --- a/collects/redex/private/pict-test.ss +++ /dev/null @@ -1,53 +0,0 @@ -(module pict-test mzscheme - ;; these tests just make sure that errors don't - ;; happen. These tests are really only last resorts - ;; for testing functions that aren't easily extraced - ;; from the pict.ss library - - (require "../reduction-semantics.ss" - "../pict.ss") - - (require (lib "mrpict.ss" "texpict") - (lib "mred.ss" "mred") - (lib "class.ss")) - - (define-language empty-language) - - (define-language var-ab - [var (a - b)]) - (render-language var-ab) - - (define-language var-not-ab - [var (variable-except x - y)]) - (render-language var-not-ab) - - (let () - (define-metafunction empty-language [(zero any_in) 0]) - (render-metafunction zero)) - - (render-reduction-relation - (reduction-relation - empty-language - (--> number_const - ,(term - (+ number_const 0))))) - - (render-reduction-relation - (reduction-relation - empty-language - (--> a b - (fresh x) - (fresh y)))) - - - (define-language x1-9 - (x 1 2 3 4 5 6 7 8 9)) - - (define-extended-language x0-10 x1-9 - (x 0 .... 10)) - - (render-language x0-10) - - (printf "pict-test.ss passed\n")) diff --git a/collects/redex/private/rg-test.ss b/collects/redex/private/rg-test.ss deleted file mode 100644 index 307b595aa0..0000000000 --- a/collects/redex/private/rg-test.ss +++ /dev/null @@ -1,1081 +0,0 @@ -#lang scheme - -(require "test-util.ss" - "reduction-semantics.ss" - "matcher.ss" - "term.ss" - "rg.ss" - "keyword-macros.ss" - "error.ss") - -(reset-count) - -;; to-table : hash-table -> assoc -;; extracts the hash-table's mapping in a deterministic way -(define (to-table ht) - (sort (hash-map ht cons) - (λ (x y) (string<=? (format "~a" (car x)) (format "~a" (car y)))))) - -(let () - (define-language lc - (e x (e e) (λ (x) e)) - (x variable)) - (let ([bc (find-base-cases lc)]) - (test (to-table (base-cases-non-cross bc)) - '((e . (1 2 2)) (x . (0)))) - (test (to-table (base-cases-cross bc)) - '((e-e . (0 2 2 1)) (x-e . (1 2 2 2 2)) (x-x . (0)))))) - -(let () - (define-language lang - (e (e e))) - (let ([bc (find-base-cases lang)]) - (test (to-table (base-cases-non-cross bc)) '((e . (inf)))) - (test (to-table (base-cases-cross bc)) '((e-e . (0 inf inf)))))) - -(let () - (define-language lang - (a 1 2 3) - (b a (a_1 b_!_1))) - (let ([bc (find-base-cases lang)]) - (test (to-table (base-cases-non-cross bc)) - '((a . (0 0 0)) (b . (1 2)))) - (test (to-table (base-cases-cross bc)) - '((a-a . (0)) (a-b . (1)) (b-b . (0)))))) - -(let () - (define-language lc - (e (e e ...) - (+ e e) - x - v) - (v (λ (x) e) - number) - (x variable)) - (let ([bc (find-base-cases lc)]) - (test (to-table (base-cases-non-cross bc)) - '((e . (2 2 1 1)) (v . (2 0)) (x . (0)))) - (test (to-table (base-cases-cross bc)) - '((e-e . (0 2 2 2 2 2)) (e-v . (1)) (v-e . (2 2 2 2 1)) (v-v . (0 2)) - (x-e . (2 2 2 2 1 3)) (x-v . (2 2)) (x-x . (0)))))) - -(let () - (define-language L - (x (variable-prefix x) - (variable-except y)) - (y y)) - (test (hash-ref (base-cases-non-cross (find-base-cases L)) 'x) - '(0 0))) - -(let () - (define-language lang - (e number x y) - (x variable) - (y y)) - (test (min-prods (car (compiled-lang-lang lang)) - (base-cases-non-cross (find-base-cases lang))) - (list (car (nt-rhs (car (compiled-lang-lang lang))))))) - -(define (make-random . nums) - (let ([nums (box nums)]) - (λ ([m +inf.0]) - (cond [(null? (unbox nums)) (error 'make-random "out of numbers")] - [(>= (car (unbox nums)) m) (error 'make-random "number too large")] - [else (begin0 (car (unbox nums)) (set-box! nums (cdr (unbox nums))))])))) - -(test (pick-from-list '(a b c) (make-random 1)) 'b) - -(test (pick-number 24 (make-random 1/5)) 3) -(test (pick-number 224 (make-random 0 0 1/5)) -5) -(test (pick-number 524 (make-random 0 0 1 1/5 1/5)) 3/4) -(test (pick-number 1624 (make-random 0 0 0 .5 1 .5)) 3.0) -(test (pick-number 2624 (make-random 0 0 0 0 1 1 1/5 1/5 2 .5 0 .5)) - (make-rectangular 7/8 -3.0)) - -(test (pick-natural 224 (make-random 1/5)) 5) -(test (pick-integer 900 (make-random 0 0 1/5)) -7) -(test (pick-real 9000 (make-random 0 0 0 .5 1 1/8)) 11.0) - -(let* ([lits '("bcd" "cbd")]) - (test (pick-char 0 (make-random 0 0)) #\A) - (test (pick-char 0 (make-random 2 1)) #\c) - (test (pick-char 1000 (make-random 1 25 0)) #\Z) - (test (pick-char 1000 (make-random 0 65)) #\a) - (test (pick-char 1500 (make-random 0 1 65)) #\a) - (test (pick-char 1500 (make-random 0 0 3)) #\⇒) - (test (pick-char 2500 (make-random 0 0 1 3)) #\⇒) - (test (pick-char 2500 (make-random 0 0 0 1)) (integer->char #x4E01)) - (test (pick-char 1000 (make-random 0 (- (char->integer #\_) #x20))) #\`) - (test (random-string lits 3 0 (make-random 0 1)) "cbd") - (test (random-string lits 3 0 (make-random 1 0 1 1 1 2 1)) "abc") - (test (pick-string lits 0 (make-random .5 1 0 1 1 1 2 1)) "abc") - (test (pick-var lits 0 (make-random .01 1 0 1 1 1 2 1)) 'abc)) - -(let () - (define-language L - (a 5 (x a)) - (b 4)) - (test (pick-nt 'a #f L 1 'dontcare) - (nt-rhs (car (compiled-lang-lang L)))) - (test (pick-nt 'a #f L preferred-production-threshold 'dontcare (make-random 1)) - (nt-rhs (car (compiled-lang-lang L)))) - (let ([pref (car (nt-rhs (car (compiled-lang-lang L))))]) - (test (pick-nt 'a #f L preferred-production-threshold - (make-pref-prods 'dont-care - (make-immutable-hash `((a ,pref)))) - (make-random 0)) - (list pref))) - (test (pick-nt 'b #f L preferred-production-threshold #f) - (nt-rhs (cadr (compiled-lang-lang L))))) - -(define-syntax raised-exn-msg - (syntax-rules () - [(_ expr) (raised-exn-msg exn:fail? expr)] - [(_ exn? expr) - (with-handlers ([exn? exn-message]) - (begin - expr - (let () - (define-struct exn-not-raised ()) - (make-exn-not-raised))))])) - -(define (patterns . selectors) - (map (λ (selector) - (λ (name cross? lang size pref-prods) - (list (selector (nt-rhs (nt-by-name lang name cross?)))))) - selectors)) - -(define (iterator name items) - (let ([bi (box items)]) - (λ () - (if (null? (unbox bi)) - (error name "empty") - (begin0 (car (unbox bi)) (set-box! bi (cdr (unbox bi)))))))) - -(let ([iter (iterator 'test-iterator '(a b))]) - (test (iter) 'a) - (test (iter) 'b) - (test (raised-exn-msg (iter)) #rx"empty")) - -(define (decisions #:var [var pick-var] - #:nt [nt pick-nt] - #:str [str pick-string] - #:num [num pick-number] - #:nat [nat pick-natural] - #:int [int pick-integer] - #:real [real pick-real] - #:any [any pick-any] - #:seq [seq pick-sequence-length] - #:pref [pref pick-preferred-productions]) - (define-syntax decision - (syntax-rules () - [(_ d) (if (procedure? d) (λ () d) (iterator (quote d) d))])) - (unit (import) (export decisions^) - (define next-variable-decision (decision var)) - (define next-non-terminal-decision (decision nt)) - (define next-number-decision (decision num)) - (define next-natural-decision (decision nat)) - (define next-integer-decision (decision int)) - (define next-real-decision (decision real)) - (define next-string-decision (decision str)) - (define next-any-decision (decision any)) - (define next-sequence-decision (decision seq)) - (define next-pref-prods-decision (decision pref)))) - -(define-syntax generate-term/decisions - (syntax-rules () - [(_ lang pat size attempt decisions) - (parameterize ([generation-decisions decisions]) - (generate-term lang pat size #:attempt attempt))])) - -(let () - (define-language lc - (e (e e) x (λ (x) e)) - (x (variable-except λ))) - - ;; Generate (λ (x) x) - (test - (generate-term/decisions - lc e 1 0 - (decisions #:var (list (λ _ 'x) (λ _'x)) - #:nt (patterns third first first first))) - '(λ (x) x)) - - ;; Generate pattern that's not a non-terminal - (test - (generate-term/decisions - lc (x x x_1 x_1) 1 0 - (decisions #:var (list (λ _ 'x) (λ _ 'y)))) - '(x x y y)) - - ; After choosing (e e), size decremented forces each e to x. - (test - (generate-term/decisions - lc e 1 0 - (decisions #:nt (patterns first) - #:var (list (λ _ 'x) (λ _ 'y)))) - '(x y))) - -;; variable-except pattern -(let () - (define-language var - (e (variable-except x y))) - (test - (generate-term/decisions - var e 2 0 - (decisions #:var (list (λ _ 'x) (λ _ 'y) (λ _ 'x) (λ _ 'z)))) - 'z)) - -(let () - (define-language L - (n natural) - (i integer) - (r real)) - (test (let ([n (generate-term L n 0 #:attempt 10000)]) - (and (integer? n) - (exact? n) - (not (negative? n)))) - #t) - (test (generate-term/decisions L n 0 1 (decisions #:nat (λ (_) 42))) 42) - (test (let ([i (generate-term L i 0 #:attempt 10000)]) - (and (integer? i) (exact? i))) - #t) - (test (generate-term/decisions L i 0 1 (decisions #:int (λ (_) -42))) -42) - (test (real? (generate-term L r 0 #:attempt 10000)) #t) - (test (generate-term/decisions L r 0 1 (decisions #:real (λ (_) 4.2))) 4.2)) - -(let () - (define-language lang - (a (number number ... "foo" ... "bar" #t ...)) - (b (number_1 ..._!_1 number_1 ..._1)) - (c (variable_1 ..._1 number_2 ..._1)) - (d (z_1 ... z_2 ..._!_1 (z_1 z_2) ...)) - (e (n_1 ..._!_1 n_2 ..._!_1 (n_1 n_2) ..._3)) - (f (n_1 ..._1 n_2 ..._2 n_2 ..._1)) - (g (z_1 ..._!_1 z_2 ... (z_1 z_2) ...)) - (n number) - (z 4)) - (test - (generate-term/decisions - lang a 2 0 - (decisions #:num (build-list 3 (λ (n) (λ (_) n))) - #:seq (list (λ (_) 2) (λ (_) 3) (λ (_) 1)))) - `(0 1 2 "foo" "foo" "foo" "bar" #t)) - (test (generate-term/decisions lang b 5 0 (decisions #:seq (list (λ (_) 0)))) - null) - (test (generate-term/decisions lang c 5 0 (decisions #:seq (list (λ (_) 0)))) - null) - (test (generate-term/decisions lang d 5 0 (decisions #:seq (list (λ (_) 2)))) - '(4 4 4 4 (4 4) (4 4))) - (test (raised-exn-msg exn:fail:redex:generation-failure? (generate-term lang e 5 #:retries 42)) - #rx"generate-term: unable to generate pattern e in 42") - (test (generate-term/decisions lang f 5 0 (decisions #:seq (list (λ (_) 0)))) null) - (test (generate-term/decisions - lang ((0 ..._!_1) ... (1 ..._!_1) ...) 5 0 - (decisions #:seq (list (λ (_) 2) (λ (_) 3) (λ (_) 4) (λ (_) 2) (λ (_) 3) (λ (_) 4) - (λ (_) 2) (λ (_) 3) (λ (_) 4) (λ (_) 1) (λ (_) 3)))) - '((0 0 0) (0 0 0 0) (1 1 1))) - (test (generate-term/decisions - lang ((0 ..._!_1) ... (1 ..._!_1) ...) 5 0 - (decisions #:seq (list (λ (_) 2) (λ (_) 3) (λ (_) 4) (λ (_) 2) (λ (_) 3) (λ (_) 5)))) - '((0 0 0) (0 0 0 0) (1 1 1) (1 1 1 1 1)))) - -(let () - (define-language lang (e (variable-prefix pf))) - (test - (generate-term/decisions - lang e 5 0 - (decisions #:var (list (λ _ 'x)))) - 'pfx)) - -(let () - (define-language lang (x variable literal)) - (test ((is-nt? lang) 'x) #t) - (test ((is-nt? lang) 'y) #f)) - -(let () - (define-language lang - (e number (e_1 e_2 e e_1 e_2))) - (test - (generate-term/decisions - lang e 5 0 - (decisions #:nt (patterns second first first first) - #:num (list (λ _ 2) (λ _ 3) (λ _ 4)))) - '(2 3 4 2 3))) - -(let () - (define-language lang - (a (number_!_1 number_!_2 number_!_1)) - (b (c_!_1 c_!_1 c_!_1)) - (c 1 2)) - (test - (generate-term/decisions - lang a 5 0 - (decisions #:num (list (λ _ 1) (λ _ 1) (λ _ 1) (λ _ 1) (λ _ 1) (λ _ 2)))) - '(1 1 2)) - (test - (generate-term/decisions - lang (number_!_1 number_!_2 number_!_1) 5 0 - (decisions #:num (list (λ _ 1) (λ _ 1) (λ _ 1) (λ _ 1) (λ _ 1) (λ _ 2)))) - '(1 1 2)) - (test - (raised-exn-msg exn:fail:redex:generation-failure? (generate-term lang b 5000)) - #rx"unable")) - -(let () - (define-language lang - (e string) - (f foo bar)) - (test - (let/ec k - (generate-term/decisions - lang e 5 0 - (decisions #:str (list (λ (l a) (k (sort l string<=?))))))) - '("bar" "foo"))) - -(let () - (define-language lang - (a 43) - (b (side-condition a_1 (odd? (term a_1)))) - (c (side-condition a_1 (even? (term a_1)))) - (e (side-condition (x_1 x_!_2 x_!_2) (not (eq? (term x_1) 'x)))) - (x variable)) - (test (generate-term lang b 5) 43) - (test (generate-term lang (side-condition a (odd? (term a))) 5) 43) - (test (raised-exn-msg exn:fail:redex:generation-failure? (generate-term lang c 5)) - #px"unable to generate pattern \\(side-condition a\\_1 #\\)") - (test (let/ec k - (generate-term lang (number_1 (side-condition 7 (k (term number_1)))) 5)) - 'number_1) - - (test ; mismatch patterns work with side-condition failure/retry - (generate-term/decisions - lang e 5 0 - (decisions #:var (list (λ _ 'x) (λ _ 'x) (λ _ 'y) (λ _ 'y) (λ _ 'x) (λ _ 'y)))) - '(y x y)) - (test ; generate compiles side-conditions in pattern - (generate-term/decisions - lang (side-condition x_1 (not (eq? (term x_1) 'x))) 5 0 - (decisions #:var (list (λ _ 'x) (λ _ 'y)))) - 'y)) - -(let () - (define-language lang - (a (name x b)) - (b 4) - (c (side-condition (name x d) (zero? (term x)))) - (d 2 1 0) - (e ((side-condition (name d_1 d) (zero? (term d_1))) d_1))) - (test (generate-term lang a 5) 4) - (test (generate-term lang c 5) 0) - (test (generate-term lang e 5) '(0 0))) - -(let () - (define-language lang - (a number (+ a a)) - (A hole (+ a A) (+ A a)) - (C hole) - (e ((in-hole (in-hole f (number_1 hole)) number_1) number_1)) - (f (in-hole C (number_1 hole))) - (g (in-hole (side-condition (hole number_1) (zero? (term number_1))) number_2)) - (h ((in-hole i number_1) number_1)) - (i (number_1 (in-hole j (number_1 hole)))) - (j (in-hole (hole number_1) (number_1 hole))) - (x variable) - (y variable)) - - (test - (generate-term/decisions - lang (in-hole A number ) 5 0 - (decisions - #:nt (patterns second second first first third first second first first) - #:num (build-list 5 (λ (x) (λ (_) x))))) - '(+ (+ 1 2) (+ 0 (+ 3 4)))) - - (test (generate-term lang (in-hole (in-hole (1 hole) hole) 5) 5) '(1 5)) - (test (generate-term lang (hole 4) 5) (term (hole 4))) - (test (generate-term/decisions - lang (variable_1 (in-hole C variable_1)) 5 0 - (decisions #:var (list (λ _ 'x) (λ _ 'y) (λ _ 'x)))) - '(x x)) - (test (generate-term/decisions - lang (variable_!_1 (in-hole C variable_!_1)) 5 0 - (decisions #:var (list (λ _ 'x) (λ _ 'x) (λ _ 'x) (λ _ 'y)))) - '(x y)) - (test (generate-term/decisions lang e 5 0 (decisions #:num (list (λ _ 1) (λ _ 2)))) - '((2 (1 1)) 1)) - (test (generate-term/decisions lang g 5 0 (decisions #:num (list (λ _ 1) (λ _ 2) (λ _ 1) (λ _ 0)))) - '(1 0)) - (test (generate-term/decisions lang h 5 0 (decisions #:num (list (λ _ 1) (λ _ 2) (λ _ 3)))) - '((2 ((3 (2 1)) 3)) 1))) - -(let () - (define-language lc - (e (e e) (+ e e) x v) - (v (λ (x) e) number) - (x variable-not-otherwise-mentioned)) - (test (generate-term/decisions lc x 5 0 (decisions #:var (list (λ _ 'λ) (λ _ '+) (λ _ 'x)))) - 'x)) - -(let () - (define-language four - (e 4) - (f 5)) - (define-language empty) - - ;; `any' pattern - (let ([four (prepare-lang four)] - [sexp (prepare-lang sexp)]) - (test (call-with-values (λ () (pick-any four sexp (make-random 0 1))) list) - (list four 'f)) - (test (call-with-values (λ () (pick-any four sexp (make-random 1))) list) - (list sexp 'sexp))) - (test (generate-term/decisions - four any 5 0 (decisions #:any (list (λ (lang sexp) (values lang 'e))))) 4) - (test (generate-term/decisions - four any 5 0 - (decisions #:any (list (λ (lang sexp) (values sexp 'sexp))) - #:nt (patterns fifth second second second) - #:seq (list (λ _ 3)) - #:str (list (λ _ "foo") (λ _ "bar") (λ _ "baz")))) - '("foo" "bar" "baz")) - (test (generate-term/decisions - empty any 5 0 (decisions #:nt (patterns first) - #:var (list (λ _ 'x)))) - 'x)) - -;; `hide-hole' pattern -(let () - (define-language lang - (e (hide-hole (in-hole ((hide-hole hole) hole) 1)))) - (test (generate-term lang e 5) (term (hole 1)))) - -(define (output-error-port thunk) - (let ([port (open-output-string)]) - (parameterize ([current-error-port port]) - (thunk)) - (get-output-string port))) - -;; `cross' pattern -(let () - (define-language lang - (e x (e e) v) - (v (λ (x) e)) - (x variable-not-otherwise-mentioned)) - (define-extended-language name-collision lang (e-e 47)) - - (test (generate-term/decisions - lang (cross e) 3 0 - (decisions #:nt (patterns fourth first first second first first first) - #:var (list (λ _ 'x) (λ _ 'y)))) - (term (λ (x) (hole y)))) - - (test (generate-term/decisions name-collision (cross e) 3 0 - (decisions #:nt (patterns first))) - (term hole)) - (test (generate-term/decisions name-collision e-e 3 0 - (decisions #:nt (patterns first))) - 47) - - (test (hash-ref (base-cases-non-cross (find-base-cases name-collision)) 'e-e) - '(0))) - -(let () - (define-language L - (a ((a ...) ...))) - (test (generate-term/decisions - L (cross a) 3 0 - (decisions #:nt (patterns second first) - #:seq (list (λ _ 0) (λ _ 0) (λ _ 0) (λ _ 0)))) - (term ((hole))))) - -;; generation failures increase size and attempt -(let () - (define-language L - (a d b) - (b d c) - (c e) - - (x variable)) - (test - (generate-term/decisions - L (side-condition a (eq? (term a) 'e)) 0 0 - ; It isn't possible for `a' to generate 'y until size is 2. - ; When size is 0, the generator has no choice but the 'x production. - ; When size is 1, the generator has a choice for `a' but not for `b'. - ; Supply enough first-production choices to cover the size 1 attempts - ; followed by the choices that produce 'y on the first size 2 attempt. - (decisions - #:nt (apply patterns - (append (build-list (* default-retries proportion-at-size) - (λ (_) first)) - (list second second first))))) - 'e) - - (test - (generate-term/decisions - L (side-condition x (number? (term x))) 0 0 - (decisions #:var (λ (lang-lits attempt) - (if (>= attempt retry-threshold) 0 'x)))) - 0) - - (let ([attempts null] - [start (sub1 retry-threshold)] - [finish (+ retry-threshold post-threshold-incr)]) - (generate-term/decisions - L (side-condition x (number? (term x))) 0 start - (decisions #:var (λ (lang-lits attempt) - (set! attempts (cons attempt attempts)) - (if (= attempt finish) 0 'x)))) - (test attempts (list finish retry-threshold start)))) - -;; output : (-> (-> void) string) -(define (output thunk) - (let ([p (open-output-string)]) - (parameterize ([current-output-port p]) - (unless (void? (thunk)) - (error 'output "expected void result"))) - (begin0 - (get-output-string p) - (close-output-port p)))) - -;; preferred productions -(let ([make-pick-nt (λ opt (λ req (apply pick-nt (append req opt))))]) - (define-language L - (e (+ e e) (* e e) 7)) - (define-language M (e 0) (e-e 1)) - - (let ([pats (λ (L) (nt-rhs (car (compiled-lang-lang L))))]) - (test - (generate-term/decisions - L e 2 preferred-production-threshold - (decisions #:pref (list (λ (L) (make-pref-prods - 'dont-care - (make-immutable-hash `((e ,(car (pats L)))))))) - #:nt (make-pick-nt (make-random 0 0 0)))) - '(+ (+ 7 7) (+ 7 7))) - (test - (generate-term/decisions - L any 2 preferred-production-threshold - (decisions #:nt (patterns first) - #:var (list (λ _ 'x)) - #:any (list (λ (lang sexp) (values sexp 'sexp))))) - 'x) - (test - (generate-term/decisions - L any 2 preferred-production-threshold - (decisions #:pref (list (λ (L) (make-pref-prods - 'dont-care - (make-immutable-hash `((e ,(car (pats L)))))))) - #:nt (make-pick-nt (make-random 0 0 0)) - #:any (list (λ (lang sexp) (values lang 'e))))) - '(+ (+ 7 7) (+ 7 7))) - (test - (generate-term/decisions - M (cross e) 2 preferred-production-threshold - (decisions #:nt (make-pick-nt (make-random) (λ (att rand) #t)))) - (term hole)) - (test - (generate-term/decisions - M e-e 2 preferred-production-threshold - (decisions #:nt (make-pick-nt (make-random) (λ (att rand) #t)))) - 1) - - (test - (let ([generated null]) - (output - (λ () - (check-reduction-relation - (reduction-relation L (--> e e)) - (λ (t) (set! generated (cons t generated))) - #:decisions (decisions #:nt (make-pick-nt (make-random) - (λ (att rand) #t)) - #:pref (list (λ (_) 'dontcare) - (λ (_) 'dontcare) - (λ (_) 'dontcare) - ; size 0 terms prior to this attempt - (λ (L) (make-pref-prods - 'dont-care - (make-immutable-hash `((e ,(car (pats L))))))) - (λ (L) (make-pref-prods - 'dont-care - (make-immutable-hash `((e ,(cadr (pats L))))))))) - #:attempts 5))) - generated) - '((* 7 7) (+ 7 7) 7 7 7)))) - -;; redex-check -(let () - (define-language lang - (d 5) - (e e 4) - (n number)) - (test (output (λ () (redex-check lang d #f))) - #rx"redex-check: .*:.*\ncounterexample found after 1 attempt:\n5\n") - (test (output (λ () (redex-check lang d #t))) - #rx"redex-check: .*:.*\nno counterexamples in 1000 attempts\n") - (let-syntax ([noloc (λ (stx) - (syntax-case stx () - [(_ e) (datum->syntax stx (syntax->datum #'e) #f)]))]) - (test (output (λ () (noloc (redex-check lang d #t)))) - "redex-check: no counterexamples in 1000 attempts\n")) - (test (output (λ () (redex-check lang (d e) (and (eq? (term d) 5) (eq? (term e) 4)) #:attempts 2))) - #rx"no counterexamples") - (test (output (λ () (redex-check lang (d ...) (zero? (modulo (foldl + 0 (term (d ...))) 5)) #:attempts 2))) - #rx"no counterexamples") - (test (output (λ () (redex-check lang (d e) #f))) - #rx"counterexample found after 1 attempt:\n\\(5 4\\)\n") - (let* ([p (open-output-string)] - [m (parameterize ([current-output-port p]) - (with-handlers ([exn:fail? exn-message]) - (redex-check lang d (error 'pred-raised)) - 'no-exn-raised))]) - (test m "error: pred-raised") - (test (get-output-string p) #rx"checking 5 raises.*\n$") - (close-output-port p)) - - (test (output - (λ () - (redex-check lang n (eq? 42 (term n)) - #:attempts 1 - #:source (reduction-relation - lang - (--> 42 dontcare) - (--> 0 dontcare z))))) - #rx"counterexample found after 1 attempt with z:\n0\n") - - (let ([generated null]) - (test (output - (λ () - (redex-check lang n (set! generated (cons (term n) generated)) - #:attempts 5 - #:source (reduction-relation - lang - (--> 1 dontcare) - (--> 2 dontcare))))) - #rx"no counterexamples.*with each clause") - (test generated '(2 2 1 1))) - - (let () - (define-metafunction lang - [(mf 42) dontcare] - [(mf 0) dontcare]) - (test (output - (λ () - (redex-check lang (n) (eq? 42 (term n)) - #:attempts 1 - #:source mf))) - #px"counterexample found after 1 attempt with clause at .*:\\d+:\\d+:\n\\(0\\)\n")) - - (let () - (define-metafunction lang - [(f) - dontcare - (side-condition #f)]) - (test (raised-exn-msg - exn:fail:redex:generation-failure? - (redex-check lang any #t - #:attempts 1 - #:source f)) - #px"unable to generate LHS of clause at .*:\\d+:\\d+")) - - (let () - (define-metafunction lang - [(mf d e) dontcare]) - (test (output - (λ () - (redex-check lang (number_1 number_2) - (and (= (term number_1) 5) - (= (term number_2) 4)) - #:attempts 1 - #:source mf))) - #rx"no counterexamples")) - - (test (raised-exn-msg - exn:fail:redex? - (redex-check lang n #t #:source (reduction-relation lang (--> x 1)))) - #rx"x does not match n") - (test (raised-exn-msg - exn:fail:redex:generation-failure? - (redex-check lang (side-condition any #f) #t #:retries 42 #:attempts 1)) - #rx"^redex-check: unable .* in 42") - (let ([unable-loc #px"^redex-check: unable to generate LHS of clause at .*:\\d+:\\d+ in 42"]) - (let-syntax ([test-gen-fail - (syntax-rules () - [(_ clauses ... expected) - (test - (raised-exn-msg - exn:fail:redex:generation-failure? - (redex-check lang any #t - #:source (reduction-relation - lang - clauses ...) - #:retries 42 - #:attempts 1)) - expected)])]) - (test-gen-fail - (--> (side-condition any #f) any) - unable-loc) - - (test-gen-fail - (==> (side-condition any #f) any) - with [(--> a b) (==> a b)] - unable-loc) - - (test-gen-fail - (--> (side-condition any #f) any impossible) - #rx"^redex-check: unable to generate LHS of impossible in 42")))) - -;; check-metafunction-contract -(let () - (define-language empty) - (define-metafunction empty - f : (side-condition number_1 (odd? (term number_1))) -> number - [(f 1) 1] - [(f 3) 'NaN]) - - (define-metafunction empty - g : number ... -> (any ...) - [(g number_1 ... 1 number_2 ...) (number_1 ...)]) - - (define-metafunction empty - h : number -> number - [(h any) any]) - - (define-metafunction empty - [(i any ...) (any ...)]) - - (define-metafunction empty - j : (side-condition any #f) -> any - [(j any ...) (any ...)]) - - ;; Dom(f) < Ctc(f) - (test (output - (λ () - (parameterize ([generation-decisions - (decisions #:num (list (λ _ 2) (λ _ 5)))]) - (check-metafunction-contract f)))) - #rx"check-metafunction-contract:.*counterexample found after 1 attempt:\n\\(5\\)\n") - ;; Rng(f) > Codom(f) - (test (output - (λ () - (parameterize ([generation-decisions - (decisions #:num (list (λ _ 3)))]) - (check-metafunction-contract f)))) - #rx"counterexample found after 1 attempt:\n\\(3\\)\n") - ;; LHS matches multiple ways - (test (output - (λ () - (parameterize ([generation-decisions - (decisions #:num (list (λ _ 1) (λ _ 1)) - #:seq (list (λ _ 2)))]) - (check-metafunction-contract g)))) - #rx"counterexample found after 1 attempt:\n\\(1 1\\)\n") - ;; OK -- generated from Dom(h) - (test (output (λ () (check-metafunction-contract h))) #rx"no counterexamples") - ;; OK -- generated from pattern (any ...) - (test (output (λ () (check-metafunction-contract i #:attempts 5))) #rx"no counterexamples") - - ;; Unable to generate domain - (test (raised-exn-msg - exn:fail:redex:generation-failure? - (check-metafunction-contract j #:attempts 1 #:retries 42)) - #rx"^check-metafunction-contract: unable .* in 42")) - -;; check-reduction-relation -(let () - (define-language L - (e (+ e ...) number) - (E (+ number ... E* e ...)) - (E* hole E*) - (n 4)) - - (let ([generated null] - [R (reduction-relation - L - (==> (+ number ...) whatever) - (--> (side-condition number (even? (term number))) whatever) - with - [(--> (in-hole E a) whatever) - (==> a b)])]) - (test (begin - (output - (λ () - (check-reduction-relation - R (λ (term) (set! generated (cons term generated))) - #:decisions (decisions #:seq (list (λ _ 0) (λ _ 0) (λ _ 0)) - #:num (list (λ _ 1) (λ _ 1) (λ _ 0))) - #:attempts 1))) - generated) - (reverse '((+ (+)) 0)))) - - (let ([S (reduction-relation L (--> 1 2 name) (--> 3 4))]) - (test (output (λ () (check-reduction-relation S (λ (x) #t) #:attempts 1))) - #rx"check-reduction-relation:.*no counterexamples") - (test (output - (λ () (check-reduction-relation S (λ (x) #f)))) - #rx"counterexample found after 1 attempt with name:\n1\n") - (test (output - (λ () (check-reduction-relation S (curry eq? 1)))) - #px"counterexample found after 1 attempt with clause at .*:\\d+:\\d+:\n3\n")) - - (test (output - (λ () (check-reduction-relation (reduction-relation L (--> 1 2) (--> 3 4 name)) (curry eq? 1)))) - #px"counterexample found after 1 attempt with name:\n3\n") - - (let ([T (reduction-relation - L - (==> number number - (where any_num number) - (side-condition (eq? (term any_num) 4)) - (where any_numb any_num) - (side-condition (eq? (term any_numb) 4))) - with - [(--> (9 a) b) - (==> a b)])]) - (test (output - (λ () - (check-reduction-relation - T (curry equal? '(9 4)) - #:attempts 1 - #:decisions (decisions #:num (build-list 5 (λ (x) (λ _ x))))))) - #rx"no counterexamples")) - - (let ([U (reduction-relation L (--> (side-condition any #f) any))]) - (test (raised-exn-msg - exn:fail:redex:generation-failure? - (check-reduction-relation U (λ (_) #t))) - #rx"^check-reduction-relation: unable"))) - -; check-metafunction -(let () - (define-language empty) - - (define-metafunction empty - [(m 1) whatever] - [(m 2) whatever]) - (define-metafunction empty - [(n (side-condition any #f)) any]) - - (let ([generated null]) - (test (begin - (output - (λ () - (check-metafunction m (λ (t) (set! generated (cons t generated))) #:attempts 1))) - generated) - (reverse '((1) (2))))) - - (test - (let/ec k - (define-language L (n 2)) - (define-metafunction L - [(f n) - n - (where number_2 ,(add1 (term n))) - (where number_3 ,(add1 (term number_2))) - (side-condition (k (term number_3)))] - [(f any) 0]) - (check-metafunction f (λ (_) #t))) - 4) - - (test (output (λ () (check-metafunction m (λ (_) #t)))) #rx"no counterexamples") - (test (output (λ () (check-metafunction m (curry eq? 1)))) - #px"check-metafunction:.*counterexample found after 1 attempt with clause at .*:\\d+:\\d+") - (test (raised-exn-msg - exn:fail:contract? - (check-metafunction m (λ (_) #t) #:attempts 'NaN)) - #rx"check-metafunction: expected") - (test (raised-exn-msg - exn:fail:redex:generation-failure? - (check-metafunction n (λ (_) #t) #:retries 42)) - #rx"check-metafunction: unable .* in 42")) - -;; custom generators -(let () - (define-language L - (x variable)) - - (test - (generate-term - L x_1 0 - #:custom (λ (pat sz i-h acc env att rec def) - (match pat - ['x (values 'x env)] - [_ (def acc)]))) - 'x) - (test - (let/ec k - (equal? - (generate-term - L (x x) 0 - #:custom (let ([once? #f]) - (λ (pat sz i-h acc env att rec def) - (match pat - ['x (if once? - (k #f) - (begin - (set! once? #t) - (values 'x env)))] - [_ (def acc)])))) - '(x x))) - #t) - - (test - (hash-ref - (let/ec k - (generate-term - L (x (x)) 0 - #:custom (λ (pat sz i-h acc env att rec def) - (match pat - [(struct binder ('x)) - (values 'y (hash-set env pat 'y))] - [(list (struct binder ('x))) (k env)] - [_ (def acc)])))) - (make-binder 'x)) - 'y) - - (test - (generate-term - L (in-hole hole 7) 0 - #:custom (λ (pat sz i-h acc env att rec def) - (match pat - [`(in-hole hole 7) - (rec 'hole #:contractum 7)] - [_ (def acc)]))) - 7) - - (test - (let/ec k - (generate-term - L any 10 - #:attempt 42 - #:custom (λ (pat sz i-h acc env att rec def) (k (list sz att))))) - '(10 42)) - - (test - (let/ec k - (generate-term - L x 10 - #:custom (λ (pat sz i-h acc env att rec def) - (match pat - ['x (rec 7 #:size 0)] - [7 (k sz)] - [_ (def att)])))) - 0) - - (test - (generate-term - L (q 7) 0 - #:custom (λ (pat sz i-h acc env att rec def) - (match pat - ['q (rec '(7 7) #:acc 8)] - [7 (values (or acc 7) env)] - [_ (def att)]))) - '((8 8) 7))) - -;; parse/unparse-pattern -(let-syntax ([test-match (syntax-rules () [(_ p x) (test (match x [p #t] [_ #f]) #t)])]) - (define-language lang (x variable)) - (let ([pattern '((x_1 number) ... 3)]) - (test-match (list - (struct ellipsis - ('... - (list (struct binder ('x_1)) (struct binder ('number))) - _ - (list (struct binder ('number)) (struct binder ('x_1))))) - 3) - (parse-pattern pattern lang 'top-level)) - (test (unparse-pattern (parse-pattern pattern lang 'top-level)) pattern)) - (let ([pattern '((x_1 ..._1 x_2) ..._!_1)]) - (test-match (struct ellipsis - ((struct mismatch (i_1 '..._!_1)) - (list - (struct ellipsis - ('..._1 - (struct binder ('x_1)) - (struct class ('..._1)) - (list (struct binder ('x_1))))) - (struct binder ('x_2))) - _ - (list (struct binder ('x_2)) '..._1 (struct class ('..._1)) (struct binder ('x_1))))) - (car (parse-pattern pattern lang 'grammar))) - (test (unparse-pattern (parse-pattern pattern lang 'grammar)) pattern)) - (let ([pattern '((name x_1 x_!_2) ...)]) - (test-match (struct ellipsis - ('... `(name x_1 ,(struct mismatch (i_2 'x_!_2))) _ - (list (struct binder ('x_1)) (struct mismatch (i_2 'x_!_2))))) - (car (parse-pattern pattern lang 'grammar))) - (test (unparse-pattern (parse-pattern pattern lang 'grammar)) pattern)) - (let ([pattern '((x ...) ..._1)]) - (test-match (struct ellipsis - ('..._1 - (list - (struct ellipsis - ('... - (struct binder ('x)) - (struct class (c_1)) - (list (struct binder ('x)))))) - _ - (list (struct class (c_1)) (struct binder ('x))))) - (car (parse-pattern pattern lang 'top-level))) - (test (unparse-pattern (parse-pattern pattern lang 'top-level)) pattern)) - (let ([pattern '((variable_1 ..._!_1) ...)]) - (test-match (struct ellipsis - ('... - (list - (struct ellipsis - ((struct mismatch (i_1 '..._!_1)) - (struct binder ('variable_1)) - (struct class (c_1)) - (list (struct binder ('variable_1)))))) - _ - (list (struct class (c_1)) (struct mismatch (i_1 '..._!_1)) (struct binder ('variable_1))))) - (car (parse-pattern pattern lang 'grammar))) - (test (unparse-pattern (parse-pattern pattern lang 'grammar)) pattern)) - (test (parse-pattern '(cross x) lang 'grammar) '(cross x-x)) - (test (parse-pattern '(cross x) lang 'cross) '(cross x)) - (test (parse-pattern 'x lang 'grammar) 'x) - (test (parse-pattern 'variable lang 'grammar) 'variable)) - -(let () - (define-language lang (x variable)) - (define-syntax test-class-reassignments - (syntax-rules () - [(_ pattern expected) - (test (to-table (class-reassignments (parse-pattern pattern lang 'top-level))) - expected)])) - - (test-class-reassignments - '(x_1 ..._1 x_2 ..._2 x_2 ..._1) - '((..._2 . ..._1))) - (test-class-reassignments - '((x_1 ..._1 x_1 ..._2) (x_2 ..._1 x_2 ..._2) x_3 ..._2) - '((..._1 . ..._2) (..._2 . ..._2))) - (test-class-reassignments - '(x_1 ..._1 x ..._2 x_1 ..._2) - '((..._1 . ..._2))) - (test-class-reassignments - '(x_1 ..._1 x_2 ..._2 (x_1 x_2) ..._3) - '((..._1 . ..._3) (..._2 . ..._3))) - (test-class-reassignments - '((x_1 ..._1) ..._2 x_2 ..._3 (x_1 ..._4 x_2) ..._5) - '((..._1 . ..._4) (..._2 . ..._5) (..._3 . ..._5))) - (test-class-reassignments - '((x_1 ..._1) ..._2 (x_1 ..._3) ..._4 (x_1 ..._5) ..._6) - '((..._1 . ..._5) (..._2 . ..._6) (..._3 . ..._5) (..._4 . ..._6))) - (test-class-reassignments - '(x_1 ..._1 x_1 ..._2 x_2 ..._1 x_2 ..._4 x_2 ..._3) - '((..._1 . ..._3) (..._2 . ..._3) (..._4 . ..._3))) - (test - (hash-map - (class-reassignments (parse-pattern '(x_1 ... x_1 ..._!_1 x_1 ..._1) lang 'top-level)) - (λ (_ cls) cls)) - '(..._1 ..._1)) - (test-class-reassignments - '((3 ..._1) ..._2 (4 ..._1) ..._3) - '((..._2 . ..._3))) - (test-class-reassignments - '(x ..._1 x ..._2 variable ..._2 variable ..._3 variable_1 ..._3 variable_1 ..._4) - '((..._1 . ..._4) (..._2 . ..._4) (..._3 . ..._4)))) - -(print-tests-passed 'rg-test.ss) diff --git a/collects/redex/private/run-tests.ss b/collects/redex/private/run-tests.ss deleted file mode 100644 index 4ec5971dc6..0000000000 --- a/collects/redex/private/run-tests.ss +++ /dev/null @@ -1,41 +0,0 @@ -;; require this file to run all of the test suites for redex. - -#lang scheme/base -(require scheme/runtime-path - "config.ss" - "test-util.ss") - -(set-show-bitmaps? #t) - -(define test-files - '("lw-test.ss" - "matcher-test.ss" - "tl-test.ss" - "term-test.ss" - "rg-test.ss" - "keyword-macros-test.ss" - "core-layout-test.ss" - "bitmap-test.ss" - "pict-test.ss" - "hole-test.ss")) - -(define-runtime-path here ".") - -(define (flush) - ;; these flushes are here for running under cygwin, - ;; which somehow makes mzscheme think it isn't using - ;; an interative port - (flush-output (current-error-port)) - (flush-output (current-output-port))) - -(for-each - (λ (test-file) - (flush) - (printf "requiring ~a\n" test-file) - (flush) - (dynamic-require (build-path here test-file) #f) - (flush)) - test-files) - -(printf "\nWARNING: didn't run color-test.ss or subst-test.ss\n") -(flush) diff --git a/collects/redex/private/term-test.ss b/collects/redex/private/term-test.ss deleted file mode 100644 index 25059c7bbf..0000000000 --- a/collects/redex/private/term-test.ss +++ /dev/null @@ -1,177 +0,0 @@ -(module term-test scheme - (require "term.ss" - "matcher.ss" - "test-util.ss") - - (reset-count) - (test (term 1) 1) - (test (term (1 2)) (list 1 2)) - (test (term (1 ,(+ 1 1))) (list 1 2)) - (test (term-let ([x 1]) (term (x x))) (list 1 1)) - (test (term-let ([(x ...) (list 1 2 3)]) (term ((y x) ...))) '((y 1) (y 2) (y 3))) - - (test (term (in-hole (1 hole) 2)) (term (1 2))) - (test (term (in-hole (1 hole (hole x)) 2)) (term (1 2 (hole x)))) - - (test (equal? (term hole) (term hole)) #t) - (test (hole? (term hole)) #t) - (test (hole? (term (hole #f))) #f) - (test (hole? (term (hole the-name))) #f) - - (test (term-let-fn ((f (lambda (q) q))) - (term (f 1 2 3))) - (term (1 2 3))) - - (test (term-let-fn ((f (lambda (q) `(y ,(car q))))) - (term (f (zzzz)))) - (term (y (zzzz)))) - - (test (term-let-fn ((f (λ (x) (add1 (car x))))) - (term (f 2))) - (term 3)) - - (test (term-let ([((x ...) ...) (list (list 1 1) (list 2 2) (list 3 3))]) - (term-let-fn ((f (λ (x) (car x)))) - (term ((qq (f x) ...) ...)))) - (term ((qq 1 1) (qq 2 2) (qq 3 3)))) - - (test (term-let-fn ((f (lambda (x) (car x)))) - (term (f hole))) - (term hole)) - - (test (term-let-fn ((f (lambda (q) `(y ,(car q))))) - (term-let-fn ((g (lambda (x) `(ff ,(car x))))) - (term (g (f (zzzz)))))) - (term (ff (y (zzzz))))) - - (test (term-let-fn ((f (lambda (q) `(y ,(car q))))) - (term-let-fn ((g (lambda (x) `(ff ,(car x))))) - (term (f (g (f (zzzz))))))) - (term (y (ff (y (zzzz)))))) - - (test (term-let ([x 1]) - (term (x . y))) - (term (1 . y))) - - (test (term-let ([(x ...) (list 3 2 1)]) - (term (x ... . y))) - (term (3 2 1 . y))) - - (test (term-let ([(x . y) (cons 1 2)]) - (term (x y))) - (term (1 2))) - - ;; test that the implicit `plug' inserted by `in-hole' - ;; deals with ellipses properly - (test (term-let ([(E ...) '(1 2 3)]) - (term ((in-hole E x) ...))) - (term (1 2 3))) - - (test (term-let-fn ((metafun car)) - (term-let ((x 'whatever) - ((y ...) '(4 5 6))) - (term (((metafun x) y) ...)))) - '((whatever 4) (whatever 5) (whatever 6))) - - (test (term-let-fn ((metafun (λ (x) (car x)))) - (term-let (((y ...) '(4 5 6))) - (term ((y (metafun 1)) ...)))) - '((4 1) (5 1) (6 1))) - - (test (term-let-fn ((f (compose add1 car))) - (term-let (((x ...) '(1 2 3)) - ((y ...) '(a b c))) - (term (((f x) y) ...)))) - '((2 a) (3 b) (4 c))) - - (test (term-let-fn ((f (curry foldl + 0))) - (term-let (((x ...) '(1 2 3))) - (term (f x ...)))) - 6) - - (test (term-let-fn ((f (compose add1 car))) - (term-let (((x ...) '(1 2 3)) - (((y ...) ...) '((a b c) (d e f) (g h i)))) - (term ((((f x) y) ...) ...)))) - '(((2 a) (3 b) (4 c)) ((2 d) (3 e) (4 f)) ((2 g) (3 h) (4 i)))) - - (test (term-let-fn ((f (curry foldl + 0))) - (term-let ((((x ...) ...) '((1 2) (3 4 5) (6)))) - (term ((f x ...) ...)))) - '(3 12 6)) - - (define-namespace-anchor here) - (define ns (namespace-anchor->namespace here)) - - (let ([src 'term-template]) - (test - (parameterize ([current-namespace ns]) - (runtime-error-source - '(term-let ([(x ...) '(a b c)] - [((y ...) ...) '((1 2) (4 5 6) (7 8 9))]) - (term (((x y) ...) ...))) - src)) - src)) - - (let ([src 'term-template-metafunc]) - (test - (parameterize ([current-namespace ns]) - (runtime-error-source - '(term-let-fn ((f car)) - (term-let ([(x ...) '(a b c)] - [((y ...) ...) '((1 2) (4 5 6) (7 8 9))]) - (term ((((f x) y) ...) ...)))) - src)) - src)) - - (let ([src 'ellipsis-args]) - (test - (parameterize ([current-namespace ns]) - (runtime-error-source - '(term-let-fn ((f car)) - (term-let ([(x ...) '(a b)] - [(y ...) '(c d e)]) - (term (f ((x y) ...))))) - src)) - src)) - - (let ([src 'ellipsis-args/map]) - (test - (parameterize ([current-namespace ns]) - (runtime-error-source - '(term-let-fn ((f car)) - (term-let ([(x ...) '(a b)] - [(y ...) '(c d e)]) - (term ((f (x y)) ...)))) - src)) - src)) - - (let ([src 'ellipsis-args/in-hole]) - (test - (parameterize ([current-namespace ns]) - (runtime-error-source - '(term-let ([(x ...) '(a b)] - [(y ...) '(c d e)]) - (term ((in-hole hole (x y)) ...))) - src)) - src)) - - (let ([src 'term-let-rhs]) - (test - (parameterize ([current-namespace ns]) - (runtime-error-source - '(term-let ([(x ...) 'a]) - 3) - src)) - src)) - - (let ([src 'term-template]) - (test - (parameterize ([current-namespace ns]) - (syntax-error-sources - '(term-let ([(x ...) '(a b c)]) - (term x)) - src)) - (list src))) - - (print-tests-passed 'term-test.ss)) diff --git a/collects/redex/private/test-util.ss b/collects/redex/private/test-util.ss deleted file mode 100644 index 491f32af3c..0000000000 --- a/collects/redex/private/test-util.ss +++ /dev/null @@ -1,132 +0,0 @@ -#lang scheme - -(require "matcher.ss" - errortrace/errortrace-lib - errortrace/errortrace-key) -(provide test test-syn-err tests reset-count - syn-err-test-namespace - print-tests-passed - equal/bindings? - runtime-error-source syntax-error-sources) - -(define syn-err-test-namespace (make-base-namespace)) -(parameterize ([current-namespace syn-err-test-namespace]) - (eval '(require redex/reduction-semantics))) - -(define-syntax (test stx) - (syntax-case stx () - [(_ expected got) - (with-syntax ([line (syntax-line (syntax got))] - [fn (if (path? (syntax-source (syntax got))) - (path->string (syntax-source (syntax got))) - "")]) - (syntax/loc stx (test/proc (λ () expected) got line fn)))])) - -(define-syntax (test-syn-err stx) - (syntax-case stx () - [(_ exp regexp) - (syntax/loc stx - (test - (parameterize ([current-namespace syn-err-test-namespace]) - (with-handlers ((exn:fail:syntax? exn-message)) - (expand 'exp) - 'no-error-raised)) - regexp))])) - -(define tests 0) -(define failures 0) -(define (reset-count) - (set! tests 0) - (set! failures 0)) - -(define (print-tests-passed filename) - (cond - [(= 0 failures) - (printf "~a: all ~a tests passed.\n" filename tests)] - [else - (printf "~a: ~a test~a failed.\n" filename failures (if (= 1 failures) "" "s"))])) - -(define (test/proc run expected line filename) - ;(printf "testing line ~s:~s\n" filename line) - (let ([got (with-handlers ((exn:fail? values)) (run))]) - (set! tests (+ tests 1)) - (unless (and (not (exn? got)) - (matches? got expected)) - (set! failures (+ 1 failures)) - (fprintf (current-error-port) - "test/proc: file ~a line ~a:\n got ~s\nexpected ~s\n\n" - filename - line - got - expected)))) - -(define (matches? got expected) - (cond - [(regexp? expected) - (and (string? got) (regexp-match expected got) #t)] - [else - (equal/bindings? got expected)])) - -;; equal/bindings? : any any -> boolean -;; compares two sexps (with embedded bindings) for equality. -;; uses an order-insensitive comparison for the bindings -(define (equal/bindings? fst snd) - (let loop ([fst fst] - [snd snd]) - (cond - [(pair? fst) - (and (pair? snd) - (loop (car fst) (car snd)) - (loop (cdr fst) (cdr snd)))] - [(mtch? fst) - (and (mtch? snd) - (loop (mtch-bindings fst) - (mtch-bindings snd)) - (let ([g1 (gensym 'run-match-test-sym)]) - (equal/bindings? (mtch-context fst) - (mtch-context snd))) - (equal/bindings? (mtch-hole fst) - (mtch-hole snd)))] - [(bindings? fst) - (and (bindings? snd) - (let ([fst-table (bindings-table fst)] - [snd-table (bindings-table snd)]) - (and (= (length fst-table) - (length snd-table)) - (andmap - loop - (sort fst-table rib-lt) - (sort snd-table rib-lt)))))] - [(and (bind? fst) - (bind? snd) - (context? (bind-exp fst)) - (context? (bind-exp snd))) - (and (equal? (bind-name fst) (bind-name snd)) - (let ([g (gensym 'run-match-test-sym2)]) - (equal/bindings? (bind-exp fst) - (bind-exp snd))))] - [(and (hole? fst) - (hole? snd)) - #t] - [else (equal? fst snd)]))) - -;; rib-lt : rib rib -> boolean -(define (rib-lt r1 r2) (string<=? (format "~s" (bind-name r1)) - (format "~s" (bind-name r2)))) - -(define (runtime-error-source sexp src) - (let/ec return - (cadar - (continuation-mark-set->list - (exn-continuation-marks - (with-handlers ((exn:fail? values)) - (parameterize ([current-compile (make-errortrace-compile-handler)]) - (eval (read-syntax src (open-input-string (format "~s" sexp))))) - (return 'no-source))) - errortrace-key)))) - -(define (syntax-error-sources sexp src) - (let ([p (read-syntax src (open-input-string (format "~s" sexp)))]) - (with-handlers ((exn:srclocs? (λ (x) (map srcloc-source ((exn:srclocs-accessor x) x))))) - (expand p) - null))) \ No newline at end of file diff --git a/collects/redex/private/tl-test.ss b/collects/redex/private/tl-test.ss deleted file mode 100644 index 8dd90a3884..0000000000 --- a/collects/redex/private/tl-test.ss +++ /dev/null @@ -1,1850 +0,0 @@ -(module tl-test scheme - (require "../reduction-semantics.ss" - "test-util.ss" - (only-in "matcher.ss" make-bindings make-bind) - scheme/match - "struct.ss") - - (reset-count) - - -; -; -; ;; -; ; -; ; ;;; ;; ;; ;; ;;;; ;; ;;; ;; ;; ;;; -; ; ; ; ;; ; ; ;; ; ; ; ; ; ;; ; ; -; ; ;;;; ; ; ; ; ; ; ;;;; ; ; ;;;;; -; ; ; ; ; ; ; ; ; ; ; ; ; ; ; -; ; ; ; ; ; ; ; ; ;; ; ; ; ; ; -; ;;;;; ;;;;;;;; ;;; ;;;; ;; ;; ;;;;; ;;;; ;;;; -; ; ; -; ;;; ;;; -; -; - - - (define-language empty-language) - - (define-language grammar - (M (M M) - number) - (E hole - (E M) - (number E)) - (X (number any) - (any number)) - (Q (Q ...) - variable) - (UN (add1 UN) - zero)) - - (test (pair? (redex-match grammar M '(1 1))) #t) - (test (pair? (redex-match grammar M '(1 1 1))) #f) - (test (pair? (redex-match grammar - (side-condition (M_1 M_2) (equal? (term M_1) (term M_2))) - '(1 1))) - #t) - (test (pair? (redex-match grammar - (side-condition (M_1 M_2) (equal? (term M_1) (term M_2))) - '(1 2))) - #f) - - (test (pair? ((redex-match grammar M) '(1 1))) - #t) - - ;; next 3: test naming of subscript-less non-terminals - (test (pair? (redex-match grammar (M M) (term (1 1)))) #t) - (test (pair? (redex-match grammar (M M) (term (1 2)))) #f) - (test (pair? (redex-match grammar (M_1 M_2) (term (1 2)))) #t) - - (define-language base-grammar - (q 1) - (e (+ e e) number) - (x (variable-except +))) - - (define-extended-language extended-grammar - base-grammar - (e .... (* e e)) - (x (variable-except + *)) - (r 2)) - - (test (pair? (redex-match extended-grammar e '(+ 1 1))) #t) - (test (pair? (redex-match extended-grammar e '(* 2 2))) #t) - (test (pair? (redex-match extended-grammar r '2)) #t) - (test (pair? (redex-match extended-grammar q '1)) #t) - (test (pair? (redex-match extended-grammar x '*)) #f) - (test (pair? (redex-match extended-grammar x '+)) #f) - (test (pair? (redex-match extended-grammar e '....)) #f) - - ;; make sure that `language' with a four period ellipses signals an error - (test (regexp-match #rx"[.][.][.][.]" (with-handlers ([exn? exn-message]) - (let () - (define-language x (e ....)) - 12))) - '("....")) - - - - ;; test multiple variable non-terminals - (let () - (define-language lang - ((l m) (l m) x) - (x variable-not-otherwise-mentioned)) - (test (pair? (redex-match lang m (term x))) - #t)) - - ;; test multiple variable non-terminals - (let () - (define-language lang - ((l m) (l m) x) - (x variable-not-otherwise-mentioned)) - (test (pair? (redex-match lang l (term x))) - #t)) - - (let () - (define-language lang - ((x y) 1 2 3)) - (define-extended-language lang2 lang - (x .... 4)) - (test (pair? (redex-match lang2 x 4)) #t) - (test (pair? (redex-match lang2 y 4)) #t) - (test (pair? (redex-match lang2 x 1)) #t) - (test (pair? (redex-match lang2 y 2)) #t)) - - ;; test that the variable "e" is not bound in the right-hand side of a side-condition - ;; this one signaled an error at some point - (let () - (define-language bad - (e 2 (side-condition (e) #t))) - (test (pair? (redex-match bad e '(2))) - #t)) - - ;; test that the variable "e" is not bound in the right-hand side of a side-condition - ;; this one tests to make sure it really isn't bound - (let ([x #f]) - (define-language bad - (e 2 (side-condition (e) (set! x (term e))))) - (redex-match bad e '(2)) - (test x 'e)) - - ;; test multiple variable non-terminals being extended - (let () - (define-language lang - ((x y) 1 2 3)) - (define-extended-language lang2 lang - (x .... 4)) - (test (pair? (redex-match lang2 x 4)) #t) - (test (pair? (redex-match lang2 y 4)) #t) - (test (pair? (redex-match lang2 x 1)) #t) - (test (pair? (redex-match lang2 y 2)) #t)) - - ;; test multiple variable non-terminals in an extended language - (let () - (define-language lang - ((x y) 1 2 3)) - (define-extended-language lang2 lang - ((z w) 5 6 7)) - (test (pair? (redex-match lang2 z 5)) #t) - (test (pair? (redex-match lang2 w 6)) #t)) - - ;; test cases that ensure that extending any one of a - ;; multiply defined non-terminal gets extended properly - (let () - (define-language iswim - ((V U W) AA)) - - (define-extended-language iswim-cont - iswim - (W .... QQ)) - - (test (pair? (redex-match iswim-cont U (term QQ))) - #t)) - - (let () - (define-language iswim - ((V U W) AA)) - - (define-extended-language iswim-cont - iswim - (W .... QQ)) - - (test (pair? (redex-match iswim-cont V (term QQ))) - #t) - (test (pair? (redex-match iswim-cont U (term QQ))) - #t) - (test (pair? (redex-match iswim-cont W (term QQ))) - #t)) - - (let () - (define-language iswim - ((V U W) AA)) - - (define-extended-language iswim-cont - iswim - (V .... QQ)) - - (test (pair? (redex-match iswim-cont V (term QQ))) - #t) - (test (pair? (redex-match iswim-cont U (term QQ))) - #t) - (test (pair? (redex-match iswim-cont W (term QQ))) - #t)) - - (let () - (define-language okay - [(X Y) z]) - - (define-extended-language replace-both - okay - [(X Y) q]) - - ;; this test ran into an infinite loop in an earlier version of redex. - (test (redex-match replace-both X (term explode)) #f)) - - (test (with-handlers ([exn? exn-message]) - (let () - (define-language main - [(X Y) z]) - (define-extended-language new - main - [(X Y Z) q]) - (void))) - "extend-language: new language extends old non-terminal X and also adds new shortcut Z") - - (test (with-handlers ([exn? exn-message]) - (let () - (define-language main - [(X Y) z] - [(P Q) w]) - (define-extended-language new - main - [(X P) q]) - (void))) - "extend-language: new language does not have the same non-terminal aliases as the old, non-terminal P was not in the same group as X in the old language") - - ;; test caching - (let () - (define match? #t) - - (define-language lang - (x (side-condition any match?))) - - (test (pair? (redex-match lang x 1)) #t) - (set! match? #f) - (test (pair? (redex-match lang x 1)) #t) - (parameterize ([caching-enabled? #f]) - (test (pair? (redex-match lang x 1)) #f))) - - - (let () - (define sc-eval-count 0) - (define-language lang - (x (side-condition any (begin (set! sc-eval-count (+ sc-eval-count 1)) - #t)))) - - (redex-match lang x 1) - (redex-match lang x 1) - (parameterize ([caching-enabled? #f]) - (redex-match lang x 1)) - (test sc-eval-count 2)) - - (let () - (define rhs-eval-count 0) - (define-metafunction empty-language - [(f any) ,(begin (set! rhs-eval-count (+ rhs-eval-count 1)) - 1)]) - - (term (f 1)) - (term (f 1)) - (parameterize ([caching-enabled? #f]) - (term (f 1))) - (test rhs-eval-count 2)) - - (define-namespace-anchor here) - (define ns (namespace-anchor->namespace here)) - - (let ([src 'bad-underscore]) - (test - (parameterize ([current-namespace ns]) - (syntax-error-sources - '(define-language L (n m_1)) - src)) - (list src))) - -; -; -; ;;; ; -; ; ; ; -; ;;; ; ;;; ;;;;; ;;; ;;;;; ;; ;; ;; ;; ;;;; ;;;;; ;;; ;;; ;; ;; ;;;; -; ; ; ; ; ; ; ; ; ; ; ; ;; ; ; ; ; ; ; ; ;; ; ; ; -; ; ; ; ;;;;; ; ;;;; ; ; ; ; ; ; ; ; ; ; ; ; ;;; -; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; -; ; ; ; ; ; ; ; ; ; ; ;; ; ; ; ; ; ; ; ; ; ; ; ; ; -; ;;;;;;; ;;;; ;;; ;;;;; ;;;;; ;; ;;;;; ;;; ;;; ;;; ;;;;; ;;; ;;; ;;; ;;;; -; -; -; -; - - - (define-metafunction grammar - [(f (side-condition (number_1 number_2) - (< (term number_1) - (term number_2)))) - x] - [(f (number 1)) y] - [(f (number_1 2)) ,(+ (term number_1) 2)] - [(f (4 4)) q] - [(f (4 4)) r]) - - (define-metafunction grammar - [(g X) x]) - - (test (term (f (1 17))) 'x) - (test (term (f (11 1))) 'y) - (test (term (f (11 2))) 13) - - - ;; match two clauess => take first one - (test (term (f (4 4))) 'q) - - ;; match one clause two ways => error - (let () - (define-metafunction empty-language - [(ll (number_1 ... number_2 ...)) (number_1 ...)]) - (test (with-handlers ((exn? (λ (x) 'exn-raised))) - (term (ll ())) - 'no-exn) - 'no-exn) - (test (with-handlers ((exn? (λ (x) 'exn-raised))) - (term (ll (4 4))) - 'no-exn) - 'exn-raised)) - - ;; match no ways => error - (test (with-handlers ((exn? (λ (x) 'exn-raised))) (term (f mis-match)) 'no-exn) - 'exn-raised) - - (define-metafunction grammar - [(h (M_1 M_2)) ((h M_2) (h M_1))] - [(h number_1) ,(+ (term number_1) 1)]) - - (test (term (h ((1 2) 3))) - (term (4 (3 2)))) - - (define-metafunction grammar - [(h2 (Q_1 ...)) ((h2 Q_1) ...)] - [(h2 variable) z]) - - (test (term (h2 ((x y) a b c))) - (term ((z z) z z z))) - - (let () - (define-metafunction empty-language - [(f (1)) 1] - [(f (2)) 2] - [(f 3) 3]) - (test (in-domain? (f 1)) #f) - (test (in-domain? (f (1))) #t) - (test (in-domain? (f ((1)))) #f) - (test (in-domain? (f 3)) #t) - (test (in-domain? (f 4)) #f)) - - (let () - (define-metafunction empty-language - f : number -> number - [(f 1) 1]) - (test (in-domain? (f 1)) #t) - (test (in-domain? (f 2)) #t) - (test (in-domain? (f x)) #f)) - - (let () - (define-metafunction empty-language - [(f x) x]) - (test - (term-let ((y 'x)) - (in-domain? (f y))) - #t) - (test - (term-let ((y 'z)) - (in-domain? (f y))) - #f)) - - ;; mutually recursive metafunctions - (define-metafunction grammar - [(odd zero) #f] - [(odd (add1 UN_1)) (even UN_1)]) - - (define-metafunction grammar - [(even zero) #t] - [(even (add1 UN_1)) (odd UN_1)]) - - (test (term (odd (add1 (add1 (add1 (add1 zero)))))) - (term #f)) - - (let () - (define-metafunction empty-language - [(pRe xxx) 1]) - - (define-metafunction empty-language - [(Merge-Exns any_1) any_1]) - - (test (term (pRe (Merge-Exns xxx))) - 1)) - - (let () - (define-metafunction empty-language - [(f (x)) ,(term-let ([var-should-be-lookedup 'y]) (term (f var-should-be-lookedup)))] - [(f y) y] - [(f var-should-be-lookedup) var-should-be-lookedup]) ;; taking this case is bad! - - (test (term (f (x))) (term y))) - - (let () - (define-metafunction empty-language - [(f (x)) (x ,@(term-let ([var-should-be-lookedup 'y]) (term (f var-should-be-lookedup))) x)] - [(f y) (y)] - [(f var-should-be-lookedup) (var-should-be-lookedup)]) ;; taking this case is bad! - - (test (term (f (x))) (term (x y x)))) - - (let () - (define-metafunction empty-language - [(f (any_1 any_2)) - case1 - (side-condition (not (equal? (term any_1) (term any_2)))) - (side-condition (not (equal? (term any_1) 'x)))] - [(f (any_1 any_2)) - case2 - (side-condition (not (equal? (term any_1) (term any_2))))] - [(f (any_1 any_2)) - case3]) - (test (term (f (q r))) (term case1)) - (test (term (f (x y))) (term case2)) - (test (term (f (x x))) (term case3))) - - (let () - (define-metafunction empty-language - [(f (n number)) (n number)] - [(f (a any)) (a any)] - [(f (v variable)) (v variable)] - [(f (s string)) (s string)]) - (test (term (f (n 1))) (term (n 1))) - (test (term (f (a (#f "x" whatever)))) (term (a (#f "x" whatever)))) - (test (term (f (v x))) (term (v x))) - (test (term (f (s "x"))) (term (s "x")))) - - ;; test ..._1 patterns - (let () - (define-metafunction empty-language - [(zip ((variable_id ..._1) (number_val ..._1))) - ((variable_id number_val) ...)]) - - (test (term (zip ((a b) (1 2)))) (term ((a 1) (b 2))))) - - (let () - (define-metafunction empty-language - [(f any_1 any_2 any_3) (any_3 any_2 any_1)]) - (test (term (f 1 2 3)) - (term (3 2 1)))) - - (let () - (define-metafunction empty-language - [(f (any_1 any_2 any_3)) 3]) - (define-metafunction/extension f empty-language - [(g (any_1 any_2)) 2]) - (define-metafunction/extension g empty-language - [(h (any_1)) 1]) - (test (term (h (1))) 1) - (test (term (h (1 2))) 2) - (test (term (h (1 2 3))) 3)) - - (let () - (define-metafunction empty-language - [(f any_1 any_2 any_3) 3]) - (define-metafunction/extension f empty-language - [(g any_1 any_2) 2]) - (define-metafunction/extension g empty-language - [(h any_1) 1]) - (test (term (h 1)) 1) - (test (term (h 1 2)) 2) - (test (term (h 1 2 3)) 3)) - - (let () - (define-metafunction empty-language - [(f number_1 number_2) (f number_1)]) - (define-metafunction/extension f empty-language - [(g number_1) number_1]) - (define-metafunction empty-language - [(h number_1 number_2) (h number_1)] - [(h number_1) number_1]) - (test (term (g 11 17)) 11) - (test (term (h 11 17)) 11)) - - (let () - (define-metafunction empty-language - [(f (number_1 number_2)) - number_3 - (where number_3 ,(+ (term number_1) (term number_2)))]) - (test (term (f (11 17))) 28)) - - (let () - (define-metafunction empty-language - [(f variable) - (any_x any_x) - (where any_x (variable variable))]) - (test (term (f z)) - (term ((z z) (z z))))) - - (let () - (define-metafunction empty-language - [(f number_1) - number_1 - (where number_2 ,(add1 (term number_1))) - (where number_3 ,(add1 (term number_2))) - (side-condition (and (number? (term number_3)) - (= (term number_3) 4)))] - [(f any) 0]) - (test (term (f 2)) 2)) - - (let () - (define-language x-lang - (x variable)) - (define-metafunction x-lang - f : x x -> x - [(f x_1 x_2) x_1]) - (test (term (f p q)) (term p)) - (test (in-domain? (f p q)) #t)) - - (let () - (define-metafunction empty-language - [(err number_1 ... number_2 ...) (number_1 ...)]) - (test (term (err)) (term ())) - (test (with-handlers ((exn:fail:redex? (λ (x) 'right-exn)) - ((λ (x) #t) (λ (x) 'wrong-exn))) - (term (err 1 2)) - 'no-exn) - 'right-exn)) - - (let () - (define-metafunction empty-language - err : number ... -> number - [(err number ...) 1]) - (test (with-handlers ((exn:fail:redex? (λ (x) 'right-exn)) - ((λ (x) #t) (λ (x) 'wrong-exn))) - (term (err #f #t)) - 'no-exn) - 'right-exn)) - - (let () - (define-metafunction empty-language - err : number ... -> number - [(err number ...) #f]) - (test (with-handlers ((exn:fail:redex? (λ (x) 'right-exn)) - ((λ (x) #t) (λ (x) 'wrong-exn))) - (term (err 1 2)) - 'no-exn) - 'right-exn)) - - (let () - (define-metafunction empty-language - err : number ... -> (number number) - [(err number ...) (number ...)]) - (test (with-handlers ((exn:fail:redex? (λ (x) 'right-exn)) - ((λ (x) #t) (λ (x) 'wrong-exn))) - (term (err 1 2)) - 'no-exn) - 'no-exn) - (test (with-handlers ((exn:fail:redex? (λ (x) 'right-exn)) - ((λ (x) #t) (λ (x) 'wrong-exn))) - (term (err 1 1)) - 'no-exn) - 'no-exn)) - - (let () - ;; test that 'where' clauses can contain recursive calls. - (define-metafunction empty-language - [(f (any)) - x - (where x (f any))] - [(f any) any]) - (test (term (f ((((x)))))) - (term x))) - - (let () - (define-language lamv - (z variable hole)) - - (define-metafunction lamv - foo : z -> any - [(foo hole) dontcare] - [(foo variable) docare]) - - (test (term (foo hole)) - (term dontcare)) - (test (term (foo y)) - (term docare))) - - (let () - (define f-called? #f) - (define-metafunction empty-language - f : (side-condition any_1 (begin (set! f-called? #t) #t)) -> any - [(f any_1) any_1]) - (test (term (f 1)) 1) - (test f-called? #t)) - - (let () - (define g-called? #f) - (define-metafunction empty-language - g : any -> (side-condition any_1 (begin (set! g-called? #t) #t)) - [(g any_1) any_1]) - (test (term (g 1)) 1) - (test g-called? #t)) - - ;; test that tracing works properly - ;; note that caching comes into play here (which is why we don't see the recursive calls) - (let () - (define-metafunction empty-language - [(f 0) 0] - [(f number) (f ,(- (term number) 1))]) - - (let ([sp (open-output-string)]) - (parameterize ([current-output-port sp]) - (term (f 1))) - (test (get-output-string sp) "")) - - (let ([sp (open-output-string)]) - (parameterize ([current-output-port sp] - [current-traced-metafunctions 'all]) - (term (f 1))) - (test (get-output-string sp) ">(f 1)\n<0\n")) - - (let ([sp (open-output-string)]) - (parameterize ([current-output-port sp] - [current-traced-metafunctions '(f)]) - (term (f 1))) - (test (get-output-string sp) ">(f 1)\n<0\n"))) - - (let () - (define-language var-lang [(x y z w) variable]) - - ;; this should produce the second case, - ;; since the where clause (should) fail to match - ;; in the first case. - (define-metafunction var-lang - [(f x) - first-case - (where (AnotherAtom y) (Atom x))] - [(f x) - second-case]) - - (test (term (f a)) (term second-case))) - - (let () - - ;; this is an ambiguous function - ;; and should signal an error if it is ever called - ;; with multiple different arguments, but if the - ;; arguments are all the same, it will return - ;; the same result for any parse, and thus should be allowed. - (define-metafunction empty-language - [(f any_x ... any_y any_z ...) - any_y]) - - (test (term (f 1 1 1 1 1)) (term 1))) - - (let () - (define-metafunction empty-language - [(ex variable_x) - variable_x - (where quote variable_x)]) - - (test (term (ex quote)) (term quote))) - - (let () - (define-metafunction empty-language - [(f any ...) - (any ...) - (where variable_1 x) - (side-condition #f) - (where (number ...) y)] - [(f any ...) - 12345]) - - (test (term (f 8)) 12345)) - - -; -; -; -; -; -; -; ;; ;;; ;; ;; ;; ;; -; ;; ;;; ;; ;; ;;; ;; -; ;;;;; ;;;; ;;;;; ;; ;; ;;; ;;;; ;;;; ;;;; ;; ;;;; ;;;;; ;; ;;;; ;; ;;; -; ;;;;;; ;; ;; ;;;; ;; ;;;;;; ;; ;; ;;;; ;; ;; ;; ;; ;; ;;;; ;; ;;;;;; ;;;;;; -; ;;; ;; ;;;;;;;; ;; ;; ;; ;; ;;;;;;;;;;;; ;; ;;;;;;;; ;; ;;;; ;;; ;; ;;; ;;; ;; ;; -; ;;; ;; ;;; ;; ;; ;; ;; ;;; ;;;; ;; ;;; ;; ;;; ;; ;;; ;; ;;; ;;; ;; ;; -; ;;;;;; ;;; ;; ;; ;; ;; ;; ;;; ;; ;; ;;; ;; ;; ;;; ;; ;;;; ;; ;;;;;; ;; ;; -; ;;;;; ;;;; ;; ;; ;; ;; ;;;; ;; ;;;; ;; ;;;;;; ;;; ;; ;;;; ;; ;; -; -; -; - - - (let () - (define-relation empty-language - [(<: any any) #t]) - - (test (term (<: 1 1)) #t) - (test (term (<: 1 2)) #f)) - - (let () - (define-relation empty-language - [(<: number_1 number_2) ,(< (term number_1) (term number_2))] - [(<: number_1 number_1) #t]) - - (test (term (<: 1 2)) #t) - (test (term (<: 1 1)) #t) - (test (term (<: 2 1)) #f)) - - (let () - (define-relation empty-language - [(<: number_1 ... number_2 number_3 ... number_2 number_4 ...) #t]) - - (test (term (<: 1 2 3 4)) #f) - (test (term (<: 1 1 2 3 4)) #t) - (test (term (<: 1 2 1 3 4)) #t) - (test (term (<: 1 2 3 1 4)) #t) - (test (term (<: 1 2 3 4 1)) #t)) - - (let () - (define-relation empty-language - [(<: number_1 number_1)]) - (test (term (<: 1 1)) #t) - (test (term (<: 1 2)) #f)) - - (let () - (define-relation empty-language - [(<: number_1 number_2 number_3) - ,(= (term number_1) (term number_2)) - ,(= (term number_2) (term number_3))]) - (test (term (<: 1 2 3)) #f) - (test (term (<: 1 1 2)) #f) - (test (term (<: 1 2 2)) #f) - (test (term (<: 1 1 1)) #t)) - - -; ;; ; ;; ; -; ; ; ; ; -; ;; ;; ;;; ;; ; ;; ;; ;;;; ;;;;; ;;; ;;; ;; ;; ;; ;; ;;; ; ;;; ;;;;; ;;; ;;; ;; ;; -; ;; ; ; ; ;; ; ; ; ; ; ; ; ; ;; ; ;; ; ; ; ; ; ; ; ; ; ;; ; -; ; ;;;;; ; ; ; ; ; ; ; ; ; ; ; ;;;;; ; ;;;;; ; ;;;; ; ; ; ; ; ; -; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; -; ; ; ; ; ; ;; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; -; ;;;;; ;;;; ;;;;; ;; ;; ;;; ;;; ;;;;; ;;; ;;; ;;; ;;;;; ;;;; ;;;;; ;;;;; ;;; ;;;;; ;;; ;;; ;;; -; -; -; -; - - - - (test (apply-reduction-relation - (reduction-relation - grammar - (--> (in-hole E_1 (number_1 number_2)) - (in-hole E_1 ,(* (term number_1) (term number_2))))) - '((2 3) (4 5))) - (list '(6 (4 5)))) - - (test (apply-reduction-relation - (reduction-relation - grammar - (~~> (number_1 number_2) - ,(* (term number_1) (term number_2))) - with - [(--> (in-hole E_1 a) (in-hole E_1 b)) (~~> a b)]) - '((2 3) (4 5))) - (list '(6 (4 5)))) - - (test (apply-reduction-relation - (reduction-relation - grammar - (==> (number_1 number_2) - ,(* (term number_1) (term number_2))) - with - [(--> (M_1 a) (M_1 b)) (~~> a b)] - [(~~> (M_1 a) (M_1 b)) (==> a b)]) - '((1 2) ((2 3) (4 5)))) - (list '((1 2) ((2 3) 20)))) - - (test (apply-reduction-relation - (reduction-relation - grammar - (~~> (number_1 number_2) - ,(* (term number_1) (term number_2))) - (==> (number_1 number_2) - ,(* (term number_1) (term number_2))) - with - [(--> (M_1 a) (M_1 b)) (~~> a b)] - [(--> (a M_1) (b M_1)) (==> a b)]) - '((2 3) (4 5))) - (list '(6 (4 5)) - '((2 3) 20))) - - (test (apply-reduction-relation - (reduction-relation - grammar - (--> (M_1 (number_1 number_2)) - (M_1 ,(* (term number_1) (term number_2)))) - (==> (number_1 number_2) - ,(* (term number_1) (term number_2))) - with - [(--> (a M_1) (b M_1)) (==> a b)]) - '((2 3) (4 5))) - (list '((2 3) 20) - '(6 (4 5)))) - - ; shortcuts like this fail if compilation fails to preserve - ; lexical context for side-conditions expressions. - (test (let ([x #t]) - (apply-reduction-relation - (reduction-relation - grammar - (==> variable variable) - with - [(--> (a (side-condition number x)) b) - (==> a b)]) - '(x 4))) - '(x)) - - (test (apply-reduction-relation/tag-with-names - (reduction-relation - grammar - (--> (number_1 number_2) - ,(* (term number_1) (term number_2)) - mul)) - '(4 5)) - (list (list "mul" 20))) - - (test (apply-reduction-relation/tag-with-names - (reduction-relation - grammar - (--> (number_1 number_2) - ,(* (term number_1) (term number_2)) - "mul")) - '(4 5)) - (list (list "mul" 20))) - - (test (apply-reduction-relation/tag-with-names - (reduction-relation - grammar - (--> (number_1 number_2) - ,(* (term number_1) (term number_2)))) - '(4 5)) - (list (list #f 20))) - - (test (apply-reduction-relation/tag-with-names - (reduction-relation - grammar - (==> (number_1 number_2) - ,(* (term number_1) (term number_2)) - mult) - with - [(--> (M_1 a) (M_1 b)) (==> a b)]) - '((2 3) (4 5))) - (list (list "mult" '((2 3) 20)))) - - (test (apply-reduction-relation - (union-reduction-relations - (reduction-relation empty-language - (--> x a) - (--> x b)) - (reduction-relation empty-language - (--> x c) - (--> x d))) - 'x) - (list 'a 'b 'c 'd)) - - (test (apply-reduction-relation - (union-reduction-relations - (reduction-relation empty-language (--> x a)) - (reduction-relation empty-language (--> x b)) - (reduction-relation empty-language (--> x c)) - (reduction-relation empty-language (--> x d))) - 'x) - (list 'a 'b 'c 'd)) - - (test (apply-reduction-relation - (reduction-relation - empty-language - (--> (number_1 number_2) - number_2 - (side-condition (< (term number_1) (term number_2)))) - (--> (number_1 number_2) - number_1 - (side-condition (< (term number_2) (term number_1))))) - '(1 2)) - (list 2)) - - (test (apply-reduction-relation - (reduction-relation - empty-language - (--> x #f)) - (term x)) - (list #f)) - - (define-language x-language - (x variable)) - - (test (apply-reduction-relation - (reduction-relation - x-language - (--> x (x x))) - 'y) - (list '(y y))) - - (test (apply-reduction-relation - (reduction-relation - x-language - (--> (x ...) ((x ...)))) - '(p q r)) - (list '((p q r)))) - - #; - (test (apply-reduction-relation - (reduction-relation - empty-language - #:main-arrow :-> - (:-> 1 2)) - 1) - '(2)) - - (test (apply-reduction-relation - (reduction-relation - empty-language - #:domain number - (--> 1 2)) - 1) - '(2)) - - - (test (let ([red - (reduction-relation - empty-language - #:domain number - (--> 1 2))]) - (with-handlers ((exn? exn-message)) - (apply-reduction-relation red 'x) - 'no-exception-raised)) - "reduction-relation: relation not defined for x") - - (test (let ([red - (reduction-relation - empty-language - #:domain number - (--> 1 x))]) - (with-handlers ((exn? exn-message)) - (apply-reduction-relation red 1) - 'no-exception-raised)) - "reduction-relation: relation reduced to x via rule #0 (counting from 0), which is outside its domain") - - (let* ([red1 - (reduction-relation - empty-language - #:domain (side-condition number_1 (even? (term number_1))) - (--> number number))] - [red2 - (reduction-relation - empty-language - #:domain (side-condition number_1 (odd? (term number_1))) - (--> number number))] - [red-c - (union-reduction-relations red1 red2)]) - - ;; ensure first branch of 'union' is checked - (test (with-handlers ((exn? exn-message)) - (apply-reduction-relation red-c 1) - 'no-exception-raised) - "reduction-relation: relation not defined for 1") - - ;; ensure second branch of 'union' is checked - (test (with-handlers ((exn? exn-message)) - (apply-reduction-relation red-c 2) - 'no-exception-raised) - "reduction-relation: relation not defined for 2")) - - (let () - (define-language l1 - (D 0 1 2)) - (define r1 - (reduction-relation - l1 - #:domain D - (--> D D))) - (define-language l2 - (D 0 1 2 3)) - (define r2 - (extend-reduction-relation r1 l2)) - - ;; test that the domain is re-interpreted for the extended reduction-relation - (test (apply-reduction-relation r2 3) - '(3))) - - (let () - (define-language l1 - (D 0 1 2)) - (define r1 - (reduction-relation - l1 - #:domain (D D) - (--> (D_1 D_2) (D_2 D_1)))) - - ;; test that duplicated identifiers in the domain contract do not have to be equal - (test (apply-reduction-relation r1 (term (1 2))) - (list (term (2 1))))) - - ;;test that #:arrow keyword works - (test (apply-reduction-relation - (reduction-relation - empty-language - #:arrow :-> - (:-> 1 2)) - 1) - '(2)) - - (let () - (define-language n-lang - [n number]) - (test (apply-reduction-relation - (reduction-relation n-lang [--> any ,(length (redex-match n-lang n 1))]) - 11) - '(1))) - - (parameterize ([current-namespace syn-err-test-namespace]) - (eval (quote-syntax - (define-language grammar - (M (M M) - number) - (E hole - (E M) - (number E)) - (X (number any) - (any number)) - (Q (Q ...) - variable) - (UN (add1 UN) - zero))))) - - (test-syn-err (reduction-relation - grammar - (~~> (number_1 number_2) - ,(* (term number_1) (term number_2))) - with - [(--> (M a) (M b)) (~~> a b)] - [(~~> (M a) (M b)) (==> a b)]) - #rx"no rules") - - (test-syn-err (reduction-relation grammar) - #rx"no rules use -->") - - (test-syn-err (reduction-relation - grammar - (~~> (number_1 number_2) - ,(* (term number_1) (term number_2)))) - #rx"~~> relation is not defined") - - (test-syn-err (reduction-relation - grammar - (--> (number_1 number_2) - ,(* (term number_1) (term number_2)) - mult) - (--> (number_1 number_2) - ,(* (term number_1) (term number_2)) - mult)) - #rx"same name on multiple rules") - - (test-syn-err (reduction-relation - grammar - (--> 1 2) - (==> 3 4)) - #rx"not defined.*==>") - - (test-syn-err (reduction-relation - empty-language - (--> 1 2) - (==> 3 4) - with - [(~> a b) (==> a b)]) - #rx"not defined.*~>") - - (test-syn-err (define-language bad-lang1 (e name)) #rx"name") - (test-syn-err (define-language bad-lang2 (name x)) #rx"name") - (test-syn-err (define-language bad-lang3 (x_y x)) #rx"x_y") - (test-syn-err (define-language bad-lang4 (a 1 2) (b)) #rx"no productions") - (test-syn-err (let () - (define-language good-lang (a 1 2)) - (define-extended-language bad-lang5 good-lang (a) (b 2))) - #rx"no productions") - - ;; expect union with duplicate names to fail - (test (with-handlers ((exn? (λ (x) 'passed))) - (union-reduction-relations - (reduction-relation - grammar - (--> (number_1 number_2) - ,(* (term number_1) (term number_2)) - mult)) - (reduction-relation - grammar - (--> (number_1 number_2) - ,(* (term number_1) (term number_2)) - mult))) - 'failed) - 'passed) - - (test (with-handlers ((exn? (λ (x) 'passed))) - (union-reduction-relations - (union-reduction-relations - (reduction-relation - grammar - (--> (number_1 number_2) - ,(* (term number_1) (term number_2)) - mult)) - (reduction-relation - grammar - (--> (number_1 number_2) - ,(* (term number_1) (term number_2)) - mult3))) - - (union-reduction-relations - (reduction-relation - grammar - (--> (number_1 number_2) - ,(* (term number_1) (term number_2)) - mult)) - (reduction-relation - grammar - (--> (number_1 number_2) - ,(* (term number_1) (term number_2)) - mult2)))) - 'passed) - 'passed) - - ;; sorting in this test case is so that the results come out in a predictable manner. - (test (sort - (apply-reduction-relation - (compatible-closure - (reduction-relation - grammar - (--> (number_1 number_2) - ,(* (term number_1) (term number_2)) - mult)) - grammar - M) - '((2 3) (4 5))) - (λ (x y) (string<=? (format "~s" x) (format "~s" y)))) - (list '((2 3) 20) - '(6 (4 5)))) - - (test (apply-reduction-relation - (compatible-closure - (reduction-relation - grammar - (--> (number_1 number_2) - ,(* (term number_1) (term number_2)) - mult)) - grammar - M) - '(4 2)) - (list '8)) - - (test (apply-reduction-relation - (context-closure - (context-closure - (reduction-relation grammar (--> 1 2)) - grammar - (y hole)) - grammar - (x hole)) - '(x (y 1))) - (list '(x (y 2)))) - - (test (apply-reduction-relation - (reduction-relation - grammar - (--> (variable_1 variable_2) - (variable_1 variable_2 x) - mul - (fresh x))) - '(x x1)) - (list '(x x1 x2))) - - (test (apply-reduction-relation - (reduction-relation - grammar - (~~> number - x - (fresh x)) - with - [(--> (variable_1 variable_2 a) (variable_1 variable_2 b)) (~~> a b)]) - '(x x1 2)) - (list '(x x1 x2))) - - (test (apply-reduction-relation - (reduction-relation - x-language - (--> (x_1 ...) - (x ...) - (fresh ((x ...) (x_1 ...))))) - '(x y x1)) - (list '(x2 x3 x4))) - - (test (apply-reduction-relation - (reduction-relation - empty-language - (--> (variable_1 ...) - (x ... variable_1 ...) - (fresh ((x ...) (variable_1 ...) (variable_1 ...))))) - '(x y z)) - (list '(x1 y1 z1 x y z))) - - (test (apply-reduction-relation - (reduction-relation - empty-language - (--> any (any_y x) - (where any_y x) - (fresh x))) - (term junk)) - (list '(x x1))) - - (test (apply-reduction-relation - (reduction-relation - empty-language - (--> (variable ...) (variable_0 ... variable_1 ...) - (fresh ((variable_0 ...) (variable ...))) - (fresh ((variable_1 ...) (variable ...))))) - (term (x y))) - (list '(variable_0 variable_1 variable_2 variable_3))) - - - ;; test that redex match can be used in a side-condition - ;; with the same language that is used to define the - ;; reduction relation. - (test (apply-reduction-relation - (reduction-relation - empty-language - (--> any_1 3 - (side-condition (redex-match empty-language (any_1 any_2) (term any_1))))) - '(a b)) - '(3)) - - (test (apply-reduction-relation - (reduction-relation - empty-language - (--> variable_1 - (x variable_1) - (fresh (x variable_1)))) - 'q) - (list '(q1 q))) - - (test (apply-reduction-relation - (extend-reduction-relation (reduction-relation empty-language (--> 1 2)) - empty-language - (--> 1 3)) - 1) - '(3 2)) - - (let () - (define-language e1 - (e 1)) - (define-language e2 - (e 2)) - (define red1 (reduction-relation e1 (--> e (e e)))) - (define red2 (extend-reduction-relation red1 e2 (--> ignoreme ignoreme))) - (test (apply-reduction-relation red1 1) '((1 1))) - (test (apply-reduction-relation red1 2) '()) - (test (apply-reduction-relation red2 1) '()) - (test (apply-reduction-relation red2 2) '((2 2)))) - - (let () - (define red1 (reduction-relation empty-language - (--> a (a a) - a) - (--> b (b b) - b) - (--> q x))) - (define red2 (extend-reduction-relation red1 - empty-language - (--> a (c c) - a) - (--> q z))) - (test (apply-reduction-relation red1 (term a)) (list (term (a a)))) - (test (apply-reduction-relation red1 (term b)) (list (term (b b)))) - (test (apply-reduction-relation red1 (term q)) (list (term x))) - (test (apply-reduction-relation red2 (term a)) (list (term (c c)))) - (test (apply-reduction-relation red2 (term b)) (list (term (b b)))) - (test (apply-reduction-relation red2 (term q)) (list (term z) (term x)))) - - (let () - (define red1 - (reduction-relation - empty-language - (==> a (a a) - a) - (==> b (b b) - b) - (==> q w) - with - [(--> (X a) (X b)) (==> a b)])) - - (define red2 - (extend-reduction-relation - red1 - empty-language - (==> a (c c) - a) - (==> q z) - with - [(--> (X a) (X b)) (==> a b)])) - - (test (apply-reduction-relation red1 (term (X a))) (list (term (X (a a))))) - (test (apply-reduction-relation red1 (term (X b))) (list (term (X (b b))))) - (test (apply-reduction-relation red1 (term (X q))) (list (term (X w)))) - (test (apply-reduction-relation red2 (term (X a))) (list (term (X (c c))))) - (test (apply-reduction-relation red2 (term (X b))) (list (term (X (b b))))) - (test (apply-reduction-relation red2 (term (X q))) (list (term (X z)) - (term (X w))))) - - (test (reduction-relation->rule-names - (reduction-relation - empty-language - (--> x y a))) - '(a)) - - (test (reduction-relation->rule-names - (reduction-relation - empty-language - (--> x y a) - (--> y z b) - (--> z w c))) - '(a b c)) - - (test (reduction-relation->rule-names - (reduction-relation - empty-language - (--> x y a) - (--> y z b) - (--> z w c) - (--> p q z) - (--> q r y) - (--> r p x))) - '(a b c z y x)) - - (test (reduction-relation->rule-names - (extend-reduction-relation - (reduction-relation - empty-language - (--> x y a) - (--> y z b) - (--> z w c)) - empty-language - (--> p q z) - (--> q r y) - (--> r p x))) - '(a b c z y x)) - - (test (reduction-relation->rule-names - (union-reduction-relations - (reduction-relation - empty-language - (--> x y a) - (--> y z b) - (--> z w c)) - (reduction-relation - empty-language - (--> p q z) - (--> q r y) - (--> r p x)))) - '(a b c z y x)) - - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - ;; - ;; examples from doc.txt - ;; - - (define-language lc-lang - (e (e e ...) - x - v) - (c (v ... c e ...) - hole) - (v (lambda (x ...) e)) - (x variable-not-otherwise-mentioned)) - - (test (let ([m (redex-match lc-lang e (term (lambda (x) x)))]) - (and m (length m))) - 1) - - (define-extended-language qabc-lang lc-lang (q a b c)) - - (test (redex-match qabc-lang - e - (term (lambda (a) a))) - #f) - - (test (let ([m (redex-match qabc-lang - e - (term (lambda (z) z)))]) - (and m (length m))) - 1) - - (require (lib "list.ss")) - (let () - (define-metafunction lc-lang - free-vars : e -> (x ...) - [(free-vars (e_1 e_2 ...)) - (∪ (free-vars e_1) (free-vars e_2) ...)] - [(free-vars x) (x)] - [(free-vars (lambda (x ...) e)) - (- (free-vars e) (x ...))]) - - (define-metafunction lc-lang - ∪ : (x ...) ... -> (x ...) - [(∪ (x_1 ...) (x_2 ...) (x_3 ...) ...) - (∪ (x_1 ... x_2 ...) (x_3 ...) ...)] - [(∪ (x_1 ...)) - (x_1 ...)] - [(∪) ()]) - - (define-metafunction lc-lang - - : (x ...) (x ...) -> (x ...) - [(- (x ...) ()) (x ...)] - [(- (x_1 ... x_2 x_3 ...) (x_2 x_4 ...)) - (- (x_1 ... x_3 ...) (x_2 x_4 ...)) - (side-condition (not (memq (term x_2) (term (x_3 ...)))))] - [(- (x_1 ...) (x_2 x_3 ...)) - (- (x_1 ...) (x_3 ...))]) - - (test (term (∪)) (term ())) - (test (term (∪ (x y) (z a) (b c))) (term (x y z a b c))) - - (test (term (- (x y) ())) (term (x y))) - (test (term (- (x y) (x))) (term (y))) - (test (term (- (y x) (x))) (term (y))) - (test (term (- (x x x x x) (x))) (term ())) - - (test (term (free-vars (lambda (x) (x y)))) (list 'y)) - (test (term (free-vars (a (b (c (d e)))))) (term (a b c d e)))) - - (test (variable-not-in (term (x y z)) 'x) - (term x1)) - - (test (variable-not-in (term (y z)) 'x) - (term x)) - (test (variable-not-in (term (x x1 x2 x3 x4 x5 x6 x7 x8 x9 x10)) 'x) - (term x11)) - (test (variable-not-in (term (x x11)) 'x) - (term x1)) - (test (variable-not-in (term (x x1 x2 x3)) 'x1) - (term x4)) - (test (variable-not-in (term (x x1 x1 x2 x2)) 'x) - (term x3)) - - (test (variables-not-in (term (x y z)) '(x)) - '(x1)) - (test (variables-not-in (term (x2 y z)) '(x x x)) - '(x x1 x3)) - - (test ((term-match/single empty-language - [(variable_x variable_y) - (cons (term variable_x) - (term variable_y))]) - '(x y)) - '(x . y)) - - (test ((term-match/single empty-language - [(side-condition (variable_x variable_y) - (eq? (term variable_x) 'x)) - (cons (term variable_x) - (term variable_y))]) - '(x y)) - '(x . y)) - - - (test (with-handlers ((exn:fail:redex? (λ (x) 'right-exn)) - ((λ (x) #t) (λ (x) 'wrong-exn))) - ((term-match/single empty-language - [(number_1 ... number_2 ...) 1]) - '(1 2 3)) - 'no-exn) - 'right-exn) - - (test (with-handlers ((exn:fail:redex? (λ (x) 'right-exn)) - ((λ (x) #t) (λ (x) 'wrong-exn))) - ((term-match/single empty-language - [(number_1 ... number_2 ...) 1]) - 'x) - 'no-exn) - 'right-exn) - - (test ((term-match empty-language - [(number_1 ... number_2 ...) 1]) - 'x) - '()) - - (define-language x-is-1-language - [x 1]) - - (test ((term-match/single x-is-1-language - [(x x) - 1]) - '(1 1)) - 1) - - (test (call-with-values - (λ () - ((term-match/single empty-language - [() (values 1 2)]) - '())) - list) - '(1 2)) - - (test (let ([x 0]) - (cons ((term-match empty-language - [(any_a ... number_1 any_b ...) - (begin (set! x (+ x 1)) - (term number_1))]) - '(1 2 3)) - x)) - '((3 2 1) . 3)) - - (test ((term-match empty-language - [number_1 - (term number_1)] - [number_1 - (term number_1)]) - '1) - '(1 1)) - - (test (apply-reduction-relation - (reduction-relation - x-language - (--> (x_one x_!_one x_!_one x_!_one) - (x_one x_!_one))) - (term (a a b c))) - (list (term (a x_!_one)))) - - ;; tests `where' clauses in reduction relation - (test (apply-reduction-relation - (reduction-relation empty-language - (--> number_1 - any_y - (where any_y ,(+ 1 (term number_1))))) - 3) - '(4)) - - ;; tests `where' clauses scoping - (test (let ([x 5]) - (apply-reduction-relation - (reduction-relation empty-language - (--> any - any_z - (where any_y ,x) - (where any_x 2) - (where any_z ,(+ (term any_y) (term any_x))))) - 'whatever)) - '(7)) - - ;; tests `where' clauses bind in side-conditions - (test (let ([x 'unk]) - (apply-reduction-relation - (reduction-relation empty-language - (--> any - the-result - (where any_y any) - (side-condition (eq? (term any_y) 'whatever)))) - 'whatever)) - '(the-result)) - - ;; test that where clauses bind in side-conditions that follow - (let ([save1 #f] - [save2 #f]) - (term-let ([any_y (term outer-y)]) - (test (begin (apply-reduction-relation - (reduction-relation empty-language - (--> number_1 - any_y - (side-condition (set! save1 (term any_y))) - (where any_y inner-y) - (side-condition (set! save2 (term any_y))))) - 3) - (list save1 save2)) - (list 'outer-y 'inner-y)))) - - (test (apply-reduction-relation - (reduction-relation empty-language - (--> any - any_y - (fresh x) - (where any_y x))) - 'x) - '(x1)) - - (let () - ;; tests where's ability to have redex patterns, not just syntax-case patterns - (define-language var-lang [(x y z w) variable]) - - (define red - (reduction-relation - var-lang - (--> (x ...) - (y ... z ...) - (where (y ... w z ...) (x ...))))) - - (test (apply-reduction-relation red (term (a b c))) - (list (term (a b)) (term (a c)) (term (b c))))) - - - (let ([r (reduction-relation - grammar - (->1 1 2) - (->2 3 4) - (->4 5 6) - with - [(--> (side-condition (a number) (even? (term number))) b) - (->1 a b)] - [(--> (X - (number number) - (X_1 X_1) - (M_!_1 M_!_1) - (1 ..._1 1 ..._1) - (1 ..._!_1 1 ..._!_1)) - b) - (->2 X b)] - [(--> (a 1) b) - (->3 a b)] - [(->3 (a 2) b) - (->4 a b)])]) - - ; test that names are properly bound for side-conditions in shortcuts - (let* ([lhs ((rewrite-proc-lhs (first (reduction-relation-make-procs r))) grammar)] - [proc (third lhs)] - [name (cadadr lhs)] - [bind (λ (n) (make-bindings (list (make-bind name n))))]) - (test (and (proc (bind 4)) (not (proc (bind 3)))) #t)) - - ; test binder renaming - (let ([sym-mtch? (λ (rx) (λ (s) (and (symbol? s) (regexp-match? rx (symbol->string s)))))]) - (match (rewrite-proc-lhs (second (reduction-relation-make-procs r))) - [`(3 - (,(and n1 (? (sym-mtch? #px"^number_\\d+$"))) ,n1) - (,(and n2 (? (sym-mtch? #px"^X_1\\d+$"))) ,n2) - (,(and m1 (? (sym-mtch? #px"^M_!_1\\d+$"))) ,m1) - (1 ,(and ...1 (? (sym-mtch? #px"^\\.\\.\\._1\\d+$"))) 1 ,...1) - (1 ,(and ...!1 (? (sym-mtch? #px"^\\.\\.\\._!_1\\d+$"))) 1 ,...!1)) - #t] - [else #f])) - - ; test shortcut in terms of shortcut - (test (match ((rewrite-proc-lhs (third (reduction-relation-make-procs r))) grammar) - [`(((side-condition 5 ,(? procedure?) ,_) 2) 1) #t] - [else #f]) - #t)) - - (let ([< (λ (c d) (string number (q ,(add1 (term number))) - (side-condition (odd? (term number))) - side-condition) - (--> 1 4 plain) - (==> 2 t - shortcut) - with - [(--> (q a) b) - (==> a b)])] - [c (make-coverage R)]) - (parameterize ([relation-coverage (list c)]) - (apply-reduction-relation R 4) - (test (sort (covered-cases c) <) - '(("plain" . 0) ("shortcut" . 0) ("side-condition" . 0))) - - (apply-reduction-relation R 3) - (test (sort (covered-cases c) <) - '(("plain" . 0) ("shortcut" . 0) ("side-condition" . 1))) - - (apply-reduction-relation* R 1) - (test (sort (covered-cases c) <) - '(("plain" . 1) ("shortcut" . 1) ("side-condition" . 2))))) - - (let* ([S (reduction-relation - empty-language - (--> 1 1 uno))] - [S+ (extend-reduction-relation - S empty-language - (--> 2 2 dos))]) - (let ([c (make-coverage S+)]) - (parameterize ([relation-coverage (list c)]) - (apply-reduction-relation S (term 1)) - (test (sort (covered-cases c) <) - '(("dos" . 0) ("uno" . 1))))) - (let ([c (make-coverage S)]) - (parameterize ([relation-coverage (list c)]) - (apply-reduction-relation S+ (term 1)) - (test (sort (covered-cases c) <) - '(("uno" . 1)))))) - - (let* ([T (reduction-relation empty-language (--> any any))] - [c (make-coverage T)]) - (parameterize ([relation-coverage (list c)]) - (apply-reduction-relation T (term q)) - (test (and (regexp-match #px"tl-test.ss:\\d+:\\d+" (caar (covered-cases c))) #t) - #t)))) - - (let* ([R (reduction-relation - empty-language - (--> any any id))] - [c (make-coverage R)] - [c* (make-coverage R)]) - (parameterize ([relation-coverage (list c c*)]) - (apply-reduction-relation R 4) - (test (covered-cases c) '(("id" . 1))) - (test (covered-cases c*) '(("id" . 1))))) - - (let* ([< (λ (c d) - (let ([line-no (compose - string->number - second - (curry regexp-match #px".*:(\\d+):\\d+"))]) - (< (line-no (car c)) (line-no (car d)))))] - [src-ok? (curry regexp-match? #px"tl-test.ss:\\d+:\\d+")] - [sorted-counts (λ (cc) (map cdr (sort (covered-cases cc) <)))]) - (define-metafunction empty-language - [(f 1) 1] - [(f 2) 2]) - (define-metafunction/extension f empty-language - [(g 3) 3]) - (define-relation empty-language - [(R number) - ,(even? (term number))] - [(R number) - ,(= 3 (term number))]) - - (let ([fc (make-coverage f)] - [rc (make-coverage (reduction-relation empty-language (--> any any)))]) - (parameterize ([relation-coverage (list rc fc)]) - (term (f 2)) - (test (andmap (compose src-ok? car) (covered-cases fc)) - #t) - (test (sorted-counts fc) '(0 1)) - - (term (f 1)) - (term (f 1)) - (test (sorted-counts fc) '(2 1)))) - - (let ([c (make-coverage f)]) - (parameterize ([relation-coverage (list c)]) - (term (g 1)) - (test (sorted-counts c) '(1 0)))) - (let ([c (make-coverage g)]) - (parameterize ([relation-coverage (list c)]) - (term (f 1)) - (test (sorted-counts c) '(1 0 0)))) - - (let ([c (make-coverage R)]) - (parameterize ([relation-coverage (list c)]) - (term (R 2)) - (term (R 3)) - (term (R 5)) - (test (sorted-counts c) '(1 1)))) - - (let ([c (make-coverage f)] - [c* (make-coverage f)]) - (parameterize ([relation-coverage (list c* c)]) - (term (f 1)) - (test (sorted-counts c) '(1 0)) - (test (sorted-counts c*) '(1 0))))) - -; -; -; -; -; ;;; -; ;; ;; ; ;; ;; -; ;; ;; ; ;; ;; -; ;;;;; ;;; ;;; ;;;;; ;; ;;; ;;;; ;;;; -; ;; ;; ;; ;; ; ;; ;;;;;;;; ;; ;;; ;; ; ;; ;; -; ;; ;;;;; ;;; ;; ;;; ;; ; ;; ;; ;; ;; -; ;; ;; ;; ;; ;;; ;; ;;;; ;; ;; ;; -; ;; ;; ; ; ;; ;; ;; ;; ;; ;; ; ;; ;; -; ;;;; ;;; ;;; ;;;; ; ;;;;; ;; ;;;; ;;;; -; -; -; - - - (define-syntax-rule - (capture-output arg1 args ...) - (let ([p (open-output-string)]) - (parameterize ([current-output-port p] - [current-error-port p]) - arg1 args ...) - (get-output-string p))) - - (let () - (define red (reduction-relation empty-language (--> 1 2))) - (test (capture-output (test-->> red 1 2) (test-results)) - "One test passed.\n") - (test (capture-output (test-->> red 2 3) (test-results)) - #rx"FAILED tl-test.ss:[0-9.]+\nexpected: 3\n actual: 2\n1 test failed \\(out of 1 total\\).\n")) - - (let () - (define red-share (reduction-relation - empty-language - (--> a b) - (--> a c) - (--> c d) - (--> b d))) - (test (capture-output (test-->> red-share (term a) (term d)) (test-results)) - "One test passed.\n")) - - (let () - (define red-cycle (reduction-relation - empty-language - (--> a a))) - (test (capture-output (test-->> red-cycle #:cycles-ok (term a)) (test-results)) - "One test passed.\n") - (test (capture-output (test-->> red-cycle (term a)) (test-results)) - #rx"FAILED tl-test.ss:[0-9.]+\nfound a cycle in the reduction graph\n1 test failed \\(out of 1 total\\).\n")) - - (let () - (define-metafunction empty-language [(f any) ((any))]) - (test (capture-output (test-equal (term (f 1)) (term ((1)))) - (test-results)) - "One test passed.\n")) - - (let () - (test (capture-output (test-predicate odd? 1) - (test-results)) - "One test passed.\n")) - - (let () - (define red (reduction-relation empty-language (--> any (any)))) - (test (capture-output (test--> red (term (1 2 3)) (term ((1 2 3)))) (test-results)) - "One test passed.\n")) - - (let () - (define red (reduction-relation empty-language - (--> any (any)) - (--> (any) any))) - (test (capture-output (test--> red (term (x)) (term ((x))) (term x)) (test-results)) - "One test passed.\n") - (test (capture-output (test--> red (term (x)) (term x) (term ((x)))) (test-results)) - "One test passed.\n")) - - (print-tests-passed 'tl-test.ss)) From 812a049b5bf8ad1a420374127547418f1f58f2b3 Mon Sep 17 00:00:00 2001 From: Robby Findler Date: Tue, 26 Jan 2010 19:47:44 +0000 Subject: [PATCH 070/113] svn: r17838 --- collects/redex/private/bitmap-test-util.ss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/collects/redex/private/bitmap-test-util.ss b/collects/redex/private/bitmap-test-util.ss index a830bf76b7..95f039e940 100644 --- a/collects/redex/private/bitmap-test-util.ss +++ b/collects/redex/private/bitmap-test-util.ss @@ -3,7 +3,7 @@ slideshow "../pict.ss" "../reduction-semantics.ss" - "config.ss") + "../tests/config.ss") (provide test done) From 3068ae4bd5b511a7997c6b045f72f637ddf9ae0e Mon Sep 17 00:00:00 2001 From: Casey Klein Date: Tue, 26 Jan 2010 19:53:10 +0000 Subject: [PATCH 071/113] This file should have been moved to tests instead of copied. svn: r17839 --- collects/redex/private/bitmap-test-util.ss | 161 --------------------- 1 file changed, 161 deletions(-) delete mode 100644 collects/redex/private/bitmap-test-util.ss diff --git a/collects/redex/private/bitmap-test-util.ss b/collects/redex/private/bitmap-test-util.ss deleted file mode 100644 index 95f039e940..0000000000 --- a/collects/redex/private/bitmap-test-util.ss +++ /dev/null @@ -1,161 +0,0 @@ -#lang scheme/gui -(require framework - slideshow - "../pict.ss" - "../reduction-semantics.ss" - "../tests/config.ss") - -(provide test done) - -(define tests 0) -(define failed '()) -(define (done) - (printf "~a tests" tests) - (if (null? failed) - (printf ", all passed\n") - (printf ", ~a failed\n" (length failed)))) - -(define-syntax (test stx) - (syntax-case stx () - [(_ test-exp bitmap-filename) - #`(test/proc - #,(syntax-line stx) - test-exp - bitmap-filename)])) - -(define (test/proc line-number pict raw-bitmap-filename) - (set! tests (+ tests 1)) - (let* ([bitmap-filename - (build-path (format "bmps-~a" (system-type)) - (case (system-type) - [(unix) (string-append "unix-" raw-bitmap-filename)] - [else raw-bitmap-filename]))] - [old-bitmap (if (file-exists? bitmap-filename) - (make-object bitmap% bitmap-filename) - (let* ([bm (make-object bitmap% 100 20)] - [bdc (make-object bitmap-dc% bm)]) - (send bdc clear) - (send bdc draw-text "does not exist" 0 0) - (send bdc set-bitmap #f) - bm))] - [new-bitmap (make-object bitmap% - (ceiling (inexact->exact (pict-width pict))) - (ceiling (inexact->exact (pict-height pict))))] - [bdc (make-object bitmap-dc% new-bitmap)]) - (send bdc clear) - (draw-pict pict bdc 0 0) - (send bdc set-bitmap #f) - (let ([diff-bitmap (compute-diffs old-bitmap new-bitmap)]) - (when diff-bitmap - (let ([failed-panel (make-failed-panel line-number bitmap-filename old-bitmap new-bitmap diff-bitmap)]) - (set! failed (append failed (list failed-panel)))))))) - -(define (compute-diffs old-bitmap new-bitmap) - (let* ([w (max (send old-bitmap get-width) - (send new-bitmap get-width))] - [h (max (send old-bitmap get-height) - (send new-bitmap get-height))] - [diff-bitmap (make-object bitmap% w h)] - [new (make-object bitmap-dc% new-bitmap)] - [old (make-object bitmap-dc% old-bitmap)] - [diff (make-object bitmap-dc% diff-bitmap)] - [new-c (make-object color%)] - [old-c (make-object color%)] - [any-different? #f]) - (let loop ([x 0]) - (unless (= x w) - (let loop ([y 0]) - (unless (= y h) - (cond - [(and (<= x (send new-bitmap get-width)) - (<= y (send new-bitmap get-height)) - (<= x (send old-bitmap get-width)) - (<= y (send old-bitmap get-height))) - (send new get-pixel x y new-c) - (send old get-pixel x y old-c) - (cond - [(and (= (send new-c red) (send old-c red)) - (= (send new-c green) (send old-c green)) - (= (send new-c blue) (send old-c blue))) - (send diff set-pixel x y new-c)] - [else - (set! any-different? #t) - (send new-c set 255 0 0) - (send diff set-pixel x y new-c)])] - [else - (set! any-different? #t) - (send new-c set 255 0 0) - (send diff set-pixel x y new-c)]) - (loop (+ y 1)))) - (loop (+ x 1)))) - (send diff set-bitmap #f) - (send old set-bitmap #f) - (send new set-bitmap #f) - (and any-different? diff-bitmap))) - -(define test-result-single-panel #f) -(define (get-test-result-single-panel) - (cond - [test-result-single-panel - test-result-single-panel] - [else - (let () - (define f (new frame% [label "bitmap-test.ss failures"])) - (define lined (new vertical-panel% [parent f] [style '(border)])) - (define sp (new panel:single% [parent lined])) - (define current-index 0) - (define hp (new horizontal-panel% [parent f])) - (define prev - (new button% - [label "Prev"] - [parent hp] - [callback - (λ (x y) - (set! current-index (modulo (- current-index 1) (length failed))) - (update-gui))])) - (define next (new button% - [label "Next"] - [parent hp] - [callback - (λ (x y) - (set! current-index (modulo (+ current-index 1) (length failed))) - (update-gui))])) - (define (update-gui) - (send sp active-child (list-ref failed current-index))) - (set! test-result-single-panel sp) - (when (get-show-bitmaps?) (send f show #t)) - sp)])) - -(define (make-failed-panel line-number filename old-bitmap new-bitmap diff-bitmap) - (define f (new vertical-panel% [parent (get-test-result-single-panel)])) - (define msg (new message% [label (format "line ~a" line-number)] [parent f])) - (define hp (new horizontal-panel% [parent f])) - (define vp1 (new vertical-panel% [parent hp])) - (define vp2 (new vertical-panel% [parent hp])) - (define chk (new check-box% - [label "Show diff"] - [parent f] - [callback - (λ (_1 _2) - (cond - [(send chk get-value) - (send right-hand set-label diff-bitmap)] - [else - (send right-hand set-label new-bitmap)]))])) - (define btn (new button% - [parent f] - [label "Save"] - [callback - (λ (x y) - (send new-bitmap save-file filename 'png))])) - (define left-label (new message% [parent vp1] [label "Old"])) - (define left-hand (new message% - [parent vp1] - [label diff-bitmap])) - (define right-label (new message% [parent vp2] [label "New"])) - (define right-hand (new message% - [parent vp2] - [label diff-bitmap])) - (send left-hand set-label old-bitmap) - (send right-hand set-label new-bitmap) - f) From f07c19b26824eb753b29d2136f58f3dc223bf1f9 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Tue, 26 Jan 2010 20:17:44 +0000 Subject: [PATCH 072/113] update benchmark harness svn: r17840 --- .../tests/mzscheme/benchmarks/common/auto.ss | 134 +++-- .../benchmarks/common/bigloo-prelude.sch | 11 +- .../mzscheme/benchmarks/common/dderiv.sch | 16 +- .../benchmarks/common/index-template.html | 52 +- .../mzscheme/benchmarks/common/mk-bigloo.ss | 4 +- .../tests/mzscheme/benchmarks/common/nfa.sch | 2 +- .../mzscheme/benchmarks/common/nothing.sch | 1 + .../mzscheme/benchmarks/common/nothing.ss | 2 + .../mzscheme/benchmarks/common/nucleic2.sch | 251 --------- .../mzscheme/benchmarks/common/peval.sch | 2 +- .../mzscheme/benchmarks/common/puzzle.sch | 5 +- .../mzscheme/benchmarks/common/scheme.sch | 4 +- .../mzscheme/benchmarks/common/scheme2.sch | 4 +- .../mzscheme/benchmarks/common/tabulate.ss | 513 +++++++++++++----- .../mzscheme/benchmarks/common/triangle.sch | 53 +- 15 files changed, 564 insertions(+), 490 deletions(-) create mode 100644 collects/tests/mzscheme/benchmarks/common/nothing.sch create mode 100644 collects/tests/mzscheme/benchmarks/common/nothing.ss diff --git a/collects/tests/mzscheme/benchmarks/common/auto.ss b/collects/tests/mzscheme/benchmarks/common/auto.ss index f3ad8439f5..725e59e906 100755 --- a/collects/tests/mzscheme/benchmarks/common/auto.ss +++ b/collects/tests/mzscheme/benchmarks/common/auto.ss @@ -3,6 +3,8 @@ exec mzscheme -qu "$0" ${1+"$@"} |# +;; See "tabulate.ss" for information on the output format + (module auto scheme/base (require (for-syntax scheme/base) mzlib/process @@ -11,6 +13,7 @@ exec mzscheme -qu "$0" ${1+"$@"} mzlib/compile mzlib/inflate mzlib/date + mzlib/port dynext/file syntax/toplevel scheme/runtime-path) @@ -74,18 +77,24 @@ exec mzscheme -qu "$0" ${1+"$@"} (define (clean-up-zo bm) (delete-file (build-path "compiled" (format "~a.zo" bm)))) + (define (setup-larceny bm) + (setup-sps bm "(larceny benchmarking)")) + (define (mk-larceny bm) (parameterize ([current-input-port (open-input-string (format (string-append - "(compiler-switches 'fast-safe)\n" - "(compile-file \"~a.sch\")\n") + "(import (larceny compiler))\n" + "(compile-library \"~a.sls\")\n") bm))] [current-output-port (open-output-bytes)]) - (system "larceny"))) + (system "larceny -err5rs") + ;; Make sure compiled version is used: + (delete-file (format "~a.sls" bm)))) (define (clean-up-fasl bm) - (delete-file (format "~a.fasl" bm))) + (clean-up-sps bm) + (delete-file (format "~a.slfasl" bm))) (define (mk-mzc bm) (parameterize ([current-output-port (open-output-bytes)]) @@ -104,16 +113,45 @@ exec mzscheme -qu "$0" ${1+"$@"} (system (format "gsi -:d-,m10000 ~a.o1" bm))) (define (run-larceny bm) - (parameterize ([current-input-port (open-input-string - (format "(load \"~a.fasl\")\n" - bm))]) - (system "larceny"))) + (system "larceny -r6rs -program prog.sps -path .")) + (define (setup-sps bm lib) + (with-output-to-file "prog.sps" + #:exists 'truncate + (lambda () + (printf "(import (~a))\n" bm) + (printf "(bm-!-go)\n"))) + (with-output-to-file (format "~a.sls" bm) + #:exists 'truncate + (lambda () + (printf "(library (~a)\n" bm) + (printf " (export bm-!-go)\n") + (printf " (import (rnrs) (rnrs mutable-pairs) (rnrs mutable-strings) (rnrs r5rs) ~a)\n" lib) + (printf " (define (bm-!-go) 'ok)\n") + (call-with-input-file (format "~a.sch" bm) + (lambda (in) + (copy-port in (current-output-port)))) + (printf ")\n")))) + + (define (clean-up-sps bm) + (delete-file "prog.sps") + (let ([f (format "~a.sls" bm)]) + (when (file-exists? f) + (delete-file f)))) + + (define (setup-ikarus bm) + (setup-sps bm "(ikarus)") + (system "rm -rf ~/.ikarus")) + (define (mk-ikarus bm) - (void)) + (system "ikarus --compile-dependencies prog.sps")) (define (run-ikarus bm) - (system (format "ikarus ~a.sch < /dev/null" bm))) + (system "ikarus --r6rs-script prog.sps")) + + (define (clean-up-ikarus bm) + (clean-up-sps bm) + (system "rm -rf ~/.ikarus")) (define (extract-times bm str) str) @@ -134,6 +172,15 @@ exec mzscheme -qu "$0" ${1+"$@"} (let ([m (regexp-match #rx#"cpu time: ([0-9]+) real time: ([0-9]+) gc time: ([0-9]+)" str)]) (map bytes->number (cdr m)))) + (define (extract-bigloo-times bm str) + (let ([m (regexp-match #rx#"real: ([0-9]+) sys: ([0-9]+) user: ([0-9]+)" str)] + ;; `time' result is 10s of milliseconds? OS ticks, maybe? + [msec/tick 10]) + (list (* msec/tick (+ (bytes->number (caddr m)) + (bytes->number (cadddr m)))) + (* msec/tick (bytes->number (cadr m))) + 0))) + (define (extract-larceny-times bm str) (let ([m (regexp-match #rx#"Elapsed time...: ([0-9]+) ms.*Elapsed GC time: ([0-9]+) ms" str)]) (list (bytes->number (cadr m)) @@ -169,7 +216,7 @@ exec mzscheme -qu "$0" ${1+"$@"} ;; Table of implementatons and benchmarks ------------------------------ - (define-struct impl (name make run extract-result clean-up skips)) + (define-struct impl (name setup make run extract-result clean-up skips)) (define mutable-pair-progs '(conform destruct @@ -183,6 +230,7 @@ exec mzscheme -qu "$0" ${1+"$@"} (define impls (list (make-impl 'mzscheme + void mk-mzscheme (lambda (bm) (system (format "mzscheme -u ~a.ss" bm))) @@ -190,6 +238,7 @@ exec mzscheme -qu "$0" ${1+"$@"} clean-up-nothing mutable-pair-progs) (make-impl 'mz-old + void mk-mzscheme (lambda (bm) (system (format "mz-old -u ~a.ss" bm))) @@ -197,6 +246,7 @@ exec mzscheme -qu "$0" ${1+"$@"} clean-up-nothing mutable-pair-progs) (make-impl 'mzschemecgc + void mk-mzscheme (lambda (bm) (system (format "mzschemecgc -u ~a.ss" bm))) @@ -204,6 +254,7 @@ exec mzscheme -qu "$0" ${1+"$@"} clean-up-nothing mutable-pair-progs) (make-impl 'mzscheme3m + void mk-mzscheme (lambda (bm) (system (format "mzscheme3m -u ~a.ss" bm))) @@ -211,6 +262,7 @@ exec mzscheme -qu "$0" ${1+"$@"} clean-up-nothing mutable-pair-progs) (make-impl 'plt-r5rs + void mk-plt-r5rs (lambda (bm) (system (format "plt-r5rs ~a.scm" bm))) @@ -218,6 +270,7 @@ exec mzscheme -qu "$0" ${1+"$@"} clean-up-plt-r5rs null) (make-impl 'mzc + void mk-mzc (lambda (bm) (system (format "mzscheme -mvqee '(load-extension \"~a\")' '(require ~a)'" @@ -228,6 +281,7 @@ exec mzscheme -qu "$0" ${1+"$@"} (append '(takr takr2) mutable-pair-progs)) (make-impl 'mzscheme-j + void mk-mzscheme (lambda (bm) (system (format "mzscheme -jqu ~a.ss" bm))) @@ -235,6 +289,7 @@ exec mzscheme -qu "$0" ${1+"$@"} clean-up-nothing mutable-pair-progs) (make-impl 'mzschemecgc-j + void mk-mzscheme (lambda (bm) (system (format "mzschemecgc -jqu ~a.ss" bm))) @@ -242,6 +297,7 @@ exec mzscheme -qu "$0" ${1+"$@"} clean-up-nothing mutable-pair-progs) (make-impl 'mzschemecgc-tl + void mk-mzscheme-tl (lambda (bm) (system (format "mzschemecgc -qr compiled/~a.zo" bm))) @@ -250,37 +306,42 @@ exec mzscheme -qu "$0" ${1+"$@"} (append '(nucleic2) mutable-pair-progs)) (make-impl 'chicken + void (run-mk "mk-chicken.ss") run-exe extract-chicken-times clean-up-bin - '(nucleic2)) + '(scheme2 takr2)) (make-impl 'bigloo + void (run-mk "mk-bigloo.ss") - run-exe/time - extract-time-times + run-exe + extract-bigloo-times clean-up-bin - '(cpstack maze maze2 puzzle triangle)) + '(cpstack takr2)) (make-impl 'gambit + void (run-mk "mk-gambit.ss") run-gambit-exe extract-gambit-times clean-up-o1 '(nucleic2)) (make-impl 'larceny + setup-larceny mk-larceny run-larceny extract-larceny-times clean-up-fasl '()) (make-impl 'ikarus + setup-ikarus mk-ikarus run-ikarus extract-ikarus-times - clean-up-nothing - '(fft)))) + clean-up-ikarus + '(takr)))) - (define obsolte-impls '(mzscheme mzscheme-j mzschemecgc-tl mzc mz-old)) + (define obsolte-impls '(mzscheme3m mzschemecgc mzscheme-j mzschemecgc-j mzschemecgc-tl mzc mz-old)) (define benchmarks '(conform @@ -303,6 +364,7 @@ exec mzscheme -qu "$0" ${1+"$@"} nboyer nestedloop nfa + nothing nqueens nucleic2 paraffins @@ -329,23 +391,25 @@ exec mzscheme -qu "$0" ${1+"$@"} impls)]) (if (memq bm (impl-skips i)) (rprintf "[~a ~a ~s #f]\n" impl bm '(#f #f #f)) - (let ([start (current-inexact-milliseconds)]) - ((impl-make i) bm) - (let ([end (current-inexact-milliseconds)]) - (let loop ([n num-iterations]) - (unless (zero? n) - (let ([out (open-output-bytes)]) - (unless (parameterize ([current-output-port out] - [current-error-port out]) - ((impl-run i) bm)) - (error 'auto "~a\nrun failed ~a" (get-output-bytes out) bm)) - (rprintf "[~a ~a ~s ~a]\n" - impl - bm - ((impl-extract-result i) bm (get-output-bytes out)) - (inexact->exact (round (- end start))))) - (loop (sub1 n))))) - ((impl-clean-up i) bm))) + (begin + ((impl-setup i) bm) + (let ([start (current-inexact-milliseconds)]) + ((impl-make i) bm) + (let ([end (current-inexact-milliseconds)]) + (let loop ([n num-iterations]) + (unless (zero? n) + (let ([out (open-output-bytes)]) + (unless (parameterize ([current-output-port out] + [current-error-port out]) + ((impl-run i) bm)) + (error 'auto "~a\nrun failed ~a" (get-output-bytes out) bm)) + (rprintf "[~a ~a ~s ~a]\n" + impl + bm + ((impl-extract-result i) bm (get-output-bytes out)) + (inexact->exact (round (- end start))))) + (loop (sub1 n))))) + ((impl-clean-up i) bm)))) (flush-output))) ;; Extract command-line arguments -------------------- diff --git a/collects/tests/mzscheme/benchmarks/common/bigloo-prelude.sch b/collects/tests/mzscheme/benchmarks/common/bigloo-prelude.sch index c0bc43003d..edb17f65ff 100644 --- a/collects/tests/mzscheme/benchmarks/common/bigloo-prelude.sch +++ b/collects/tests/mzscheme/benchmarks/common/bigloo-prelude.sch @@ -1,9 +1,16 @@ +(define orig-time time) + (define-macro (time expr) `(time-it (lambda () ,expr))) (define (time-it thunk) - (thunk)) + (multiple-value-bind (res rtime stime utime) + (orig-time thunk) + (print "real: " rtime " sys: " stime " user: " utime) + res)) (define (error . x) #f) - +(define bitwise-or bit-or) +(define bitwise-and bit-and) +(define bitwise-not bit-not) diff --git a/collects/tests/mzscheme/benchmarks/common/dderiv.sch b/collects/tests/mzscheme/benchmarks/common/dderiv.sch index bc01d9cac7..5e47a0b037 100644 --- a/collects/tests/mzscheme/benchmarks/common/dderiv.sch +++ b/collects/tests/mzscheme/benchmarks/common/dderiv.sch @@ -46,19 +46,13 @@ (define (f+dderiv a) (cons '+ (map dderiv a))) -(put '+ 'dderiv f+dderiv) ; install procedure on the property list - (define (f-dderiv a) (cons '- (map dderiv a))) -(put '- 'dderiv f-dderiv) ; install procedure on the property list - (define (*dderiv a) (list '* (cons '* a) (cons '+ (map dderiv-aux a)))) -(put '* 'dderiv *dderiv) ; install procedure on the property list - (define (/dderiv a) (list '- (list '/ @@ -71,8 +65,6 @@ (cadr a) (dderiv (cadr a)))))) -(put '/ 'dderiv /dderiv) ; install procedure on the property list - (define (dderiv a) (cond ((not (pair? a)) @@ -90,6 +82,14 @@ (dderiv '(+ (* 3 x x) (* a x x) (* b x) 5)) (dderiv '(+ (* 3 x x) (* a x x) (* b x) 5)))) +(put '+ 'dderiv f+dderiv) ; install procedure on the property list + +(put '- 'dderiv f-dderiv) ; install procedure on the property list + +(put '* 'dderiv *dderiv) ; install procedure on the property list + +(put '/ 'dderiv /dderiv) ; install procedure on the property list + ;;; call: (run) (time (run)) diff --git a/collects/tests/mzscheme/benchmarks/common/index-template.html b/collects/tests/mzscheme/benchmarks/common/index-template.html index ac12dd642c..ecdf4dc875 100644 --- a/collects/tests/mzscheme/benchmarks/common/index-template.html +++ b/collects/tests/mzscheme/benchmarks/common/index-template.html @@ -4,45 +4,52 @@

About the Benchmarks

-

The pages linked below show some benchmark results on a collection of fairly standard +

The benchmark page shows some benchmark results on a collection of fairly standard (mostly Gabriel) Scheme benchmarks.

Tables show relative performance, with the actual time for the fastest run shown on the left. So, by default, 1 is the fastest, but select any implementation to normalize the table with respect to that implementation's speed. A -- appears when a benchmark - didn't run in an implementation (and you should assume a benchmark problem, - rather than an implementation problem).

+ didn't run in an implementation for some reason (possibly not a good one).

-

Small gray numbers are (relative) compile times.

+

Small gray numbers are (relative) +compile times, where the compile time for the nothing +benchmark is subtracted from every other benchmark's compile +time.

Run times are averaged over three runs. All reported times are CPU time (system plus user). - Where available, the times are based on the output of the implementation's time - syntactic form, otherwise /usr/bin/time is used.

+ The times are based on the output of the implementation's time + syntactic form for function.

-

Compiler configuration: +

Machine:

    -
  • Bigloo (2.8b): -06 -copt -O3 -copt -fomit-frame-pointer -
  • Chicken (2 build 3): -no-trace -no-lambda-info -optimize-level 3 -block -lambda-lift -
  • Gambit (4.0 beta 17): (declare (block) (standard-bindings) (extended-bindings) (safe) (interrupts-enabled)), - installed with --enable-single-host, compiled with -dynamic, compiled and run with -:m10000
  • -
  • Larceny (0.92b): default mode — but should use (benchmark-block-mode #t) when it works
  • -
  • MzScheme (352.5): in module
  • +
  • MacBook Pro, 2.53 GHz, Mac OS X 10.6.2, compiling to 32-bit programs +

+ +

Compiler configurations: +

    +
  • Bigloo (3.3a): -06 -call/cc -copt -O3 -copt -fomit-frame-pointer +
  • Chicken (4.3.0): -no-trace -no-lambda-info -optimize-level 3 -block -lambda-lift +
  • Gambit (4.6.0): (declare (block) (standard-bindings) (extended-bindings) (safe) (interrupts-enabled)), + compiled and run with -:m10000
  • +
  • Ikarus (0.0.4-rc1+ rev 1870): in R6RS library
  • +
  • Larceny (0.97): in R6RS library
  • +
  • PLT (4.2.4): in module
-These configurations are all "safe mode", but they allow the compiler -to assume that built-in Scheme functions are not redefined and (except -in the case of Larceny) that no top-level defintion is ever +These configurations are all “safe mode,” but they allow the compiler +to assume that built-in Scheme functions are not redefined and that no top-level defintion is ever changed. Such assumptions correspond to putting the benchmark in an -R6RS library (we expect).

+R6RS library.

In general, we attempt to use the various implementations in a compentent way, but not in a sophisticated way. For example, we do not tweak inlining parameters or specify fixnum arithmetic (where appropriate), which could produce significant improvements from some compilers.

-

For a larger set of benchmarks and a more sophisticated use of the compilers, - see Marc Feeley's page: - http://www.iro.umontreal.ca/~gambit/bench.html. +

For more benchmarks and a more sophisticated use of a few compilers, + including fixnum- and flonum-specific arithmetic as well as unsafe modes, + see this other page.

For further details on the benchmarks here, see the benchmark source and infrastructure, which is available form the PLT SVN repository:

@@ -50,8 +57,3 @@ R6RS library (we expect).

http://svn.plt-scheme.org/plt/trunk/collects/tests/mzscheme/benchmarks/common/

-

Results

- - diff --git a/collects/tests/mzscheme/benchmarks/common/mk-bigloo.ss b/collects/tests/mzscheme/benchmarks/common/mk-bigloo.ss index 1ae3523c47..700d34ae95 100644 --- a/collects/tests/mzscheme/benchmarks/common/mk-bigloo.ss +++ b/collects/tests/mzscheme/benchmarks/common/mk-bigloo.ss @@ -9,9 +9,9 @@ (include "bigloo-prelude.sch") (include ,(format "~a.sch" name)))) (newline)) - 'truncate/replace) + #:exists 'truncate/replace) -(when (system (format "bigloo -w -o ~a -copt -O3 -copt -fomit-frame-pointer -O6 ~a~a.scm" +(when (system (format "bigloo -w -o ~a -copt -m32 -call/cc -copt -O3 -copt -fomit-frame-pointer -O6 ~a~a.scm" name (if (memq (string->symbol name) '(ctak)) diff --git a/collects/tests/mzscheme/benchmarks/common/nfa.sch b/collects/tests/mzscheme/benchmarks/common/nfa.sch index 2b3aa06d3a..b00dcd076b 100644 --- a/collects/tests/mzscheme/benchmarks/common/nfa.sch +++ b/collects/tests/mzscheme/benchmarks/common/nfa.sch @@ -42,7 +42,7 @@ 'fail)) (time (let ((input (string->list (string-append (make-string 133 #\a) "bc")))) - (let loop ((n 50000)) + (let loop ((n 150000)) (if (zero? n) 'done (begin diff --git a/collects/tests/mzscheme/benchmarks/common/nothing.sch b/collects/tests/mzscheme/benchmarks/common/nothing.sch new file mode 100644 index 0000000000..d3cd072131 --- /dev/null +++ b/collects/tests/mzscheme/benchmarks/common/nothing.sch @@ -0,0 +1 @@ +(time 1) diff --git a/collects/tests/mzscheme/benchmarks/common/nothing.ss b/collects/tests/mzscheme/benchmarks/common/nothing.ss new file mode 100644 index 0000000000..1f7a80f8fe --- /dev/null +++ b/collects/tests/mzscheme/benchmarks/common/nothing.ss @@ -0,0 +1,2 @@ + +(module nothing "wrap.ss") diff --git a/collects/tests/mzscheme/benchmarks/common/nucleic2.sch b/collects/tests/mzscheme/benchmarks/common/nucleic2.sch index 24c0b04b7b..2e99c4119b 100644 --- a/collects/tests/mzscheme/benchmarks/common/nucleic2.sch +++ b/collects/tests/mzscheme/benchmarks/common/nucleic2.sch @@ -49,10 +49,6 @@ (define-syntax FUTURE (syntax-rules () ((FUTURE x) x))) (define-syntax TOUCH (syntax-rules () ((TOUCH x) x))) -(define-syntax def-macro (syntax-rules () ((def-macro stuff ...) #t))) -(define-syntax def-struct (syntax-rules () ((def-macro stuff ...) #t))) -(define-syntax def-nuc (syntax-rules () ((def-nuc stuff ...) #t))) - (define-syntax define-structure (syntax-rules () ((define-structure #f @@ -320,204 +316,6 @@ ) -; -- SYSTEM DEPENDENT CODE ---------------------------------------------------- - -; The code in this section is not portable. It must be adapted to -; the Scheme system you are using. - -; ********** GAMBIT 2.2 - -'; Add a single-quote at the start of this line if you are NOT using Gambit -(begin - -(declare ; Compiler declarations for fast code: - (multilisp) ; - Enable the FUTURE special-form - (block) ; - Assume this file contains the entire program - (standard-bindings) ; - Assume standard bindings (this permits open-coding) - (extended-bindings) ; - Same for extensions (such as "##flonum.+") - (fixnum) ; - Use fixnum arithmetic by default - (not safe) ; - Remove all runtime type checks -) - -(define-macro (def-macro form . body) - `(DEFINE-MACRO ,form (LET () ,@body))) - -(def-macro (FLOAT+ x . l) `(,(string->symbol "##flonum.+") ,x ,@l)) -(def-macro (FLOAT- x . l) `(,(string->symbol "##flonum.-") ,x ,@l)) -(def-macro (FLOAT* x . l) `(,(string->symbol "##flonum.*") ,x ,@l)) -(def-macro (FLOAT/ x . l) `(,(string->symbol "##flonum./") ,x ,@l)) -(def-macro (FLOAT= x y) `(,(string->symbol "##flonum.=") ,x ,y)) -(def-macro (FLOAT< x y) `(,(string->symbol "##flonum.<") ,x ,y)) -(def-macro (FLOAT<= x y) `(not (,(string->symbol "##flonum.<") ,y ,x))) -(def-macro (FLOAT> x y) `(,(string->symbol "##flonum.<") ,y ,x)) -(def-macro (FLOAT>= x y) `(not (,(string->symbol "##flonum.<") ,x ,y))) -(def-macro (FLOATsin x) `(,(string->symbol "##flonum.sin") ,x)) -(def-macro (FLOATcos x) `(,(string->symbol "##flonum.cos") ,x)) -(def-macro (FLOATatan x) `(,(string->symbol "##flonum.atan") ,x)) -(def-macro (FLOATsqrt x) `(,(string->symbol "##flonum.sqrt") ,x)) -) - -; ********** MIT-SCHEME - -'; Remove the single-quote from this line if you are using MIT-Scheme -(begin - -(declare (usual-integrations)) - -(define-macro (def-macro form . body) - `(DEFINE-MACRO ,form (LET () ,@body))) - -(def-macro (nary-function op1 op2 args) - (if (null? (cdr args)) - `(,op1 ,@args) - (let loop ((args args)) - (if (null? (cdr args)) - (car args) - (loop (cons (list op2 (car args) (cadr args)) (cddr args))))))) - -(def-macro (FLOAT+ x . l) `(nary-function begin flo:+ ,(cons x l))) -(def-macro (FLOAT- x . l) `(nary-function flo:negate flo:- ,(cons x l))) -(def-macro (FLOAT* x . l) `(nary-function begin flo:* ,(cons x l))) -(def-macro (FLOAT/ x . l) `(nary-function error flo:/ ,(cons x l))) -(def-macro (FLOAT= x y) `(flo:= ,x ,y)) -(def-macro (FLOAT< x y) `(flo:< ,x ,y)) -(def-macro (FLOAT<= x y) `(not (flo:< ,y ,x))) -(def-macro (FLOAT> x y) `(flo:< ,y ,x)) -(def-macro (FLOAT>= x y) `(not (flo:< ,x ,y))) -(def-macro (FLOATsin x) `(flo:sin ,x)) -(def-macro (FLOATcos x) `(flo:cos ,x)) -(def-macro (FLOATatan x) `(flo:atan ,x)) -(def-macro (FLOATsqrt x) `(flo:sqrt ,x)) - -(def-macro (FUTURE x) x) -(def-macro (TOUCH x) x) -) - -; ********** SCM - -'; Remove the single-quote from this line if you are using SCM -(begin - -(defmacro def-macro (form . body) - `(DEFMACRO ,(car form) ,(cdr form) (LET () ,@body))) - -(def-macro (FLOAT+ x . l) `(+ ,x ,@l)) -(def-macro (FLOAT- x . l) `(- ,x ,@l)) -(def-macro (FLOAT* x . l) `(* ,x ,@l)) -(def-macro (FLOAT/ x . l) `(/ ,x ,@l)) -(def-macro (FLOAT= x y) `(= ,x ,y)) -(def-macro (FLOAT< x y) `(< ,x ,y)) -(def-macro (FLOAT<= x y) `(not (< ,y ,x))) -(def-macro (FLOAT> x y) `(< ,y ,x)) -(def-macro (FLOAT>= x y) `(not (< ,x ,y))) -(def-macro (FLOATsin x) `(sin ,x)) -(def-macro (FLOATcos x) `(cos ,x)) -(def-macro (FLOATatan x) `(atan ,x)) -(def-macro (FLOATsqrt x) `(sqrt ,x)) - -(def-macro (FUTURE x) x) -(def-macro (TOUCH x) x) -) - -; -- STRUCTURE DEFINITION MACRO ----------------------------------------------- - -; The macro "def-struct" provides a simple mechanism to define record -; structures out of vectors. The first argument to "def-struct" is a boolean -; indicating whether the vector should be tagged (to allow the type of the -; structure to be tested). The second argument is the name of the structure. -; The remaining arguments are the names of the structure's fields. A call -; to "def-struct" defines macros to -; -; 1) construct a record object of this type -; 2) fetch and store each field -; 3) test a record to see if it is of this type (only if tags are used) -; 4) define subclasses of this record with additional fields -; -; The call "(def-struct #t foo a b c)" will define the following macros: -; -; (make-foo x y) -- make a record -; (make-constant-foo x y) -- make a record (args must be constants) -; (foo? x) -- test a record -; (foo-a x) -- get field "a" -; (foo-b x) -- get field "b" -; (foo-a-set! x y) -- mutate field "a" -; (foo-b-set! x y) -- mutate field "b" -; (def-foo tag? name fields...) -- define subclass of "foo" - -(def-macro (def-struct tag? name . fields) - `(DEF-SUBSTRUCT () () 0 ,tag? ,name ,@fields)) - -(def-macro (def-substruct sup-fields sup-tags sup-length tag? name . fields) - - (define (err) - (error "Ill-formed `def-substruct'") #f) - - (define (sym . strings) - (string->symbol (apply string-append strings))) - - (if (symbol? name) - (let* ((name-str (symbol->string name)) - (tag (sym "." name-str ".")) - (all-tags (append sup-tags - (if tag? - (list (cons tag sup-length)) - '())))) - (let loop ((l1 fields) - (l2 '()) - (l3 '()) - (i (+ sup-length (if tag? 1 0)))) - (if (pair? l1) - (let ((rest (cdr l1)) (field (car l1))) - (if (symbol? field) - (let* ((field-str (symbol->string field)) - (field-ref (sym name-str "-" field-str)) - (field-set! (sym name-str "-" field-str "-set!"))) - (loop rest - (cons `(DEF-MACRO (,field-set! X Y) - `(VECTOR-SET! ,X ,,i ,Y)) - (cons `(DEF-MACRO (,field-ref X) - `(VECTOR-REF ,X ,,i)) - l2)) - (cons (cons field i) l3) - (+ i 1))) - (err))) - (let ((all-fields (append sup-fields (reverse l3)))) - `(BEGIN - ,@l2 - (DEFINE ,(sym "fields-of-" name-str) - ',all-fields) - (DEF-MACRO (,(sym "def-" name-str) TAG? NAME . FIELDS) - `(DEF-SUBSTRUCT ,',all-fields ,',all-tags ,',i - ,TAG? ,NAME ,@FIELDS)) - (DEF-MACRO (,(sym "make-constant-" name-str) . REST) - (DEFINE (ADD-TAGS I TAGS LST) - (COND ((NULL? TAGS) - LST) - ((= I (CDAR TAGS)) - (CONS (CAAR TAGS) - (ADD-TAGS (+ I 1) (CDR TAGS) LST))) - (ELSE - (CONS (CAR LST) - (ADD-TAGS (+ I 1) TAGS (CDR LST)))))) - `'#(,@(ADD-TAGS 0 ',all-tags REST))) - (DEF-MACRO (,(sym "make-" name-str) . REST) - (DEFINE (ADD-TAGS I TAGS LST) - (COND ((NULL? TAGS) - LST) - ((= I (CDAR TAGS)) - (CONS `',(CAAR TAGS) - (ADD-TAGS (+ I 1) (CDR TAGS) LST))) - (ELSE - (CONS (CAR LST) - (ADD-TAGS (+ I 1) TAGS (CDR LST)))))) - `(VECTOR ,@(ADD-TAGS 0 ',all-tags REST))) - ,@(if tag? - `((DEF-MACRO (,(sym name-str "?") X) - `(EQ? (VECTOR-REF ,X ,,sup-length) ',',tag))) - '()) - ',name))))) - (err))) - ; -- MATH UTILITIES ----------------------------------------------------------- (define constant-pi 3.14159265358979323846) @@ -539,8 +337,6 @@ ; -- POINTS ------------------------------------------------------------------- -(def-struct #f pt x y z) - (define (pt-sub p1 p2) (make-pt (FLOAT- (pt-x p1) (pt-x p2)) (FLOAT- (pt-y p1) (pt-y p2)) @@ -579,8 +375,6 @@ ; ; The components tx, ty, and tz are the translation vector. -(def-struct #f tfo a b c d e f g h i tx ty tz) - (define tfo-id ; the identity transformation matrix '#(1.0 0.0 0.0 0.0 1.0 0.0 @@ -742,21 +536,8 @@ ; Define part common to all 4 nucleotide types. -(def-struct #f nuc - dgf-base-tfo ; defines the standard position for wc and wc-dumas - P-O3*-275-tfo ; defines the standard position for the connect function - P-O3*-180-tfo - P-O3*-60-tfo - P O1P O2P O5* C5* H5* H5** C4* H4* O4* C1* H1* C2* H2** O2* H2* C3* - H3* O3* N1 N3 C2 C4 C5 C6) - ; Define remaining atoms for each nucleotide type. -(def-nuc #t rA N6 N7 N9 C8 H2 H61 H62 H8) -(def-nuc #t rC N4 O2 H41 H42 H5 H6) -(def-nuc #t rG N2 N7 N9 C8 O6 H1 H21 H22 H8) -(def-nuc #t rU O2 O4 H3 H5 H6) - ; Database of nucleotide conformations: (define rA @@ -3167,38 +2948,6 @@ ; -- PARTIAL INSTANTIATIONS --------------------------------------------------- -(def-struct #f var id tfo nuc) - -; Add a single-quote at the start of this line if you want lazy computation -(begin - -(def-macro (mk-var i tfo nuc) - `(make-var ,i ,tfo ,nuc)) - -(def-macro (absolute-pos var p) - `(tfo-apply (var-tfo ,var) ,p)) - -(def-macro (lazy-computation-of expr) - expr) -) - -'; Remove the single-quote from this line if you want lazy computation -(begin - -(def-macro (mk-var i tfo nuc) - `(make-var ,i ,tfo (make-relative-nuc ,tfo ,nuc))) - -(def-macro (absolute-pos var p) - `(force ,p)) - -(def-macro (lazy-computation-of expr) - `(delay ,expr)) -) - -(def-macro (atom-pos atom var) - `(let ((v ,var)) - (absolute-pos v (,atom (var-nuc v))))) - (define (get-var id lst) (let ((v (car lst))) (if (= id (var-id v)) diff --git a/collects/tests/mzscheme/benchmarks/common/peval.sch b/collects/tests/mzscheme/benchmarks/common/peval.sch index dfa6ce3791..40d5047170 100644 --- a/collects/tests/mzscheme/benchmarks/common/peval.sch +++ b/collects/tests/mzscheme/benchmarks/common/peval.sch @@ -627,7 +627,7 @@ (let ((input (with-input-from-file "input.txt" read))) (time - (let loop ((n 20) (v 0)) + (let loop ((n 60) (v 0)) (if (zero? n) v (loop (- n 1) (test (if input 0 17))))))) diff --git a/collects/tests/mzscheme/benchmarks/common/puzzle.sch b/collects/tests/mzscheme/benchmarks/common/puzzle.sch index 9120df4e17..47cbc60208 100644 --- a/collects/tests/mzscheme/benchmarks/common/puzzle.sch +++ b/collects/tests/mzscheme/benchmarks/common/puzzle.sch @@ -30,8 +30,9 @@ (define *piecemax* (make-vector (+ typemax 1) 0)) (define *puzzle* (make-vector (+ size 1))) (define *p* (make-vector (+ typemax 1))) -(for-each (lambda (i) (vector-set! *p* i (make-vector (+ size 1)))) - (iota (+ typemax 1))) +(define nothing + (for-each (lambda (i) (vector-set! *p* i (make-vector (+ size 1)))) + (iota (+ typemax 1)))) (define (fit i j) (let ((end (vector-ref *piecemax* i))) diff --git a/collects/tests/mzscheme/benchmarks/common/scheme.sch b/collects/tests/mzscheme/benchmarks/common/scheme.sch index 9761ad7df7..ac891d530d 100644 --- a/collects/tests/mzscheme/benchmarks/common/scheme.sch +++ b/collects/tests/mzscheme/benchmarks/common/scheme.sch @@ -856,6 +856,8 @@ (scheme-global-var name) value)) +(define nothing + (begin (def-proc 'not (lambda (x) (not x))) (def-proc 'boolean? boolean?) (def-proc 'eqv? eqv?) @@ -1032,7 +1034,7 @@ (def-proc 'write write) (def-proc 'display display) (def-proc 'newline newline) -(def-proc 'write-char write-char) +(def-proc 'write-char write-char))) ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/collects/tests/mzscheme/benchmarks/common/scheme2.sch b/collects/tests/mzscheme/benchmarks/common/scheme2.sch index 9a307fbb85..934b5783ec 100644 --- a/collects/tests/mzscheme/benchmarks/common/scheme2.sch +++ b/collects/tests/mzscheme/benchmarks/common/scheme2.sch @@ -862,6 +862,8 @@ (scheme-global-var name) value)) +(define nothing + (begin (def-proc 'not (lambda (x) (not x))) (def-proc 'boolean? boolean?) (def-proc 'eqv? eqv?) @@ -1038,7 +1040,7 @@ (def-proc 'write write) (def-proc 'display display) (def-proc 'newline newline) -(def-proc 'write-char write-char) +(def-proc 'write-char write-char))) ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/collects/tests/mzscheme/benchmarks/common/tabulate.ss b/collects/tests/mzscheme/benchmarks/common/tabulate.ss index 0b2d41d103..4675cf0c59 100755 --- a/collects/tests/mzscheme/benchmarks/common/tabulate.ss +++ b/collects/tests/mzscheme/benchmarks/common/tabulate.ss @@ -3,28 +3,46 @@ exec mzscheme -qu "$0" ${1+"$@"} |# +;; Input format is a sequence of S-expression forms: +;; ( ( ) ) +;; where +;; * is a symbol for an implementation; it can optionally be of the form +;; @, where each is tried in each +;; * is a symbol for the benchmark +;; * and are the run times (CPU and real) in milliseconds +;; * can be #f, or it can be a portion of spent GCing +;; * should be the same for each entry of a particular +;; and combination; it is the time to compile the benchmark + (module tabulate mzscheme (require mzlib/list xml/xml - mzlib/cmdline) + mzlib/cmdline + (only scheme/list argmin)) (define base-link-filename (make-parameter #f)) (define full-page-mode (make-parameter #f)) (define include-links (make-parameter #f)) (define nongc (make-parameter #f)) + (define subtract-nothing (make-parameter #f)) + (define generate-graph (make-parameter #f)) (command-line "tabulate" (current-command-line-arguments) (once-each - [("--no-links") "suppress benchmark links to SVN" - (include-links #f)] + [("--graph") "generate graphs instead of tables (unless --multi)" + (generate-graph #t)] + [("--links") "benchmark links to SVN" + (include-links #t)] [("--multi") name "generate multiple pages for different views of data" (base-link-filename name)] [("--nongc") "show times not including GC" (nongc #t)] [("--index") "generate full page with an index.html link" - (full-page-mode #t)])) + (full-page-mode #t)] + [("--nothing") "subtract compilation time of nothing benchmark" + (subtract-nothing #t)])) (define bm-table (make-hash-table)) (define impls (make-hash-table)) @@ -54,21 +72,55 @@ exec mzscheme -qu "$0" ${1+"$@"} (define average-runs (map (lambda (bm-run) - (cons - (car bm-run) - (map (lambda (runs) - (list (car runs) - (list (average caar (cdr runs)) - (average cadar (cdr runs)) - (average caddar (cdr runs))) - (cadadr runs))) - (hash-table-map (cdr bm-run) cons)))) - bm-runs)) + (let* ([runss (hash-table-map (cdr bm-run) cons)]) + (cons + (car bm-run) + (map (lambda (runs) + (list (car runs) + (list (average caar (cdr runs)) + (average cadar (cdr runs)) + (average caddar (cdr runs))) + (let ([nothing-compile-time + (if (subtract-nothing) + (let ([a (hash-table-get + (hash-table-get bm-table 'nothing #hash()) + (car runs) + #f)]) + (if a + (cadadr a) + 0)) + 0)]) + (max (- (or (cadadr runs) 0) + nothing-compile-time) + 0)))) + runss)))) + (if (subtract-nothing) + (filter (lambda (v) + (not (eq? (car v) 'nothing))) + bm-runs) + bm-runs))) (define (symbolstring a) (symbol->string b))) + (define (modestring impl)]) + (cond + [(regexp-match #rx"^(.*)@(.*)" s) + => (lambda (m) + (if (eq? grouping 'impl) + (cadr m) + (caddr m)))] + [else s]))) + (define sorted-runs (sort average-runs (lambda (a b) (symbolstring r) (if (integer? r) (number->string r) @@ -87,147 +148,329 @@ exec mzscheme -qu "$0" ${1+"$@"} (size "-2")) ,s)) - (define (lookup-color impl) - (let loop ([impls sorted-impls][odd? #f]) - (if (eq? (car impls) impl) - (if odd? - "#EEEEFF" - "#DDFFDD") - (loop (cdr impls) (not odd?))))) - - (define (wrap-page relative-to p) + (define (wrap-page relative-to . ps) (if (full-page-mode) - (let ([title (format "~a normalized to ~a" + (let ([title (format "~a normalized to ~a~a" (or (base-link-filename) "results") + (if (string? relative-to) + "fastest " + "") (or relative-to "fastest"))]) `(html (head (title ,title) (body - (h1 ,title) - (p "See also " (a ((href "index.html")) - "about the benchmarks") - ".") - (p ,p))))) - p)) + (p + (b ,title ".") + " See also " (a ((href "index.html")) + "about the benchmarks") + ".") + ,@(map (lambda (p) `(p ,p)) + ps))))) + `(html (nbody ,@ps)))) (define forever 1000000000) (define (ntime v) - (and (caadr v) (- (caadr v) (caddr (cadr v))))) + (and (caadr v) (- (caadr v) (or (caddr (cadr v)) 0)))) - (define (generate-page relative-to) + (define (grouping->suffix grouping) + (if (eq? grouping 'impl) + "" + (format "-~a" grouping))) + + (define no-modes? (equal? mode-sorted-impls sorted-impls)) + + (define (fixup-filename s) + (regexp-replace* #rx"[^.a-zA-Z0-9-]" s (lambda (s) + (format "_~x" (char->integer (string-ref s 0)))))) + + (define (output-name impl grouping graph?) + (fixup-filename + (if impl + (format "~a-~a~a.html" + (base-link-filename) + impl + (grouping->suffix grouping)) + (format "~a~a~a.html" + (base-link-filename) + (grouping->suffix grouping) + (if graph? "-plot" ""))))) + + (define (resolve-relative-to relative-to grouping runs) + (if (string? relative-to) + ;; Find fastest among entries matching `relative-to': + (car (argmin (lambda (run) + (or (caadr run) forever)) + (cons (list #f (list #f #f #f) #f) + (filter (lambda (run) + (equal? relative-to (extract-column (car run) grouping))) + runs)))) + ;; Nothing to resolve: + relative-to)) + + (define (extract-variants grouping impls) + (let ([ht (make-hash-table 'equal)]) + (for-each (lambda (impl) + (hash-table-put! ht (extract-column impl grouping) #t)) + impls) + (hash-table-map ht (lambda (k v) k)))) + + (define just-impls (sort (extract-variants 'impl sorted-impls) stringxml (wrap-page relative-to - `(table - (tr (td nbsp) - (td ((colspan "2") (align "right")) - ,(if (and (base-link-filename) - relative-to) - `(a ((href ,(format "~a.html" (base-link-filename)))) - "fastest") - "fastest")) - ,@(map (lambda (impl) - `(td ((colspan "2") (align "right")) - (b ,(let ([s (symbol->string impl)]) - (if (and (base-link-filename) - (not (eq? impl relative-to))) - `(a ((href ,(format "~a-~a.html" - (base-link-filename) - impl))) - ,s) - s))) - nbsp)) - sorted-impls)) - ,@(map (lambda (bm-run) - (let ([fastest (apply min (map (lambda (run) - (or (caadr run) forever)) - (cdr bm-run)))] - [n-fastest (apply min (map (lambda (run) - (or (ntime run) forever)) - (cdr bm-run)))] - [c-fastest (apply min (map (lambda (run) - (let ([v (caddr run)]) - (or (and v (positive? v) v) - forever))) - (cdr bm-run)))]) - (let-values ([(base n-base c-base) - (if relative-to - (let ([a (assq relative-to (cdr bm-run))]) - (if a - (values (caadr a) (ntime a) (caddr a)) - (values #f #f #f))) - (values fastest n-fastest c-fastest))]) - `(tr (td ,(if (include-links) - `(a ((href ,(format (string-append "http://svn.plt-scheme.org/plt/trunk/collects/" - "tests/mzscheme/benchmarks/common/~a.sch") - (car bm-run)))) - ,(symbol->string (car bm-run))) - (symbol->string (car bm-run)))) - (td ((align "right")) - nbsp - ,(small (if (= c-fastest forever) - " " - (number->string c-fastest))) - nbsp) - (td ((align "right")) - ,(format "~a ms" fastest) - nbsp nbsp) - ,@(apply - append - (map (lambda (impl) - (let* ([a (assq impl (cdr bm-run))] - [n (and a (caadr a))] - [n2 (and a (ntime a))]) - `(,(if (= c-fastest forever) - `(td) - `(td ((align "right") - (bgcolor ,(lookup-color impl))) - ,(if (and (caddr a) c-base (positive? c-base)) - (small (ratio->string (/ (caddr a) c-base))) - '"-") - nbsp)) - (td ((bgcolor ,(lookup-color impl))) - ,(if (and n base) - (let ([s (if (= n base) - "1" - (if (zero? base) - "*" - (ratio->string (/ n base))))]) - (if (= n fastest) - `(font ((color "forestgreen")) (b ,s)) - s)) - "-") - ,@(if (nongc) - `(" / " - ,(if (and n2 n-base) - (let ([s (if (zero? base) + (if (not graph?) + `(table + ,@(if no-modes? + null + (list + `(tr + (td (i ,(if (eq? grouping 'mode) + "mode" + "impl"))) + (td nbsp) + (td nbsp) + ,@(let loop ([impls (if (eq? grouping 'mode) + mode-sorted-impls + sorted-impls)]) + (if (null? impls) + null + (let* ([impl (car impls)] + [s (extract-column impl grouping)] + [count (let loop ([impls (cdr impls)]) + (cond + [(null? impls) 0] + [(not (equal? s (extract-column (car impls) grouping))) + 0] + [else (add1 (loop (cdr impls)))]))]) + (cons + `(td ((colspan ,(number->string (* 2 (+ 1 count)))) + (align "center") + (bgcolor "#DDDDFF")) + (b ,(if (equal? s relative-to) + s + `(a ([href ,(fixup-filename + (format "~a-~a~a.html" + (base-link-filename) + s + (grouping->suffix grouping)))]) + ,s)))) + (loop (list-tail impls (+ 1 count)))))))))) + (tr (td ,(if no-modes? + 'nbsp + `(i (a ([href ,(output-name #f (opposite grouping) #f)]) + ,(if (eq? grouping 'mode) + "impl" + "mode"))))) + (td ((colspan "2") (align "right")) + ,(if (and (base-link-filename) + relative-to) + `(a ((href ,(fixup-filename + (format "~a~a.html" + (base-link-filename) + (grouping->suffix grouping))))) + "fastest") + "fastest")) + ,@(map (lambda (impl) + `(td ((colspan "2") (align "right")) + (b ,(let ([s (extract-column impl (opposite grouping))]) + (if (and (base-link-filename) + (not (eq? impl relative-to))) + `(a ((href ,(fixup-filename + (format "~a-~a~a.html" + (base-link-filename) + impl + (grouping->suffix grouping))))) + ,s) + s))) + nbsp)) + (if (eq? grouping 'mode) + mode-sorted-impls + sorted-impls)) + ,@(if has-other? + `((td nbsp nbsp (a ((href ,(output-name #f 'impl #t))) "To plots"))) + null)) + ,@(map (lambda (bm-run) + (define orig-relative-to relative-to) + (call-with-bm-info + bm-run + relative-to + grouping + (lambda (fastest n-fastest c-fastest relative-to + base n-base c-base) + `(tr (td ,(if (include-links) + `(a ((href ,(format (string-append "http://svn.plt-scheme.org/plt/trunk/collects/" + "tests/mzscheme/benchmarks/common/~a.sch") + (car bm-run)))) + ,(symbol->string (car bm-run))) + (symbol->string (car bm-run)))) + (td ((align "right")) + nbsp + ,(small (if (= c-fastest forever) + " " + (number->string c-fastest))) + nbsp) + (td ((align "right")) + ,(format "~a ms" fastest) + nbsp nbsp) + ,@(apply + append + (map (lambda (impl) + (let* ([a (assq impl (cdr bm-run))] + [n (and a (caadr a))] + [n2 (and a (ntime a))]) + `(,(if (= c-fastest forever) + `(td) + `(td ((align "right") + (bgcolor ,(lookup-color impl))) + ,(if (and a (caddr a) c-base (positive? c-base)) + (small (ratio->string (/ (caddr a) c-base))) + '"-") + nbsp)) + (td ((bgcolor ,(if (and n base (= n base) + (or (not orig-relative-to) + (and (string? orig-relative-to) + (equal? (extract-column impl grouping) + orig-relative-to)))) + "white" + (lookup-color impl))) + (align "right")) + ,(if (and n base) + (let ([s (if (= n base) + "1" + (if (zero? base) + "*" + (ratio->string (/ n base))))]) + (if (= n fastest) + `(font ((color "forestgreen")) (b ,s)) + s)) + "-") + ,@(if (nongc) + `(" / " + ,(if (and n2 n-base) + (let ([s (if (zero? base) "*" (ratio->string (/ n2 base)))]) - (if (= n2 n-fastest) - `(font ((color "forestgreen")) (b ,s)) - s)) - "-")) - null) - nbsp)))) - sorted-impls)))))) - sorted-runs))))) + (if (= n2 n-fastest) + `(font ((color "forestgreen")) (b ,s)) + s)) + "-")) + null) + nbsp)))) + (if (eq? grouping 'mode) + mode-sorted-impls + sorted-impls))))))) + sorted-runs)) + `(table + ((style "border-spacing: 0px 3px;")) + (tr (td ((colspan "2")) + "Longer is better." + ,@(if has-other? + `(nbsp nbsp (a ((href ,(output-name #f 'impl #f))) "Back to tables")) + null))) + ,@(map (lambda (bm-run) + (call-with-bm-info + bm-run + relative-to + grouping + (lambda (fastest n-fastest c-fastest relative-to + base n-base c-base) + `(tr ((style "background-color: #eeeeee")) + (td ((valign "top")) ,(symbol->string (car bm-run))) + (td + (table + ((style "border-spacing: 0px;")) + ,@(map (lambda (impl) + (let* ([a (assq impl (cdr bm-run))] + [n (and a (caadr a))] + [n2 (and a (ntime a))]) + `(tr (td (span ((style "font-size: small;")) + ,(symbol->string impl)) + nbsp) + (td ((style "padding: 0em;")) + ,(if (and n base) + (let ([col (darken (lookup-color impl))]) + `(span ((style ,(format "background-color: ~a; color: ~a;" col col))) + ,(format (make-string (max (floor (* 60 (if (zero? n) 1 (/ base n)))) + 1) + #\x)))) + ""))))) + sorted-impls))))))) + sorted-runs)))))) (newline)) - + (if (base-link-filename) - (for-each (lambda (impl) - (with-output-to-file (if impl - (format "~a-~a.html" - (base-link-filename) - impl) - (format "~a.html" - (base-link-filename))) - (lambda () (generate-page impl)) - 'truncate)) - (cons #f sorted-impls)) - (generate-page #f))) + (begin + (for-each (lambda (grouping) + (for-each + (lambda (impl) + (let ([fn (output-name impl grouping #f)]) + (fprintf (current-error-port) "Generating ~a\n" fn) + (with-output-to-file fn + (lambda () (generate-page impl grouping #f #t)) + 'truncate))) + (append (cons #f sorted-impls) + (if no-modes? + null + (extract-variants grouping sorted-impls))))) + (if no-modes? + '(impl) + '(impl mode))) + (with-output-to-file (output-name #f 'impl #t) + (lambda () (generate-page #f 'impl #t #t)) + 'truncate)) + (generate-page #f 'impl (generate-graph) #f))) diff --git a/collects/tests/mzscheme/benchmarks/common/triangle.sch b/collects/tests/mzscheme/benchmarks/common/triangle.sch index cceb17ed77..baeddd2704 100644 --- a/collects/tests/mzscheme/benchmarks/common/triangle.sch +++ b/collects/tests/mzscheme/benchmarks/common/triangle.sch @@ -15,38 +15,17 @@ (define *board* (make-vector 16 1)) (define *sequence* (make-vector 14 0)) (define *a* (make-vector 37)) -(for-each (lambda (i x) (vector-set! *a* i x)) - '(0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 - 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36) - '(1 2 4 3 5 6 1 3 6 2 5 4 11 12 - 13 7 8 4 4 7 11 8 12 13 6 10 - 15 9 14 13 13 14 15 9 10 - 6 6)) (define *b* (make-vector 37)) -(for-each (lambda (i x) (vector-set! *b* i x)) - '(0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 - 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36) - '(2 4 7 5 8 9 3 6 10 5 9 8 - 12 13 14 8 9 5 2 4 7 5 8 - 9 3 6 10 5 9 8 12 13 14 - 8 9 5 5)) (define *c* (make-vector 37)) -(for-each (lambda (i x) (vector-set! *c* i x)) - '(0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 - 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36) - '(4 7 11 8 12 13 6 10 15 9 14 13 - 13 14 15 9 10 6 1 2 4 3 5 6 1 - 3 6 2 5 4 11 12 13 7 8 4 4)) (define *answer* '()) (define *final* '()) -(vector-set! *board* 5 0) - + (define (last-position) (do ((i 1 (+ i 1))) ((or (= i 16) (= 1 (vector-ref *board* i))) (if (= i 16) 0 i)))) -(define (try i depth) +(define (ttry i depth) (cond ((= depth 14) (let ((lp (last-position))) (if (not (member lp *final*)) @@ -63,7 +42,7 @@ (vector-set! *sequence* depth i) (do ((j 0 (+ j 1)) (depth (+ depth 1))) - ((or (= j 36) (try j depth)) #f)) + ((or (= j 36) (ttry j depth)) #f)) (vector-set! *board* (vector-ref *a* i) 1) (vector-set! *board* (vector-ref *b* i) 1) (vector-set! *board* (vector-ref *c* i) 0) '()) @@ -72,11 +51,33 @@ (define (gogogo i) (let ((*answer* '()) (*final* '())) - (try i 1))) + (ttry i 1))) + +(for-each (lambda (i x) (vector-set! *a* i x)) + '(0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 + 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36) + '(1 2 4 3 5 6 1 3 6 2 5 4 11 12 + 13 7 8 4 4 7 11 8 12 13 6 10 + 15 9 14 13 13 14 15 9 10 + 6 6)) +(for-each (lambda (i x) (vector-set! *b* i x)) + '(0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 + 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36) + '(2 4 7 5 8 9 3 6 10 5 9 8 + 12 13 14 8 9 5 2 4 7 5 8 + 9 3 6 10 5 9 8 12 13 14 + 8 9 5 5)) +(for-each (lambda (i x) (vector-set! *c* i x)) + '(0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 + 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36) + '(4 7 11 8 12 13 6 10 15 9 14 13 + 13 14 15 9 10 6 1 2 4 3 5 6 1 + 3 6 2 5 4 11 12 13 7 8 4 4)) +(vector-set! *board* 5 0) ;;; call: (gogogo 22)) -(time (let loop ((n 10000)) +(time (let loop ((n 100000)) (if (zero? n) 'done (begin From bf451cbc0b3a121fd3d8b529da73beefd37bcb11 Mon Sep 17 00:00:00 2001 From: Robby Findler Date: Tue, 26 Jan 2010 20:24:25 +0000 Subject: [PATCH 073/113] fixed a problem John identified on the plt mailing list svn: r17841 --- collects/drscheme/private/rep.ss | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/collects/drscheme/private/rep.ss b/collects/drscheme/private/rep.ss index cf1f339e26..9e4d84d01d 100644 --- a/collects/drscheme/private/rep.ss +++ b/collects/drscheme/private/rep.ss @@ -1618,6 +1618,7 @@ TODO (reset-regions (list (list (last-position) (last-position)))) (set-unread-start-point (last-position)) (set-insertion-point (last-position)) + (set! indenting-limit (last-position)) (set-allow-edits #f) (set! repl-header-end #f) (end-edit-sequence)) @@ -1653,6 +1654,12 @@ TODO (end-edit-sequence) (clear-undos)) + (define indenting-limit 0) + (define/override (get-limit n) + (cond + [(< n indenting-limit) 0] + [else indenting-limit])) + ;; avoid calling paragraph-start-position very often. (define repl-header-end #f) (define/private (get-repl-header-end) From cba82db678651fd36bb44c905d1a1f1a8c31338a Mon Sep 17 00:00:00 2001 From: Robby Findler Date: Tue, 26 Jan 2010 20:28:57 +0000 Subject: [PATCH 074/113] added in unix versions of the bitmap tests svn: r17842 --- collects/redex/tests/bitmap-test-util.ss | 4 +--- .../redex/tests/bmps-unix/extended-language.png | Bin 0 -> 2575 bytes .../bmps-unix/extended-reduction-relation.png | Bin 0 -> 551 bytes collects/redex/tests/bmps-unix/language-nox.png | Bin 0 -> 3686 bytes collects/redex/tests/bmps-unix/language.png | Bin 0 -> 6924 bytes collects/redex/tests/bmps-unix/lw.png | Bin 0 -> 1417 bytes .../bmps-unix/metafunction-Name-vertical.png | Bin 0 -> 4974 bytes .../redex/tests/bmps-unix/metafunction-Name.png | Bin 0 -> 4326 bytes .../redex/tests/bmps-unix/metafunction-T.png | Bin 0 -> 5777 bytes .../redex/tests/bmps-unix/metafunction-TL.png | Bin 0 -> 5082 bytes .../tests/bmps-unix/metafunction-multi-arg.png | Bin 0 -> 7945 bytes .../tests/bmps-unix/metafunction-subst.png | Bin 0 -> 5646 bytes collects/redex/tests/bmps-unix/metafunction.png | Bin 0 -> 1257 bytes .../tests/bmps-unix/metafunctions-multiple.png | Bin 0 -> 13348 bytes collects/redex/tests/bmps-unix/red2.png | Bin 0 -> 6978 bytes .../tests/bmps-unix/reduction-relation.png | Bin 0 -> 2174 bytes collects/redex/tests/bmps-unix/superscripts.png | Bin 0 -> 1224 bytes 17 files changed, 1 insertion(+), 3 deletions(-) create mode 100644 collects/redex/tests/bmps-unix/extended-language.png create mode 100644 collects/redex/tests/bmps-unix/extended-reduction-relation.png create mode 100644 collects/redex/tests/bmps-unix/language-nox.png create mode 100644 collects/redex/tests/bmps-unix/language.png create mode 100644 collects/redex/tests/bmps-unix/lw.png create mode 100644 collects/redex/tests/bmps-unix/metafunction-Name-vertical.png create mode 100644 collects/redex/tests/bmps-unix/metafunction-Name.png create mode 100644 collects/redex/tests/bmps-unix/metafunction-T.png create mode 100644 collects/redex/tests/bmps-unix/metafunction-TL.png create mode 100644 collects/redex/tests/bmps-unix/metafunction-multi-arg.png create mode 100644 collects/redex/tests/bmps-unix/metafunction-subst.png create mode 100644 collects/redex/tests/bmps-unix/metafunction.png create mode 100644 collects/redex/tests/bmps-unix/metafunctions-multiple.png create mode 100644 collects/redex/tests/bmps-unix/red2.png create mode 100644 collects/redex/tests/bmps-unix/reduction-relation.png create mode 100644 collects/redex/tests/bmps-unix/superscripts.png diff --git a/collects/redex/tests/bitmap-test-util.ss b/collects/redex/tests/bitmap-test-util.ss index a830bf76b7..393f50f3a8 100644 --- a/collects/redex/tests/bitmap-test-util.ss +++ b/collects/redex/tests/bitmap-test-util.ss @@ -27,9 +27,7 @@ (set! tests (+ tests 1)) (let* ([bitmap-filename (build-path (format "bmps-~a" (system-type)) - (case (system-type) - [(unix) (string-append "unix-" raw-bitmap-filename)] - [else raw-bitmap-filename]))] + raw-bitmap-filename)] [old-bitmap (if (file-exists? bitmap-filename) (make-object bitmap% bitmap-filename) (let* ([bm (make-object bitmap% 100 20)] diff --git a/collects/redex/tests/bmps-unix/extended-language.png b/collects/redex/tests/bmps-unix/extended-language.png new file mode 100644 index 0000000000000000000000000000000000000000..00fd289dd05e7c05dc89b43df62cd0d6d406061c GIT binary patch literal 2575 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 literal 0 HcmV?d00001 diff --git a/collects/redex/tests/bmps-unix/extended-reduction-relation.png b/collects/redex/tests/bmps-unix/extended-reduction-relation.png new file mode 100644 index 0000000000000000000000000000000000000000..4980d314576bb8baf9ad00366efffa89dc9a8ef7 GIT binary patch literal 551 zcmV+?0@(eDP){s4J-lMqNn=FfuX{sd9kBl1PURq$`Op1fj0{|NY*&VkjT zXyz&`;Q#;s!~`b`0|UeF2TRj~JDw}C{bCq^5+34E{Nc*Pz`*eD4{y+tdf<>{tdLV(82$Y+q`(CQntPN z^Z)<sk%gUwfstvDC08`({Qr1i*Ii!sR4ajjaSkqk60+YeH0X&qOuhYcfMOOGKyu}u zSKG6+wbC}f99%i)|9^xl|Gqy`W2qIj?BTBgbq)@|@c;k+|NlOp?Qm50pLz59|NsC0 z|Gcwu>XyfY%C#&E4BxL$3-OvE**sV8{l$|f85q8uop+T{KJ{Y<^9TR{002ovPDHLkV1k^s4^jXC literal 0 HcmV?d00001 diff --git a/collects/redex/tests/bmps-unix/language-nox.png b/collects/redex/tests/bmps-unix/language-nox.png new file mode 100644 index 0000000000000000000000000000000000000000..0cf0d7d32f55201086410799fd954073b97ddd6a GIT binary patch literal 3686 zcmV-s4w>002`60ssI2m#dr2000gxNkl zcU)A*7RS$Jmj#wxsnS_Mnt*~*gkZr+Bo<6md>Vq$s8JJ@D3+Lfd=U$=pwEIvCB_63 z5{+Q=*=fZo%hEs0#qnVECGGZ;b$)FQ4l z@Vq#;p{Tq=ILJzP4f*Ar>YG%WaC5M*>E4$!gOBBN23wJ!HgV;&mA{m6mC-5!3gIGN zMcf=Kzk_*fWmLwmy*S_6Gct#zjLL{6d>q{Qa6LnR&gGXvCDq5w+-R%+&c!-`lIkOn zUcI8Zl{X?o#(Vqvc{*7;PThQ^im$r22J30u#cIc3Zv(9Nc}3bF(MHF4mLEz!ozkTK z7WWZC2qA9S5A#e-gU=SS5JJ4tQ{yT0;NN;aU%ZO*?=j4$A1&ZWI%GZCY%8UDqp-Uj zuisSsvJ+!LZ^@nZUT5XDL6!~Y`QDLWwkEApdAB}6L+BFsS>0LUg| zy@t2{_Mn_I*GRj|Q37^HTU!U4FY!>zb>q#PP>!U>N7K+==k;^khQbD*2hd49&MDFc z88#HUDIFS$8hHJS;&yU@L?QQhK`YV*SvDAnLIwegrNZyZ8!9pY>&4wXq4Dy>C*Mxc9atso ztOzHs=n6@H(ht2`5f?z~bxwmq(*iz+-{Xl_qz$rcgnSMk$aE@sVE+JtMFv0uo&a-z1__kiS-MyxuU_U<2#%o~36TP9%hn)KW^*2qp~S7%mjF zS2d6<%&3@rQ|aP2m$y(E#%k|M7OoCfOZCDv9;}w?r9ua@9&H?9@!|bW)m=d?`BFc@ z1ee;u1Q$LI?syRHV~k-KW;yYTjOM(^yD4f9~Jba`B8A z9lpV981~ZHZPmx;V%{|;$uFu_|AbrkMce(;FD4#Z`Bh9p(bIUl=<{mtsz&&IgGp8k z|GmWMY2>>6<=?Cy)h8=JE#(NuPL`0vqUZuNmpAd$b1feukiRcm86y&baSBa6agQOV8fhgdcG`yI^8*go0CE#z!|X;laF zY0S=RjnEuF-!J4`sXC!b1yW(Kf%Ryk+nlEF3(rj)V5*l|N|1Uci{Mf_nBY>OgE7z` zk<_ynI7=PyC%E1y09>y90AO&U^W(S${QC=lD`Y|C79P}U=eQ>))Vs5j-!1w@QaANc0_&8V+04}KgB}i9$>JL?X#q6bDw%;%~k@<04 zzQGa!a1E2mVLrS&U!N=N^R|>=FFj>IHVi)W_;J80ARNILAxUM zh?TX)7If$QS|{MwUtb^iaYD7|*_RH34@G_)k0)3JfSdFJz=4~8HtH{zh#eDJ&PUy< z7s|C4rwnkeeif5&aCNL*^x>|Q0kRYrT+EN}I@XgPfAXN5BfSU#ghxh)1OOb`Qln2) zPd>6~gF$V~J5fKE%w2D?Kk8ES4?X+1XjME1&PZyl-jUByHx19iPq29RVJe2DVnc)X(f0N~t$b5SYQYr_5L z0NSHgZ5mg7c7Jkrk4FM94l+^(L@>D1>oB+ke*CkI@nt+2MTj6g985CynrOu=Dry#c ztmEO~V+LO~yD_0st7NHU=z#_!IJUU$fBW9H(*gjh z(}M3xct{ouJ|y{ZoMy863xF$ZKL8k<*!(z74n|1W`ta*n{;RLmD>!|mkUcYN=d?-T zS8I4OYzANCjS{XYJN*T~<=PJb1}8c{uEK$V{D41+ZmIb4X^PmB4H(A#sc>LL-YBU9 z{sb2x0dQXFcOf3;7^XezYRlh$^?#NKnRKUVyDaYfiV!!W0x%I7*i4MqqNr!Ho%l6fm5;;fKtcwwhb3 zEx|DCp2(J&5pG2q8&fI@?=~g|Y7blRdt1*^QzL%Pu5T@ln@t0K|M?rfO|NOINL*qB zHd`LE5JHGoeAENLG$`u+OFj}bC9Saly+t>hg)&0I;+g~2f1g>`S(6yzFza%Y>VBKQ zPq;alnX$nVEI#?O10jS2m9ajg;VT|=iVwz-O;?Mf@2t$vtjV4y%lO@;%-7s+LkJ<( z0$k}`UMwWL28g0{?2^<{4LffuEdYRy>RVx8%tHRI^gL&CjkCX{gMMYrePEz|XQ z%ZdU3z^zPs()sGwMFO5s$nE3`LD-sc;@{_MX&(LzN{><^F9NgRP9fPfV1y0;0Q<$g zJb~j>CmjIb*JY+RKy}jX7c2m7c|ydpvsmaik^VI4A>rON6HBW5yi4n3wIr?evo`<$ zJ(u~h1tszCkG0kUz|6f?-e?peBxp?9W%HY`v>0p%v{N?5^ zC?9E83eS%BI88-j=X^PW>~^4#tF#(r$4>gar@3PGgXh@^>R@5rPm?G{(%mrt$#(GT zh`Q_r3;Kby50+=w0N~_C2byCTrp*|$Ft(Tnt#{UXo02dik7ZW}y=#>e5ia202T|9w z58WQfz8H0-Mxcnj3VC*f5JHWKGc+;(xLVO|!Yw);6nHql=bW8VcK}BSy@3ILnV^OQ zL|s@HKbZusd-5dAeM+)d5zj6P7wX#kGEi(A)W4W(*G)%XcjEF~oRo9;T!;vW7T3b*B*ABadvFU_=5i@Co+OIhmeP&Yi)zB5eYJzk6aeqok&N{x$J6B6OI-qA4$m%cKXj3U zwXA#`DZ8`sT7={HY5NXSwj_G@ogNvN07MJ;_d(QUEm$DQ9spFtvx^<6W$Ept zRiAPD)b^W`cE4}a&pZz;*NEFW*%Fl+<=tloa3Ea3|20HiykNn$ATz^>n^sysiawFe zl4TE|LY`gx!R9=RbOO*|tWK8Lu~+U6;7IuL(sXUTkUvB{Cr<7zXR`Bd@ov+t*MhW2 zlYXofAVEv|zG*a|z3O50D%E~xiGfaFVk1HbA?CwREy&)dEBFW@UhxqR0E*9nr%Z%6 zWtUdjYnp{7*79ZSA>O-Y$&xut>b0jiCvUHtmP_O_4nhd=ijR*Y>n{{#21>R^2=OW} zteCOkMm-;Oq<(4v28(Yrb=gbV++5N9&|i&%TdvL4rO%G9maq&NQtl4mZ)m_@PLgOh zqTZge%A6YTU8VS!6f`6T(<$T6l=G$7tCnXc=tPGKBxfc|HAws5d3Lpf6_p$Zs{(0P z2G6bz7b+@+GLV#uv@3&WC*aCZDw0C^3(7^>mBF+BAIV!Z literal 0 HcmV?d00001 diff --git a/collects/redex/tests/bmps-unix/language.png b/collects/redex/tests/bmps-unix/language.png new file mode 100644 index 0000000000000000000000000000000000000000..75241bf28ef9c6c70dc3380810dffeb766503ad5 GIT binary patch literal 6924 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 literal 0 HcmV?d00001 diff --git a/collects/redex/tests/bmps-unix/lw.png b/collects/redex/tests/bmps-unix/lw.png new file mode 100644 index 0000000000000000000000000000000000000000..173a4ed6d42036a7d02e26763b80b68b3af9d97e GIT binary patch literal 1417 zcmV;41$O$0P)S~R4V4TM$qkO}AO7K; zrMWwMJk(aQr1kt@Q^CT5gO|N(Oym?1B$kVa==-ZKC+V?@?(2w@R7Pr-&eGE+C?_eQio?&e6a9fhD3v?;jNp=;B`b{+b`DMe0S%b^6U&u}?P)@oG%u z6cI$p1w>bSkx8Ff+dnD_Z4r?lJeVCF`P3IzIBEu=cl=cHa2x=@%(Vh?}3CjesQWXK^Yn%NSLbyudUYx#(1MH@LMNZ z007?d?d~=nx^{kYYDBPwQ1lQvyJ+(~PxJeqHC7bXrdEFZj45zcZ=7KSTc6FR#sp+& zh#+CE7SQYTg3h4V1h=@*7680G`^tXJ*sx{pwF6}*tmNq;)B}JnX~lc_aldUX?s;w3 z+WV)DE^BlKJ@9TfN8Y{?6Of@Hf`qwR&>C)u0M5e&4>zI(u%E1~wq$KyU$P}H;zU{f zCE}wJ=m7x0?{OQV0j`>deG@Jq=ixvf6{RQdUWp0F&=5hwTrEtAPmc%3pq&pa5Uqcp zx%7}`<;LuU>GReXB%i6Q?sSLb5_$jtbaqy)-jlX_-%@SMwwkW-bC`1s+Tr%}cmsL! zN=!h8h6tkMBDzkkOVU47V-D^ZA+4vo^uCCUtrt9qh`x)TKBA9ZaqORvotSt#`uY#8 zUQ}}2%Hhb#qM0!5#pA=Hdi!^Iw?<_*QcfuaCSxT(NSF(V=sLY2H75J;=>9&Tb^Q3c zDQdy~{@~s4wx(R8;mJMbkUe#R-r4c?g1cito0405(SCmWlGF$Qh)U1ff60f4uJ+=T z>A6QK=a&MLKq(5M#tj${P;&=k6}tfWd~7nA@Jh= zx4nGX6NSgDJgt>1X}#<02Mgz~YaZ~436zJ*3KGeM@jp3x|A5mk)=Cyz?;E~slkvE% zG*mK3Bv*s~V}{97;$w#qGss~KY5)TpEzr{GV}}_tNHGSrfPsw`sOhv_A^ezu#Tdc? z7}#h*m`)k{#$X0f#t3dnrH8P<`~=UA-2I#bU8s>1kS(q)A-1{H}l@CXSaf} z!+{xm<^!+h*WXcoWXq$*v2{9QpaKRF2SxtuRxq}D%y9j}j^_*8=GW90XGBgMkjfaS zfI-ATkw3c?jI9zgpuO$gXE*off4Mh5IdnieV-NxcaR){I5~M-6GpoQ1ytVn21Wn4C zum2pf2FiBT9o(Zu7y|(qSPqK(*)8SVR)HBteqMDO@$qEty}~0h7(*!JU^uX^ve5#W zPJ2qb0hocs7{UP<*l0nRP8&Pym_dp$s09pcv_MOzkBt~s%piv`r~wRYv_MOrq?qA9 XUbjcAr?_;R00000NkvXXu0mjfVM?{K literal 0 HcmV?d00001 diff --git a/collects/redex/tests/bmps-unix/metafunction-Name-vertical.png b/collects/redex/tests/bmps-unix/metafunction-Name-vertical.png new file mode 100644 index 0000000000000000000000000000000000000000..b64e4b5bfe218d5856bd351b3b31a71ca554ea62 GIT binary patch literal 4974 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 literal 0 HcmV?d00001 diff --git a/collects/redex/tests/bmps-unix/metafunction-Name.png b/collects/redex/tests/bmps-unix/metafunction-Name.png new file mode 100644 index 0000000000000000000000000000000000000000..0e4d877c44bcb9270f4790940fcd5e31e7a607f2 GIT binary patch literal 4326 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 UKr*e&;Q#;t07*qoM6N<$g0Sv-=Kufz literal 0 HcmV?d00001 diff --git a/collects/redex/tests/bmps-unix/metafunction-T.png b/collects/redex/tests/bmps-unix/metafunction-T.png new file mode 100644 index 0000000000000000000000000000000000000000..61fb1280bab4a696272fac4955c9eb3f9930cb8b GIT binary patch literal 5777 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 P00000NkvXXu0mjfnR-fT literal 0 HcmV?d00001 diff --git a/collects/redex/tests/bmps-unix/metafunction-TL.png b/collects/redex/tests/bmps-unix/metafunction-TL.png new file mode 100644 index 0000000000000000000000000000000000000000..3b29ef9410064a9656b55b4aab02e87dd7bd83cf GIT binary patch literal 5082 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 literal 0 HcmV?d00001 diff --git a/collects/redex/tests/bmps-unix/metafunction-multi-arg.png b/collects/redex/tests/bmps-unix/metafunction-multi-arg.png new file mode 100644 index 0000000000000000000000000000000000000000..70a4c28ad35dc47ece5ec1b79cf2213222659947 GIT binary patch literal 7945 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 A>i_@% literal 0 HcmV?d00001 diff --git a/collects/redex/tests/bmps-unix/metafunction-subst.png b/collects/redex/tests/bmps-unix/metafunction-subst.png new file mode 100644 index 0000000000000000000000000000000000000000..c2e7a3c58a29f50a494a5b1dc727452f0f965a64 GIT binary patch literal 5646 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 fJ@j8AyP9H54l3%s>7I`)mIN literal 0 HcmV?d00001 diff --git a/collects/redex/tests/bmps-unix/metafunction.png b/collects/redex/tests/bmps-unix/metafunction.png new file mode 100644 index 0000000000000000000000000000000000000000..1e238ef2711e72513ab1525eb9948e290deffae8 GIT binary patch literal 1257 zcmV=P)OT7PKsoj6x@ZoIwVJw1`qsG-cGdSWy8}7RF5| zBnnMK;xds)g^{jcVuB4KC?FSwfL&Pj_MLtZl)C!?7BJ56{5o^abH3;O-gBOF-Z=C+FkxVcU#^qK0+Su@O>EW&J zG_c!tPK>dvCB+F@?`)7xHSoei)l(oqhM{M~Q;m5LrGi9sq~xwJ^U??578C$*_gLwn zcjfW;%!?`B-t)0ej|3<{C}m33aPN>}vP;Y2#hmIBJGie=+Bmn z04oY&u%Aj0jj5%}n$!F(5JI{(PrQ_SLjl7zF?^;LGI5J6yF+Lck#|)lg$VfqFAui0 z-O7jl&Dr99X~3$1swhhUs=fb~#O%`-Zi#=hk<~!kBtQU)h1LU6U)>I-1x--?y*Fl-sAbg*)g1 z0ClOmrd-32}r08-DKQGQj7eLF<&MSD&3ZX^2RaCx69PC88T!c)jLkH-)HK>?D zji7HYuz@4>?Zbj|iER-%@0*g8Y|^&c7Q%G%so(N^=ntq)FExSj#$9aBv`%$HkA>BC z7Opm!xipnR9TR<-SMbJ`54{Y~-+_z|k7ByD5tS?mJbF1jI>#~lXuyWe$yv=Ii7qtq zsA-mbHmzS&owe_$RVn4R-F+#|@@RoxV>$#nX& zk_N2k$P1u@p?6HiSCwaftSLYC?j{Zu9OBPQNRDttS4p(rw#t4bmi!XC42(Bc4iXq+ zEIt!zL|OTHk2*uit|qYoC^oO29U>p1Lh8dn>^PauJDKo-fV=rpr T^}vP(00000NkvXXu0mjfIH*}$ literal 0 HcmV?d00001 diff --git a/collects/redex/tests/bmps-unix/metafunctions-multiple.png b/collects/redex/tests/bmps-unix/metafunctions-multiple.png new file mode 100644 index 0000000000000000000000000000000000000000..fce8b05b04520301902bb84f6ffe5a7aba6f57e7 GIT binary patch literal 13348 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 B65ap+ literal 0 HcmV?d00001 diff --git a/collects/redex/tests/bmps-unix/red2.png b/collects/redex/tests/bmps-unix/red2.png new file mode 100644 index 0000000000000000000000000000000000000000..585640772bd0da9253ed14d98ab65a3e043e9fee GIT binary patch literal 6978 zcmb7pbyQSe6z-)%O1c}w5u|JAmTnN~?x9f_N*Iw2L4lz|B*Y=4O9Z4lB?al08exbx z{$8y2*IVnYb=O^Y?Q>(Fz4tl$`@S2ir=vzpNKXg=0I~WrWdi`f^g>^Y<71-FGt^)Y z0AL_cS5`23m2;TuY+2q*L)G%L;FN7p4eqt233(*RgUZV zVtwUAcnrNJdt65#_Cx_DJ1tHLK9BLjWW(_&$`&KzC>qBy>)uQ5+fi@Cv!@3zv)UoLT7ZJPLz zujbg%2AqiE$NwG?uvFoO6Aso|&#JHF^3V>qsy)BFag+&jA&Tni*HjXDZ?tk{tMv^r zcD1}(Byc=WDQ+LBchT8%bT`}bhEyI$FO086EzC!KW9gya*v11&Q^!75*ohrK?iq$W zCO}4&1D6qAxZi2eZ&~g<)vPCqlMw8SvpY*I4sH~ml?eer5vT4GGN+X-pTW$-R-(51 zozlI=3j~u9arPkG;^`D1BCYKf)q2EMcW4}3s%>;D@Ag=QceeY`$s1^Maxs;G~MucY6jbeR{YZ=Yb_%&oJs>^auG2q(BB+-b-tBZgPEy zZF@3N+5^UB1xbi5&qT0hrg_a`o=gQ^Eehd(huFjA8>Y*br%-NWu!`m3n5Dt#lW$=Q z*a}Xe4gAHnOj+4XX|J#69X$w70tHNpcTv2FAac=u4xXkKpF!3!4B6YmVUM?nI1uH) z?9KMdw=gia0@+sA0FyQo+G|;WFWn@prM;6hPLk5}=M+-cN50o4otATu)DLfDx6yrq zfs<-mZA#vGe)6|^uW0WaO=hIduUs&UOfjd&k+&9gC;d3ISg5l;7MWjF8xT zJqZil&kx@D++!m!h|8)o=}TSxfy>vSW0Ui#C{9}M{WKdarRkSAf9+ik^n&>Ql_3$0 zNP_TE$);2K9p0&mmj)ewn|TzO;!jbiYixCtH&e60IG5)5t^K%ic}j^u_=NmV zeV7<$#~W(h3J==HIo*F0s_RfZHD-hLyise5kOsvqr$Uwil8>|rr-~SyWi&vRYO0wH zxoJsH20hO3!6y>n8^0DGC-1gd831_K+SNWIdGdJ|0NxEg`ok40dlbA;Y7qUq<6sOM z__ZPPbb^seWf(3-#wLc2^bd_(W;T6ahCYp^WB1#WxZa`|}>Nzjc zHp;-xGeAkN->1?O^dJn^H4|m?XYw%s`Lez2^1whJ1S4oC)0H;pBBP9e*j?R4bHT%7n@Lz0)SuA$)lW-VhJ&m24C1N{Q=-8eqN;J7S|aUi1=k30_yYq zz!3$=&*&agy95&nc+N|HA4wXJhj-(_veB+%go&2eLxs*Y=9BrTQ z6!|Hr&u^4Rx25J@3Bzgh38^@Zb&oQP_Eit0{SK367Yz5&Gbvp%vu zmTR?JyY1{(C}9Fd+0+?`m9e+zBtZhTTI9QpDs5#=P&>$egYNPN?OD%wDX}cgt9**M zhozcBdh@ToQ;UkTZ%vmAl-bq5a(z)|+C$438iknNb?d$PyjB9?o20@x`ufdP%$LTv ze4M?`83+2P;F+SJp|BO{vF4y0W5TO3J}H;K%d;$|xXlC?xawF{Wep{`=Z8cte9#hx zZ-tamR|2dUW@GmF@oBl1GqgJTo-aH)S{CK0i2->%Z@G^huGorph05$@G|%J>a%mgx zlnJ^==5n|VHNcY?kIn+Adk4ni&_z4coc6SV38IDv=(`#y(ow3c4zFS2Tji0GfHj7R zR(FN~(Y^?UJ)B0!<|zjHP1PJOhN(zBL$`Q1Ls`6evvj~tWbbPw5mC$BdUI*+N=i^f zH4mGiSG6e9p762BPf~|^#@6?W53E+A$e(x_f@0hU6*AOKz*m0vj~mXNCJLU)SnaG8 zsbB)XIyD}f?29k8OfeAt>reQKF=>=bYJLaSj^r>hso>P)dNIHStaHOBj2xpoasmOc zn!cqxRpYgy{oOJ*FBzl!&;W5+8WV?R>9a+NxW|!uHR5(c;gE*G*SMr%Xb!8^?@a zK1-Y2{x}}n5MMdo$yml_w55u?#=q?zNVTk@z45~xpG5mi)D&ziZN&2vCTT) z-qel;wmioEwwNT4Ns5WdhQ0o-vxBy}_wclx#bT%GJ0I>;B^gZ~t(?H{v8q<=!pS#6uw=>rC;<{`$6rAv2O%2rv9(E2apNn_w5@KeTHzO7U$W~e2^H>B`xD63p#2fZw0bK7 zkF!#FBXcrO;U{;e;I=Sg#vcZ!$m0SOU#^c#o)x?5rKXfMu3uNK?>}&UEtavse;{URG3AGB?Z8*VjM-O$1c07kwJ2-N zgL!rUSc#V!!{(k+RO&nzu%nlN!czuBgfM^th4$U?5aDV1FDnBeWa0zI z@Uv|JKFnA5ceQ(rwz|5KlvWL#V!jX-Y14l=Ov@_*`#a62mrL^bkQahR`Gi1#t9V`- zBs(&f^>jUF7?rK*=pG=@ke{ZjEoxpg~puqHO!hH z2s2Zt$Co#t>U^@nxagb75w#<+C=85Oyc7S5L#J? z|1V`&SD*5c3)ywYHw||v8E1q=GXJklxnOwipXzA~-0OZ{lG81`^(}-A@(XY^%+xZJbCx?))4oCgU%SZpr9y?_TuF zh^tW1$TjBsTCe_e-9SEU<*q%k;`o<}^I&guRhQy5rgpEpEH5h2c}}LC zJFQ0LdCPGHkrov2q8yjsR%<{12W8vW5!SM_C?5Xh={i~>RrM5cIAQH~*_ZbE1jhH3 zqRZ@h?ws#mhS5@-?E8h0*3VVNXtHl7WkR{F3z|UCaoO)}_J&Id1d22FMSXPkd1=p z%+S9oM&53h!!Gy5i>kYz0qGVcBTEw|QYQqw`ocQT4utL;dVEprI>R+Z^C25$D~E{z zq|2p|Z8AflEt`$b9d&(+hLoV_@2^;{;S7zA*n-2AyTx^zKB3*ZoU_$e6i@E|-mx+8 z5A+jXwl^w5kWk%`pV*IrP{^0dNai}zpt*NEgtdkD@PSIzXp6jX*LMmTST?$gc*b&x zPsYy~Z9ccPj-lrk6ioe|i#eW*D0UBVbtjvC8+I;gdv^+B=UEQ1EW9aL2T)(u4Ael*d6DU((uHzzY};vZn`1wWg26JM1*cVRZw&08Yxz=c z6d!XP7R+zyefF>KCH^s@09BTypi7O9>QpDwe*j%$oQFVB)KudL$rGR9RNTw6AL zxOBCa{zpBI+~moI2gKbm{<^l_c+z3pHVSI9n(s{??S_h?w={^8GQ`pCm5rQdBx{}Q zV#Y*u((pgP6M7&dhVx2_wsPV;^n)su=$Alz!Y_~--`N8@hMjmGITA@)?dB z51RotSOp@if>7&N<TlAOe(5=13wNyFO#9ah0-TZ?ap0MYi1OMEnJK91*#6yrI;RT_~g ztoMIkDRoB_n_0k81de~P(hL8xYc45w>h!vQ2CCvu%CY+$URX;p^#nn9i1gs7iRBS{ zXelMF8MV`STKnwU%R_PPrHc2PDjI_%q ztXHRVHrpDd!}R!Y0vwz)&T@KY&!7{pPOYw@dqq4`gUh5OczNyCiD-YDN{H$`96^0o z#qFLtVcjk@j4O3UJZ^bs%EnlvuwPPf#4Nrc?FUsXY1mEd=nD;#@czE!b(b=vci(mU zVoCfXJUQ2e%J4 zpkYO$4d~CZr_c^v>i}{zwKAOu@V9QGj=%xPM9w;*C)w$Fsi##M(FSu2b88*=Z*WSEK_XXK->Vk? z-mtjvojVjUO%TwK=(DKwEWCW3_Bma7s{9R@t7CfS%iIQ1tTZLK3>Pln4L0OiK;UvX+iiSGafQht?D$j~|J`%jd}V zME84r4HRM|DG8I(zSn_)og2JJ`M2Vy4>@bk*)j3Svsi(G8gVVB{GhLMt(*0kdJX*y z3$lNSIq8*fltc9GHwiU+LFK_s&;{6Ut8Eg&zym5APqT}xpt^YTH=>*&0pNbG;@PBq zb4z}_D&AYr&0E1Al$`7F5#Np6+i?;y7(KRY&Wz0)#^H1*(D&qt!cZ`!?(=hj<{utK zX{z>N?ON~bqlPp!o1^EaFn}h0yQ!W_h8#Koh&26E&NyT?S)%xVC~y<_w^N@3>&P0G zcCTd3E_pkG-7tv=(u{|ADh!TaC%0StoED@@3bW$o-MNa*8GHHV59CX_Zy9TOuy1F{ z3vs*cEccgRXY*cc_X22z0q2JfA-tr`! zS%6y!4eIGVu)^=N4ddHB>W)v#Ei|l8eyiGl`?Y3is;f)LR2w%CSI^vFYW$42{5e8g zv$y31H`V^IQ~C2b5#8S4?H=9A!ADG1URt=oA%-UD&8xGsLw&geX`z9NO|Gx&^z7MJ zWAtC;Mqji_Hw)R!Eua$xkj;FUj<^G&W}hO~DMQZGZJ_%qRp5d*p6-0r0tkkR6$+a1y_c3`hyTUk%;@Ig;JvEca-^- zwQ8QIDwWF;P*cWKjTsnwhDsWWv(R0?LSzXu|0A@92uD?@U96;aSK6 zM?z=GF$s45cf{U9P+ zpW3?063eP@MxP@jJlw3$+C)0s7#f)M#$kM ztRl5N-aT8QcG^6^aJm$N-p6ZK78nlp(N%#3^0|QfBovp)vq6-xh z5Ru{c$kIbon=NwYBer)Sc2Ok`lVC1FHOKY%O`Zem50fNj;r zOWBVLOQ+GIiXKg)Z_wU2PCV9I7q=F$d*isqV#vMHEyi!%m((hL6yblR4 zRKJw5nw%Bl99b8BnYh%GP&(3SR2noj+f|y}s-ngLH=vEnKo;~2E~XQ%!%s>4T^V#v z;Y_w`KCypx%jXbpwePNi>kl`AOuX`NDo0|W8Ub0Hex|ja*+}L8lA@9%Fdi(@-GK+R zErrMNwVR2QX(rPIH~AOnEcPFVjUdl8%3GxK6c_?)l@rJm*NfzE4R_F@C?`G}Oj*U* zxh2~G;3>UzwhnoJxi6t+35-|MGlq0Bv#Ez(|LN^MsLGLPlUWWeg(Ng3OkcXA1p{+;az8*+(rJ*NDtq-;fy?;{FEtgIucaPbYUxFJHE?p3)>@oo1mK z=iYGnoN9ZG+%Grcf#bUmRd;v}huuk5)2Xl4<96QX!9`@YZ7Haa=j9f$<-47FqBrb* z8jO*PCHabA0|D8(fwDS3g-3f~MDoICmcAnXIhAkd%aZ1sL*d!Yh19vOqQL`~RkN`Zd*_KEGh-luKLX^gF#y<)As9?-cwt?9}x}u`mHVSQuGy zceT5jCzj7kdb`@9^171a0ljg`p_%Ow;z%T$CI3WEm|h%vmgVpFgrk7xD*s=XgV=8Yq(Ykf1!qxMb&*Sbx+uO%En`8tiE7I|WTOggABl~}eP26*p z)xo?}m5ju(|5I?Hyk-7&@4%A49yFA9IAT_l&dIR|&HQdA$bRu374N*q+gL98l9=Ai RiT*bRsH^BGe^IoF{2!e>TTK7} literal 0 HcmV?d00001 diff --git a/collects/redex/tests/bmps-unix/reduction-relation.png b/collects/redex/tests/bmps-unix/reduction-relation.png new file mode 100644 index 0000000000000000000000000000000000000000..ec11b4b4fd2192ddfa166dcbd86122e296ece0ea GIT binary patch literal 2174 zcmV-^2!Z#BP)oxir=k#bbCGs4TbKqdeogj9{E z7kfr#*Y+VqVCuy%y;@Yb)GI9WN4bHc8tr9Vpr@ffjno>1khC(*+jjBA#~SS=9TO?< zWQWiles{G?Lp+48o)p>5Ek3r33fpi4=Wn!^ae$1mW;M|Wx_Zgio5LLd0NiKoywO>6aG?hVcK&mB-jE_m`3f7W*g`Sck|-KW zGL}UNW<-Sgdro^{+odKILWs<(?{;>qD*&*(LXvXtD^XYZ27xmT?1NwZti4-Lpz(qt z-GJ1Oj)sCw%I6a81sxM1gpj5!e=Z#Y|5~dUIRKGfUj4cca2B6y!`1C2X$w-%w`iA0 z@t?iVgX@M0DbY-nk3M?I#U=6hT{%KX^)M%z$xXcUSVQI2aUs?Mi#jdRuCemo2k{FI z)hVb0nQlWK4h@vzyJFxvbLm=%jtKyOx0HQ&9fz93?+bfJ3`w8|%ixW>ViZMxIdVRG zeV*@uLrdJWcNtt4E{N}mRU>DnX}kD`*NXl29DZe*B>*s-Lj_Kf@4snKPppcTpA#yR0(t@qrV!|F#$kXcYNP>0o!)Z>iXxt z%k8=a+(6Bokg^Z9&! zc*;4MvzIHIM&-rwobJyQRo8ZDkfdV&A?EAb!Z~^ZjV~C6k^RvyfX1|Dfm)&NzprBg z^n82ZXv^I9w{Er*9a*&RlLx;}^RpN-zz9760B96)CI_Icp;I;F22v~3z~HhOBc>t0 z|3$6FarK4okImxf-qVnJ0oyOa8~$GLpgZDv#{E}w-*Ker3p8G6KU*laCK^~c^PE8< z>cO=abWBZa(cZII@{V{{`XF0@tm0>rh#x34pw&TfelFY@XQ~#D5iA6TD`= zYw-7`(O$*{GMdpO8X--0<=ZbttuJoJiA=rd*UPFi=Fd(qYE>CFpz&VD1sZ>blq0yL zSxk3#Wn+YO(6F~z2B)?m@ zJ%R7Uz%UGBxrQcX6gNI|4T?z*(sW)~rNgPAEb!TUU4oFJHtRV6 zu1`SVF9n_eT%UlT8NV;-F!d?#AhN36^MiwUE&%MHFn$ov1%R7eF46D!3;?L-@)8a` z`c%tc39N3+i?Xm=c};>8wOP+$UR$f=gFhy6s{P=tCnGR!a=B#i$3)M_AQ+%gE7W+m zs7nQI+TxS$wlw#uuRPFlg8$b3x1a$xGVNuLTib(!7N%zA76}`Aak_2boOuE#sx!vk zZ_=kbVi<;b#OxA2sXY|uNyF@UFYFS^2<3{J0}I?R472q9)v~;L6?A|8TDS`xa|l^g zBqsll24z!e=JM$9h{!OWm;by!eb#L1)Uyc9lE2~2xQ>Gh7H)j6 zpzMpUu9cj5dv(H=fBUUVpJ7eqNZPL=gRJdDI5s+H(mnyBqWqNnO?P12Vk0{}4VfRyawlxzc+Mkd_3DCOvv z^)`u-y|P;;GKxFkN&eDE)sf5jFGJ0pzF#DS+7WFFOb-E%!{zPY9b+?aX03iqtf#pw z$t&FP%BFb%AN#m-ESzSi7oYl#hv|CS;{nwwjPlD+-CnY0s$0@o>N?MOy_QM*M3aIs zxGv7pf)#>Nt0@+a(t;I&GP{}YmgdIW6SYy0yt#2|*1z6MqOS9d)&t0^-&(xt(`HG# ztv$YdW^k{x-OfFXWoQd%Vlj7EOvL0ZOeY!t1=8z>PL&0G@c;k-07*qoM6N<$f(e!= AssI20 literal 0 HcmV?d00001 diff --git a/collects/redex/tests/bmps-unix/superscripts.png b/collects/redex/tests/bmps-unix/superscripts.png new file mode 100644 index 0000000000000000000000000000000000000000..51887d799fb5f3d7747ae5ef246d3449477f545c GIT binary patch literal 1224 zcmV;(1ULJMP)+ifFc}sG1_p*dPnIRb z?DgJ#z*U$DT`MlYDkRG%VQM78j9Uq(q&%mrohCQBKOU@{{>*n}t1BO|c2VEnze)eX zO@lhMj@IgOFhD}#+qv%Q!-kXQtFz;?{>PQ+ty>u7IUk<>7T8;9#`XTv@fRP37x%8* zaZsRYS%uiHwy8J7RM@ZWdKpx!zj@*rAx)9D2d*nrNc?}WzHQ+HVTs?D5B-RqULm)y zfA;=pN}3@vr3*pj|EM2v}niGkt!mBp){srs7;GD58Va-_gi zgprYvQQEfp^!w}m9x_afLTV0Grx|%z|Ni~=;ljSFpZ+m?zkTelS9V5vaZSvxO&g9a z&Yj4WT$+_u(A?sCt#YP#S!Zo=qW*6YYvm8Cvgo4% z2e^}R zuAZ)cKkK?(Ms}PnKfj)~Ak*(>r*4VZD04D=y>Es3Fn9k1Pg&-7moM>HDsx~)I-Tuhlh%{`etF-W?+gqK zEDXP1-+s-&YtM_E(Kz&Ss%`sH8>X(ib7i?=?~*`ChV$|~*Otzhw&(D&`;rz{L^!0`X;u{1FT`Lgrh|09Ec zANIrvGcZUbZh7_hKOF)6?EUv*u_Xh8&B{0b|Nm!UU}EE8XZZ8;4{GD--_P%C+zbpa zAHDlc*H#s#y+7|Rt!O|@)0{pbI`Pv^OLE`CA11oHEGi#mg3 z&dG28|Nm$B|NqYhM5R|NrZ$N_!Q4 z1|~WGIrlzY?sQjVXJBC9QVW@X|2OsQ#{zKLd-ui8e7Eqbi8I?n^+L9Opq`E2PUgx9 z`EPjr@Be>DDE$BPe07MNQS+s5)U$-z;Ny-M_epoD78QS02QX3w}S}*Au8}Uc3MGAHs@>0N>6vI@=X&ehv>*#{cl1_217=Uo%Tda4}M& m1Rm7j&-+Ioxa33-9R>hXG_UMqV4kf20000 Date: Tue, 26 Jan 2010 20:55:13 +0000 Subject: [PATCH 075/113] * Remember values in "install .plt" dialog * Add "http://" prefix to a url if it looks like it's missing * Focus on the text field when switching tabs svn: r17843 --- collects/drscheme/private/frame.ss | 152 ++++++++++++++--------------- collects/drscheme/private/main.ss | 5 + 2 files changed, 76 insertions(+), 81 deletions(-) diff --git a/collects/drscheme/private/frame.ss b/collects/drscheme/private/frame.ss index ff8c7ca4b0..30f5f6c471 100644 --- a/collects/drscheme/private/frame.ss +++ b/collects/drscheme/private/frame.ss @@ -300,108 +300,98 @@ ;; asks the user for a .plt file, either from the web or from ;; a file on the disk and installs it. (define (install-plt-file parent) + (define pref (preferences:get 'drscheme:install-plt-dialog)) (define dialog - (instantiate dialog% () - (parent parent) - (alignment '(left center)) - (label (string-constant install-plt-file-dialog-title)))) + (new dialog% [parent parent] + [label (string-constant install-plt-file-dialog-title)] + [alignment '(left center)])) (define tab-panel - (instantiate tab-panel% () - (parent dialog) - (callback (λ (x y) (update-panels))) - (choices (list (string-constant install-plt-web-tab) - (string-constant install-plt-file-tab))))) - (define outer-swapping-panel (instantiate horizontal-panel% () - (parent tab-panel) - (stretchable-height #f))) - (define spacing-panel (instantiate horizontal-panel% () - (stretchable-width #f) - (parent outer-swapping-panel) - (min-width 20))) - (define swapping-panel (instantiate panel:single% () - (parent outer-swapping-panel) - (alignment '(left center)) - (stretchable-width #t) - (stretchable-height #f))) - (define file-panel (instantiate horizontal-panel% () - (parent swapping-panel) - (stretchable-width #t) - (stretchable-height #f))) - (define url-panel (instantiate horizontal-panel% () - (parent swapping-panel) - (stretchable-height #f))) - (define button-panel (instantiate horizontal-panel% () - (parent dialog) - (stretchable-height #f) - (alignment '(right center)))) - (define file-text-field (instantiate text-field% () - (parent file-panel) - (callback void) - (min-width 300) - (stretchable-width #t) - (label (string-constant install-plt-filename)))) - (define file-button (instantiate button% () - (parent file-panel) - (label (string-constant browse...)) - (callback (λ (x y) (browse))))) - (define url-text-field (instantiate text-field% () - (parent url-panel) - (label (string-constant install-plt-url)) - (min-width 300) - (stretchable-width #t) - (callback void))) - + (new tab-panel% [parent dialog] + [callback (λ (x y) (update-panels))] + [choices (list (string-constant install-plt-web-tab) + (string-constant install-plt-file-tab))])) + (define outer-swapping-panel + (new horizontal-panel% [parent tab-panel] + [stretchable-height #f])) + (define spacing-panel + (new horizontal-panel% [parent outer-swapping-panel] + [stretchable-width #f] + [min-width 20])) + (define swapping-panel + (new panel:single% [parent outer-swapping-panel] + [alignment '(left center)] + [stretchable-width #t] [stretchable-height #f])) + (define file-panel + (new horizontal-panel% [parent swapping-panel] + [stretchable-width #t] [stretchable-height #f])) + (define url-panel + (new horizontal-panel% [parent swapping-panel] + [stretchable-height #f])) + (define button-panel + (new horizontal-panel% [parent dialog] + [stretchable-height #f] [alignment '(right center)])) + (define file-text-field + (new text-field% [parent file-panel] + [callback void] [min-width 300] [stretchable-width #t] + [init-value (caddr pref)] + [label (string-constant install-plt-filename)])) + (define file-button + (new button% [parent file-panel] + [callback (λ (x y) (browse))] + [label (string-constant browse...)])) + (define url-text-field + (new text-field% [parent url-panel] + [min-width 300] [stretchable-width #t] [callback void] + [init-value (cadr pref)] + [label (string-constant install-plt-url)])) (define-values (ok-button cancel-button) (gui-utils:ok/cancel-buttons button-panel - (λ (x y) - (set! cancel? #f) - (send dialog show #f)) - (λ (x y) - (send dialog show #f)))) - + (λ (x y) (set! cancel? #f) (send dialog show #f)) + (λ (x y) (send dialog show #f)))) ;; browse : -> void - ;; gets the name of a file from the user and - ;; updates file-text-field + ;; gets the name of a file from the user and updates file-text-field (define (browse) (let ([filename (finder:get-file #f "" #f "" dialog)]) (when filename (send file-text-field set-value (path->string filename))))) - ;; from-web? : -> boolean ;; returns #t if the user has selected a web address (define (from-web?) (zero? (send tab-panel get-selection))) - (define cancel? #t) - (define (update-panels) - (send swapping-panel active-child - (if (from-web?) - url-panel - file-panel))) - + (define w? (from-web?)) + (define t (if w? url-text-field file-text-field)) + (send swapping-panel active-child (if w? url-panel file-panel)) + (send t focus) + (send (send t get-editor) set-position + 0 (string-length (send t get-value)))) + ;; initialize + (send tab-panel set-selection (if (car pref) 0 1)) (update-panels) (send dialog show #t) - + (preferences:set 'drscheme:install-plt-dialog + (list (from-web?) + (send url-text-field get-value) + (send file-text-field get-value))) (cond [cancel? (void)] [(from-web?) - (install-plt-from-url (trim-whitespace (send url-text-field get-value)) parent)] - [else - (parameterize ([error-display-handler drscheme:init:original-error-display-handler]) - (run-installer (string->path (send file-text-field get-value))))])) - - ;; trim-whitespace: string -> string - ;; Trims the whitespace surrounding a string. - (define (trim-whitespace a-str) - (cond - [(regexp-match #px"^\\s*(.*[^\\s])\\s*$" - a-str) - => second] - [else - a-str])) - + (install-plt-from-url + (let* ([url (send url-text-field get-value)] + ;; trim whitespaces + [url (regexp-replace #rx"^ +" url "")] + [url (regexp-replace #rx" +$" url "")]) + (if (regexp-match? #rx"^(?:[^/:]*://|$)" url) + url + (string-append "http://" url))) + parent)] + [else (parameterize ([error-display-handler + drscheme:init:original-error-display-handler]) + (run-installer + (string->path (send file-text-field get-value))))])) + ;; install-plt-from-url : string (union #f dialog%) -> void ;; downloads and installs a .plt file from the given url (define (install-plt-from-url s-url parent) diff --git a/collects/drscheme/private/main.ss b/collects/drscheme/private/main.ss index 2e759a83d9..1f46e3d613 100644 --- a/collects/drscheme/private/main.ss +++ b/collects/drscheme/private/main.ss @@ -152,6 +152,11 @@ (λ (x) (and (list? x) (andmap (λ (x) (or (path? x) (drscheme:frame:planet-spec? x))) x)))) +(preferences:set-default 'drscheme:install-plt-dialog + '(#t "" "") ; url-selected?, url string, file string + (λ (x) (and (list? x) (= 3 (length x)) + (boolean? (car x)) + (andmap string? (cdr x))))) (preferences:set-un/marshall 'drscheme:user-defined-keybindings From 364e4ff3d5b09bbcd848ea41e21bb01ef5838982 Mon Sep 17 00:00:00 2001 From: Jay McCarthy Date: Tue, 26 Jan 2010 21:59:22 +0000 Subject: [PATCH 076/113] The closure library was designed just for the Web language, which operates after expansion, so it never saw normal lambdas. The documentation, however, advertises it for general use and it disallowed keyword arguments. This fixes that problem. svn: r17844 --- collects/web-server/lang/closure.ss | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/collects/web-server/lang/closure.ss b/collects/web-server/lang/closure.ss index a2346d6550..2a030cb874 100644 --- a/collects/web-server/lang/closure.ss +++ b/collects/web-server/lang/closure.ss @@ -78,9 +78,12 @@ ; prop-vals: (list (cons prop:serializable #,CLOSURE:serialize-info-id) (cons prop:procedure - (#%plain-lambda (clsr . args) - (let-values ([#,fvars ((CLOSURE-ref clsr 0))]) - (apply #,stx args))))) + (make-keyword-procedure + (lambda (kws kw-vals clsr . rst) + (let-values ([#,fvars ((CLOSURE-ref clsr 0))]) + (keyword-apply #,stx + kws kw-vals + rst)))))) #f ; inspector From 3d3038baecfb590b905fa4dbd5411ed9420c70ad Mon Sep 17 00:00:00 2001 From: Kevin Tew Date: Tue, 26 Jan 2010 22:04:24 +0000 Subject: [PATCH 077/113] gc debugging fix svn: r17845 --- src/mzscheme/gc2/newgc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mzscheme/gc2/newgc.c b/src/mzscheme/gc2/newgc.c index 17561ff814..01566ce8a5 100644 --- a/src/mzscheme/gc2/newgc.c +++ b/src/mzscheme/gc2/newgc.c @@ -2978,7 +2978,7 @@ static void fprintf_debug(NewGC *gc, const char *msg, objhead *info, FILE* file, fprintf(file, "RMP %p already freed and out of bounds\n", SCHEME_PATH_VAL(obj)); } default: - fprintf_buffer(file, ((char *)obj), (info->size * WORD_SIZE)); + fprintf_buffer(file, ((char *)obj), (info->size * WORD_SIZE) - sizeof(objhead)); break; } } From 865e55017434d2f629d3d7fee3a2a3da4b0fe42d Mon Sep 17 00:00:00 2001 From: Eli Barzilay Date: Wed, 27 Jan 2010 08:50:34 +0000 Subject: [PATCH 078/113] Welcome to a new PLT day. svn: r17847 --- collects/repos-time-stamp/stamp.ss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/collects/repos-time-stamp/stamp.ss b/collects/repos-time-stamp/stamp.ss index 1905746c5d..246e091138 100644 --- a/collects/repos-time-stamp/stamp.ss +++ b/collects/repos-time-stamp/stamp.ss @@ -1 +1 @@ -#lang scheme/base (provide stamp) (define stamp "26jan2010") +#lang scheme/base (provide stamp) (define stamp "27jan2010") From 4b1fdd9bc061f3f5f4ade8bf8159048abe42f6bf Mon Sep 17 00:00:00 2001 From: Eli Barzilay Date: Wed, 27 Jan 2010 09:58:48 +0000 Subject: [PATCH 079/113] added places svn: r17849 --- collects/meta/dist-specs.ss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/collects/meta/dist-specs.ss b/collects/meta/dist-specs.ss index b96401b67b..0e0547c390 100644 --- a/collects/meta/dist-specs.ss +++ b/collects/meta/dist-specs.ss @@ -344,7 +344,7 @@ mz-manuals := (scribblings: "main/") ; generates main pages (next line) (notes: "COPYING.LIB" "COPYING-libscheme.txt") (doc: "doc-license.txt") ; needed (when docs are included) (doc+src: "reference/" "guide/" "quick/" "more/" - "foreign/" "inside/" "futures/" + "foreign/" "inside/" "futures/" "places/" "honu/") (doc: "*.{html|css|js|sxref}") (scribblings: "{{info|icons}.ss|*.png}" "compiled") From 980d48ce1901375da96ca2f8f2f0376bdd92896a Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Wed, 27 Jan 2010 12:56:51 +0000 Subject: [PATCH 080/113] fix karen and psyntax benchmarks svn: r17850 --- .../tests/mzscheme/benchmarks/common/auto.ss | 40 +- .../benchmarks/common/gambit-prelude.sch | 1 + .../benchmarks/common/index-template.html | 15 +- .../mzscheme/benchmarks/common/kanren.sch | 904 +++++++++--------- .../benchmarks/common/psyntax-input.txt | 196 ++-- .../mzscheme/benchmarks/common/psyntax.sch | 726 +++++++------- .../mzscheme/benchmarks/common/psyntax.ss | 2 +- 7 files changed, 970 insertions(+), 914 deletions(-) diff --git a/collects/tests/mzscheme/benchmarks/common/auto.ss b/collects/tests/mzscheme/benchmarks/common/auto.ss index 725e59e906..a532255f51 100755 --- a/collects/tests/mzscheme/benchmarks/common/auto.ss +++ b/collects/tests/mzscheme/benchmarks/common/auto.ss @@ -14,6 +14,7 @@ exec mzscheme -qu "$0" ${1+"$@"} mzlib/inflate mzlib/date mzlib/port + mzlib/file dynext/file syntax/toplevel scheme/runtime-path) @@ -37,10 +38,16 @@ exec mzscheme -qu "$0" ${1+"$@"} (delete-file (format "~a.o1" bm))) (define (mk-mzscheme bm) - ;; To get compilation time: - (parameterize ([current-namespace (make-base-namespace)]) - (namespace-require 'scheme/base) - (load (format "~a.ss" bm)))) + (unless (directory-exists? "compiled") + (make-directory "compiled")) + (parameterize ([current-namespace (make-base-namespace)] + [read-accept-reader #t]) + (let ([name (format "~a.ss" bm)]) + (compile-file name + (build-path "compiled" (path-add-suffix name #".zo")))))) + + (define (clean-up-zo bm) + (delete-directory/files "compiled")) (define (clean-up-nothing bm) (void)) @@ -74,9 +81,6 @@ exec mzscheme -qu "$0" ${1+"$@"} (eval '(define null #f)) ; for dynamic.sch (compile-file (format "~a.sch" bm)))) - (define (clean-up-zo bm) - (delete-file (build-path "compiled" (format "~a.zo" bm)))) - (define (setup-larceny bm) (setup-sps bm "(larceny benchmarking)")) @@ -126,7 +130,7 @@ exec mzscheme -qu "$0" ${1+"$@"} (lambda () (printf "(library (~a)\n" bm) (printf " (export bm-!-go)\n") - (printf " (import (rnrs) (rnrs mutable-pairs) (rnrs mutable-strings) (rnrs r5rs) ~a)\n" lib) + (printf " (import (rnrs) (rnrs mutable-pairs) (rnrs mutable-strings) (rnrs r5rs) (rnrs eval) ~a)\n" lib) (printf " (define (bm-!-go) 'ok)\n") (call-with-input-file (format "~a.sch" bm) (lambda (in) @@ -209,9 +213,11 @@ exec mzscheme -qu "$0" ${1+"$@"} #"([0-9]*) ms elapsed cpu time, including ([0-9]*) ms collecting\n" #"[ \t]*([0-9]*) ms elapsed real time") str)]) - (list (string->number (bytes->string/utf-8 (cadr m))) - (string->number (bytes->string/utf-8 (cadddr m))) - (string->number (bytes->string/utf-8 (caddr m)))))) + (if m + (list (string->number (bytes->string/utf-8 (cadr m))) + (string->number (bytes->string/utf-8 (cadddr m))) + (string->number (bytes->string/utf-8 (caddr m)))) + (list #f #f #f)))) ;; Table of implementatons and benchmarks ------------------------------ @@ -235,7 +241,7 @@ exec mzscheme -qu "$0" ${1+"$@"} (lambda (bm) (system (format "mzscheme -u ~a.ss" bm))) extract-mzscheme-times - clean-up-nothing + clean-up-zo mutable-pair-progs) (make-impl 'mz-old void @@ -243,7 +249,7 @@ exec mzscheme -qu "$0" ${1+"$@"} (lambda (bm) (system (format "mz-old -u ~a.ss" bm))) extract-mzscheme-times - clean-up-nothing + clean-up-zo mutable-pair-progs) (make-impl 'mzschemecgc void @@ -251,7 +257,7 @@ exec mzscheme -qu "$0" ${1+"$@"} (lambda (bm) (system (format "mzschemecgc -u ~a.ss" bm))) extract-mzscheme-times - clean-up-nothing + clean-up-zo mutable-pair-progs) (make-impl 'mzscheme3m void @@ -259,7 +265,7 @@ exec mzscheme -qu "$0" ${1+"$@"} (lambda (bm) (system (format "mzscheme3m -u ~a.ss" bm))) extract-mzscheme-times - clean-up-nothing + clean-up-zo mutable-pair-progs) (make-impl 'plt-r5rs void @@ -286,7 +292,7 @@ exec mzscheme -qu "$0" ${1+"$@"} (lambda (bm) (system (format "mzscheme -jqu ~a.ss" bm))) extract-mzscheme-times - clean-up-nothing + clean-up-zo mutable-pair-progs) (make-impl 'mzschemecgc-j void @@ -294,7 +300,7 @@ exec mzscheme -qu "$0" ${1+"$@"} (lambda (bm) (system (format "mzschemecgc -jqu ~a.ss" bm))) extract-mzscheme-times - clean-up-nothing + clean-up-zo mutable-pair-progs) (make-impl 'mzschemecgc-tl void diff --git a/collects/tests/mzscheme/benchmarks/common/gambit-prelude.sch b/collects/tests/mzscheme/benchmarks/common/gambit-prelude.sch index 26f69d687a..bb9f3cc061 100644 --- a/collects/tests/mzscheme/benchmarks/common/gambit-prelude.sch +++ b/collects/tests/mzscheme/benchmarks/common/gambit-prelude.sch @@ -5,3 +5,4 @@ (safe) (interrupts-enabled) ) + diff --git a/collects/tests/mzscheme/benchmarks/common/index-template.html b/collects/tests/mzscheme/benchmarks/common/index-template.html index ecdf4dc875..65db9ac8d1 100644 --- a/collects/tests/mzscheme/benchmarks/common/index-template.html +++ b/collects/tests/mzscheme/benchmarks/common/index-template.html @@ -7,11 +7,13 @@ -

Tables show relative performance, with the actual time for the fastest - run shown on the left. So, by default, 1 - is the fastest, but select any implementation to normalize the table with - respect to that implementation's speed. A -- appears when a benchmark - didn't run in an implementation for some reason (possibly not a good one).

+

Tables show relative performance, with the actual time for the + fastest run shown on the left. So, by + default, 1 is the fastest, + but select any implementation to normalize the table with respect + to that implementation's speed. A - appears when a + benchmark didn't run in an implementation for some reason (possibly + not a good one).

Small gray numbers are (relative) compile times, where the compile time for the nothing @@ -35,7 +37,8 @@ time.

compiled and run with -:m10000
  • Ikarus (0.0.4-rc1+ rev 1870): in R6RS library
  • Larceny (0.97): in R6RS library
  • -
  • PLT (4.2.4): in module
  • +
  • PLT (4.2.4): in module; for benchmarks that use set-car! and set-cdr!, + PLT's R5RS support is used
  • These configurations are all “safe mode,” but they allow the compiler to assume that built-in Scheme functions are not redefined and that no top-level defintion is ever diff --git a/collects/tests/mzscheme/benchmarks/common/kanren.sch b/collects/tests/mzscheme/benchmarks/common/kanren.sch index 6f28c2c4bf..8d46a91dd8 100644 --- a/collects/tests/mzscheme/benchmarks/common/kanren.sch +++ b/collects/tests/mzscheme/benchmarks/common/kanren.sch @@ -1,5 +1,5 @@ -(define error - (lambda args (/ args))) +;; smashed into benchmark form by Matthew + (define errorf error) ; like cout << arguments << args @@ -14,7 +14,7 @@ (define cerr cout) (define pntall (lambda v (write v) (newline))) -(define (pretty-print v) (write v) (newline)) +(define (_pretty-print v) (write v) (newline)) (define nl (string #\newline)) @@ -113,14 +113,15 @@ (define-syntax test-check (syntax-rules () ((_ title tested-expression expected-result) - (begin - (cout "Testing " title nl) - (let* ((expected expected-result) - (produced tested-expression)) - (or (equal? expected produced) - (errorf 'test-check - "Failed: ~a~%Expected: ~a~%Computed: ~a~%" - 'tested-expression expected produced))))))) + (begin + (cout "Testing " title nl) + (let* ((expected expected-result) + (produced tested-expression)) + (or (equal? expected produced) + (errorf 'test-check + "Failed: ~a~%Expected: ~a~%Computed: ~a~%" + 'tested-expression expected produced))) + #f)))) (define symbol-append (lambda symbs @@ -149,7 +150,7 @@ (let ((id (logical-variable 'id)) ...) body)))) ; The anonymous variable -(define _ (let-lv (_) _)) +(define __ (let-lv (_) _)) ; Another way to introduce logical variables: via distinguished pairs ; (define logical-var-tag (list '*logical-var-tag*)) ; unique for eq? @@ -175,9 +176,14 @@ ; the exclamation mark. The mark makes sure the symbol stands out when ; printed. +(define counter 0) +(define (jensym s) + (set! counter (+ counter 1)) + (string->symbol (string-append "!$gen$!" s (number->string counter)))) + (define eigen-variable (lambda (id) - (symbol-append '! id '_ (gensym "x")))) + (symbol-append '! id '_ (jensym "x")))) (define eigen-var? (lambda (x) @@ -195,6 +201,7 @@ ((_ (id ...) body) (let ((id (eigen-variable 'id)) ...) body)))) +(define (eigen-test) (test-check 'eigen (and (eigen () #t) @@ -202,7 +209,7 @@ (eigen (x y) (begin (display "eigens: ") (display (list x y)) (newline) #t))) - #t) + #t)) ;;; ------------------------------------------------------ @@ -437,7 +444,7 @@ ;;;; This is Oleg's unifier ; Either t or u may be: -; _ +; __ ; free-var ; bound-var ; pair @@ -461,8 +468,8 @@ (lambda (t u subst) (cond ((eq? t u) subst) ; quick tests first - ((eq? t _) subst) - ((eq? u _) subst) + ((eq? t __) subst) + ((eq? u __) subst) ((var? t) (let*-and (unify-free/any t u subst) ((ct (assq t subst))) (if (var? u) ; ct is a bound var, u is a var @@ -505,13 +512,13 @@ ; Just like unify. However, the first term, t, comes from -; an internalized term. We know it can't be _ and can't contain _ +; an internalized term. We know it can't be __ and can't contain __ (define unify-internal/any (lambda (t u subst) (cond ((eq? t u) subst) ; quick tests first - ((eq? u _) subst) + ((eq? u __) subst) ((var? t) (let*-and (unify-free/any t u subst) ((ct (assq t subst))) (if (var? u) ; ct is a bound var, u is a var @@ -537,8 +544,8 @@ ; the other way around. ; Aside from the above, this function can take advantage of the following ; facts about (commitment->term cx) (where cx is an existing commitment): -; - it is never _ -; - it never contains _ +; - it is never __ +; - it never contains __ ; Most importantly, if, for example, (commitment->term ct) is a free variable, ; we enter its binding to (commitment->term cu) with fewer checks. ; in particular, we never need to call unify-free/list nor @@ -583,7 +590,7 @@ (define unify-free/any (lambda (t-var u subst) (cond - ((eq? u _) subst) + ((eq? u __) subst) ((var? u) (let*-and (extend-subst t-var u subst) ((cu (assq u subst))) (unify-free/bound t-var cu subst))) @@ -631,13 +638,13 @@ ; t-var is a free variable, u-value is a proper or improper ; list, which may be either fully or partially grounded (or not at all). -; We scan the u-value for _, and if, found, replace them with fresh +; We scan the u-value for __, and if, found, replace them with fresh ; variables. We then bind t-var to the term. ; This function is not recursive and always succeeds. ; -; We assume that more often than not u-value does not contain _. +; We assume that more often than not u-value does not contain __. ; Therefore, to avoid the wasteful rebuilding of u-value, we -; first scan it for the occurrence of _. If the scan returns negative, +; first scan it for the occurrence of __. If the scan returns negative, ; we can use u-value as it is. ; Rebuild lst replacing all anonymous variables with some @@ -647,7 +654,7 @@ (define ufl-rebuild-without-anons (lambda (lst) (cond - ((eq? lst _) (logical-variable '*anon)) + ((eq? lst __) (logical-variable '*anon)) ((not (pair? lst)) #f) ((null? (cdr lst)) (let ((new-car (ufl-rebuild-without-anons (car lst)))) @@ -670,7 +677,7 @@ (define (term-tests) - (cout nl "Compositions of substitutions" nl) + ; (cout nl "Compositions of substitutions" nl) ; (let-lv (x y) ; (test-check 'test-compose-subst-0 ; (append (unit-subst x y) (unit-subst y 52)) @@ -857,7 +864,7 @@ (list (let-lv (x0 x1 y0 y1) (begin - (pretty-print + (_pretty-print (reify-subst '() (unify `(h ,x1 (f ,y0 ,y0) ,y1) @@ -867,7 +874,7 @@ (let-lv (x0 x1 x2 y0 y1 y2) (begin - (pretty-print + (_pretty-print (reify-subst '() (unify `(h ,x1 ,x2 (f ,y0 ,y0) (f ,y1 ,y1) ,y2) @@ -877,7 +884,7 @@ (let-lv (x0 x1 x2 x3 x4 y0 y1 y2 y3 y4) (begin - (pretty-print + (_pretty-print (reify-subst '() (unify `(h ,x1 ,x2 ,x3 ,x4 (f ,y0 ,y0) (f ,y1 ,y1) (f ,y2 ,y2) (f ,y3 ,y3) ,y4) @@ -894,7 +901,8 @@ (reify-subst '() subst))) '((z.0 42) (y.0 (2 3 4 5 42)) (x.0 (1 2 3 4 5 42)))) ;'((z.0 . 42) (y.0 2 3 4 5 a*.0) (a*.0 . z.0) (x.0 1 2 3 4 5 a*.0))) - + + 10 ) @@ -915,18 +923,18 @@ (lambda (formal0) (lambda@ (formal1 formal2 ...) body0 body1 ...))))) -(define-syntax @ +(define-syntax at@ (syntax-rules () ((_ rator rand) (rator rand)) - ((_ rator rand0 rand1 rand2 ...) (@ (rator rand0) rand1 rand2 ...)))) + ((_ rator rand0 rand1 rand2 ...) (at@ (rator rand0) rand1 rand2 ...)))) -(test-check 'test-@-lambda@ - (@ (lambda@ (x y z) (+ x (+ y z))) 1 2 3) - 6) +;(test-check 'test-@-lambda@ +; (at@ (lambda@ (x y z) (+ x (+ y z))) 1 2 3) +; 6) -'(test-check 'test-@-lambda@ - (@ (lambda@ (x y z) (+ x (+ y z))) 1 2 3) - 42) +;'(test-check 'test-@-lambda@ +; (at@ (lambda@ (x y z) (+ x (+ y z))) 1 2 3) +; 42) (define Y (lambda (f) @@ -959,7 +967,7 @@ ; Trivial goals -(define succeed (lambda@ (s k) (@ k s))) ; eta-reduced +(define succeed (lambda@ (s k) (at@ k s))) ; eta-reduced (define fail (lambda@ (s k f) (f))) (define sfail (lambda@ (k f) (f))) ; Failed SGoal @@ -1085,16 +1093,16 @@ ; ((_ (ex-id) gl) ; (let-lv (ex-id) ; (lambda@ (sk fk in-subst) -; (@ gl +; (at@ gl ; (lambda@ (fk out-subst) -; (@ sk fk (lv-elim-1 ex-id in-subst out-subst))) +; (at@ sk fk (lv-elim-1 ex-id in-subst out-subst))) ; fk in-subst)))) ; ((_ (ex-id ...) gl) ; (let-lv (ex-id ...) ; (lambda@ (sk fk in-subst) -; (@ gl +; (at@ gl ; (lambda@ (fk out-subst) -; (@ sk fk (lv-elim (list ex-id ...) in-subst out-subst))) +; (at@ sk fk (lv-elim (list ex-id ...) in-subst out-subst))) ; fk in-subst)))))) ; For the unifier that doesn't introduce temp variables, @@ -1117,7 +1125,7 @@ ; So, to prune variables and preserve sharing, we have to topologically sort ; the bindings first! -(define-syntax exists +(define-syntax _exists (syntax-rules () ((_ () gl) gl) ((_ (ex-id ...) gl) @@ -1142,13 +1150,13 @@ (let ((print-it (lambda (event subst) (display title) (display " ") - (display event) (pretty-print subst) (newline)))) + (display event) (_pretty-print subst) (newline)))) (lambda@ (subst sk fk) (print-it "CALL:" subst) - (@ gl subst + (at@ gl subst (lambda@ (subst fk) (print-it "RETURN:" subst) - (@ sk subst + (at@ sk subst (lambda () (display title) (display " REDO") (newline) (fk)) @@ -1182,9 +1190,9 @@ (define-syntax splice-in-gls/all (syntax-rules () - ((_ subst sk gl) (@ gl subst sk)) + ((_ subst sk gl) (at@ gl subst sk)) ((_ subst sk gl0 gl1 ...) - (@ gl0 subst (lambda (subst) (splice-in-gls/all subst sk gl1 ...)))))) + (at@ gl0 subst (lambda (subst) (splice-in-gls/all subst sk gl1 ...)))))) ; (promise-one-answer gl) @@ -1226,9 +1234,9 @@ ((_ gl0 gl1 ...) (promise-one-answer (lambda@ (subst sk fk) - (@ + (at@ (splice-in-gls/all subst - (lambda@ (subst fk-ign) (@ sk subst fk)) gl0 gl1 ...) + (lambda@ (subst fk-ign) (at@ sk subst fk)) gl0 gl1 ...) fk)))))) ; (all!! gl1 gl2 ...) @@ -1252,11 +1260,11 @@ (define-syntax splice-in-gls/all!! (syntax-rules (promise-one-answer) ((_ subst sk fk) - (@ sk subst fk)) + (at@ sk subst fk)) ((_ subst sk fk (promise-one-answer gl)) - (@ gl subst sk fk)) + (at@ gl subst sk fk)) ((_ subst sk fk gl0 gl1 ...) - (@ gl0 subst + (at@ gl0 subst (lambda@ (subst fk-ign) (splice-in-gls/all!! subst sk fk gl1 ...)) fk)))) @@ -1288,16 +1296,16 @@ (syntax-rules () ((_ condition then) (lambda@ (subst sk fk) - (@ condition subst + (at@ condition subst ; sk from cond - (lambda@ (subst fk-ign) (@ then subst sk fk)) + (lambda@ (subst fk-ign) (at@ then subst sk fk)) ; failure from cond fk))) ((_ condition then else) (lambda@ (subst sk fk) - (@ condition subst - (lambda@ (subst fk-ign) (@ then subst sk fk)) - (lambda () (@ else subst sk fk)) + (at@ condition subst + (lambda@ (subst fk-ign) (at@ then subst sk fk)) + (lambda () (at@ else subst sk fk)) ))))) ; (if-all! (COND1 ... CONDN) THEN) @@ -1354,9 +1362,9 @@ (define-syntax splice-in-gls/any (syntax-rules () - ((_ subst sk fk gl1) (@ gl1 subst sk fk)) + ((_ subst sk fk gl1) (at@ gl1 subst sk fk)) ((_ subst sk fk gl1 gl2 ...) - (@ gl1 subst sk (lambda () (splice-in-gls/any subst sk fk gl2 ...)))))) + (at@ gl1 subst sk (lambda () (splice-in-gls/any subst sk fk gl2 ...)))))) ; Negation @@ -1373,16 +1381,16 @@ (define fails (lambda (gl) (lambda@ (subst sk fk) - (@ gl subst + (at@ gl subst (lambda@ (subst current-fk) (fk)) - (lambda () (@ sk subst fk)) + (lambda () (at@ sk subst fk)) )))) ; Again, G-Rule must hold for this predicate to be logically sound (define succeeds (lambda (gl) (lambda@ (subst sk fk) - (@ gl subst (lambda@ (subst-ign fk-ign) (@ sk subst fk)) + (at@ gl subst (lambda@ (subst-ign fk-ign) (at@ sk subst fk)) fk)))) ; partially-eval-sgl: Partially evaluate a semi-goal. A @@ -1396,7 +1404,7 @@ ; be implemented with streams (lazy lists). The following is a purely ; combinational implementation. ; -; (@ partially-eval-sgl sgl a b) => +; (at@ partially-eval-sgl sgl a b) => ; (b) if sgl has no answers ; (a s residial-sgl) if sgl has a answer. That answer is delivered ; in s. @@ -1406,14 +1414,14 @@ ; The following definition is eta-reduced. (define (partially-eval-sgl sgl) - (@ sgl + (at@ sgl (lambda@ (subst fk a b) - (@ a subst + (at@ a subst (lambda@ (sk1 fk1) - (@ + (at@ (fk) ; new a - (lambda@ (sub11 x) (@ sk1 sub11 (lambda () (@ x sk1 fk1)))) + (lambda@ (sub11 x) (at@ sk1 sub11 (lambda () (at@ x sk1 fk1)))) ; new b fk1)))) (lambda () (lambda@ (a b) (b))))) @@ -1444,16 +1452,16 @@ ((null? sgls) (fk)) ; all of the sgls are finished ((null? (cdr sgls)) ; only one of sgls left -- run it through the end - (@ (car sgls) sk fk)) + (at@ (car sgls) sk fk)) (else (let loop ((curr sgls) (residuals '())) ; check if the current round is finished (if (null? curr) (interleave sk fk (reverse residuals)) - (@ + (at@ partially-eval-sgl (car curr) ; (car curr) had an answer (lambda@ (subst residual) - (@ sk subst + (at@ sk subst ; re-entrance cont (lambda () (loop (cdr curr) (cons residual residuals))))) ; (car curr) is finished - drop it, and try next @@ -1505,13 +1513,13 @@ (cond ((null? sagls) (fk)) ; all of the sagls are finished ((null? (cdr sagls)) ; only one gl is left -- run it through the end - (@ (caar sagls) sk fk)) + (at@ (caar sagls) sk fk)) (else (let loop ((curr sagls) (residuals '())) ; check if the current round is finished (if (null? curr) (outer (reverse residuals)) - (@ + (at@ partially-eval-sgl (caar curr) ; (caar curr) had an answer (lambda@ (subst residual) @@ -1519,12 +1527,12 @@ ; gls down the curr. (let check ((to-check (cdr curr))) (if (null? to-check) ; OK, subst is unique,give it to user - (@ sk subst + (at@ sk subst ; re-entrance cont (lambda () (loop (cdr curr) (cons (cons residual (cdar curr)) residuals)))) - (@ (cdar to-check) subst + (at@ (cdar to-check) subst ; subst was the answer to some other gl: ; check failed (lambda@ (subst1 fk1) @@ -1575,13 +1583,13 @@ ((_ condition then) (all condition then)) ((_ condition then else) (lambda@ (subst sk fk) - (@ partially-eval-sgl (condition subst) + (at@ partially-eval-sgl (condition subst) (lambda@ (ans residual) - (@ then ans sk + (at@ then ans sk ; then failed. Check to see if condition has another answer - (lambda () (@ residual (lambda@ (subst) (@ then subst sk)) fk)))) + (lambda () (at@ residual (lambda@ (subst) (at@ then subst sk)) fk)))) ; condition failed - (lambda () (@ else subst sk fk))))))) + (lambda () (at@ else subst sk fk))))))) ; An interleaving conjunction: all-interleave @@ -1675,11 +1683,11 @@ (define all-interleave-bin (lambda (sgl1 gl2) (lambda@ (sk fk) - (@ partially-eval-sgl sgl1 + (at@ partially-eval-sgl sgl1 (lambda@ (ans residual) (interleave sk fk (list - (@ gl2 ans) + (at@ gl2 ans) (all-interleave-bin residual gl2) ))) ;gl1 failed @@ -1725,21 +1733,21 @@ ; we notice that the logical variable 'x' occurs at the top-level. Normally we ; compile the relation like that into the following ; (lambda (g1 g2) -; (exists (x y) +; (_exists (x y) ; (lambda@ (subst) ; (let*-and (fail subst) ((subst (unify g1 `(,x . ,y) subst)) ; (subst (unify g2 x subst))) -; (@ body subst))))) +; (at@ body subst))))) ; ; However, that we may permute the order of 'unify g...' clauses ; to read ; (lambda (g1 g2) -; (exists (x y) +; (_exists (x y) ; (lambda@ (subst) ; (let*-and (fail subst) ((subst (unify x g2 subst)) ; (subst (unify g1 `(,x . ,y) subst)) ; ) -; (@ body subst))))) +; (at@ body subst))))) ; ; We may further note that according to the properties of the unifier ; (see below), (unify x g2 subst) must always succeed, @@ -1751,7 +1759,7 @@ ; to being lexical. Thus, we compile the relation as ; ; (lambda (g1 g2) -; (exists (x y) +; (_exists (x y) ; (lambda@ (subst) ; (let* ((subst (unify-free/any x g2 subst)) ; (fast-path? (and (pair? subst) @@ -1760,14 +1768,14 @@ ; (subst (if fast-path? (cdr subst) subst))) ; (let*-and sfail ((subst (unify g1 `(,x . ,y) subst)) ; ) -; (@ body subst)))))) +; (at@ body subst)))))) ; ; The benefit of that approach is that we limit the growth of subst and avoid ; keeping commitments that had to be garbage-collected later. (define-syntax relation - (syntax-rules (to-show head-let once _) + (syntax-rules (to-show head-let once __) ((_ (head-let head-term ...) gl) (relation-head-let (head-term ...) gl)) ((_ (head-let head-term ...)) ; not particularly useful without body @@ -1794,7 +1802,7 @@ ; parameters, and forget them ; also, note and keep track of the first occurrence of a term ; that is just a var (bare-var) - ((_ "g" vars once-vars (gs ...) gunis bvars bvar-cl (_ . terms) . gl) + ((_ "g" vars once-vars (gs ...) gunis bvars bvar-cl (__ . terms) . gl) (relation "g" vars once-vars (gs ... anon) gunis bvars bvar-cl terms . gl)) ((_ "g" vars once-vars (gs ...) gunis bvars (subst . cls) @@ -1830,20 +1838,20 @@ ; Final: writing the code ((_ "f" vars () () () (subst) gl) ; no arguments (no head-tests) (lambda () - (exists vars gl))) + (_exists vars gl))) ; no tests but pure binding ((_ "f" (ex-id ...) once-vars (g ...) () (subst) gl) (lambda (g ...) - (exists (ex-id ...) gl))) + (_exists (ex-id ...) gl))) ; the most general ((_ "f" (ex-id ...) once-vars (g ...) ((gv . term) ...) (subst let*-clause ...) gl) (lambda (g ...) - (exists (ex-id ...) + (_exists (ex-id ...) (lambda (subst) (let* (let*-clause ...) (let*-and sfail ((subst (unify gv term subst)) ...) - (@ gl subst))))))))) + (at@ gl subst))))))))) ; A macro-expand-time memv function for identifiers ; id-memv?? FORM (ID ...) KT KF @@ -1948,14 +1956,14 @@ (lambda gvs ; don't bother bind vars (lambda@ (subst) (let*-and sfail ((subst (unify gv term subst)) ...) - (@ succeed subst))))) + (at@ succeed subst))))) ((_ "f" (var0 ...) ((gvo term) ...) gvs gl) (lambda gvs (lambda@ (subst) ; first unify the constants (let*-and sfail ((subst (unify gvo term subst)) ...) - (let ((var0 (if (eq? var0 _) (logical-variable '?) var0)) ...) - (@ gl subst)))))))) + (let ((var0 (if (eq? var0 __) (logical-variable '?) var0)) ...) + (at@ gl subst)))))))) ; (define-syntax relation/cut ; (syntax-rules (to-show) @@ -1965,11 +1973,11 @@ ; (relation/cut cut-id ex-ids (var ... g) (x1 ...) xs gl ...)) ; ((_ cut-id (ex-id ...) (g ...) () (x ...) gl ...) ; (lambda (g ...) -; (exists (ex-id ...) +; (_exists (ex-id ...) ; (all! (== g x) ... ; (lambda@ (sk fk subst cutk) ; (let ((cut-id (!! cutk))) -; (@ (all gl ...) sk fk subst cutk))))))))) +; (at@ (all gl ...) sk fk subst cutk))))))))) (define-syntax fact (syntax-rules () @@ -2043,9 +2051,9 @@ ; Unify lifted to be a binary relation (define-syntax == - (syntax-rules (_) - ((_ _ u) (lambda@ (subst sk) (@ sk subst))) - ((_ t _) (lambda@ (subst sk) (@ sk subst))) + (syntax-rules (__) + ((_ __ u) (lambda@ (subst sk) (at@ sk subst))) + ((_ t __) (lambda@ (subst sk) (at@ sk subst))) ((_ t u) (lambda@ (subst) (let*-and sfail ((subst (unify t u subst))) @@ -2071,7 +2079,7 @@ (syntax-rules () ((_ (redo-k subst id ...) A SE ...) (let-lv (id ...) - (@ A empty-subst + (at@ A empty-subst (lambda@ (subst redo-k) SE ...) (lambda () '())))))) @@ -2104,14 +2112,14 @@ ((_ (var ...) gl) (lambda@ (subst) (let ((var (nonvar! (subst-in var subst))) ...) - (@ gl subst)))))) + (at@ gl subst)))))) (define-syntax project/no-check (syntax-rules () ((_ (var ...) gl) (lambda@ (subst) (let ((var (subst-in var subst)) ...) - (@ gl subst)))))) + (at@ gl subst)))))) (define-syntax predicate (syntax-rules () @@ -2187,10 +2195,10 @@ sfail (let ((s (extend-subst depth-counter-var (+ counter 1) subst))) - (@ gl s)))))) + (at@ gl s)))))) (else (let ((s (extend-subst depth-counter-var 1 subst))) - (@ gl s))))))))) + (at@ gl s))))))))) )) ; ?- help(call_with_depth_limit/3). @@ -2241,7 +2249,7 @@ ) (test-check 'test-father0 (let ((result - (@ (father 'jon 'sam) empty-subst + (at@ (father 'jon 'sam) empty-subst initial-sk initial-fk))) (and (equal? (car result) '()) @@ -2250,7 +2258,7 @@ (test-check 'test-child-of-male-0 (reify-subst '() - (car (@ (child-of-male 'sam 'jon) empty-subst + (car (at@ (child-of-male 'sam 'jon) empty-subst initial-sk initial-fk))) ;`(,(commitment 'child.0 'sam) ,(commitment 'dad.0 'jon))) '()) ; variables shouldn't leak @@ -2259,7 +2267,7 @@ ; The mark should be found here... (test-check 'test-child-of-male-1 (reify-subst '() - (car (@ (child-of-male 'sam 'jon) empty-subst + (car (at@ (child-of-male 'sam 'jon) empty-subst initial-sk initial-fk))) ;`(,(commitment 'child.0 'sam) ,(commitment 'dad.0 'jon))) '()) @@ -2282,7 +2290,7 @@ ) (test-check 'test-father-1 (let ((result - (@ (new-father 'rob 'sal) empty-subst + (at@ (new-father 'rob 'sal) empty-subst initial-sk initial-fk))) (and (equal? (car result) '()) @@ -2310,7 +2318,7 @@ (test-check 'test-father-5 (query (redok subst x) (newer-father 'rob x) - (pretty-print subst) + (_pretty-print subst) (cons (reify-subst (list x) subst) (redok))) @@ -2394,7 +2402,7 @@ ((grandpa-sam (relation (grandchild) (to-show grandchild) - (exists (parent) + (_exists (parent) (all (father 'sam parent) (father parent grandchild)))))) (test-check 'test-grandpa-sam-1 @@ -2406,7 +2414,7 @@ ((grandpa-sam (relation ((once grandchild)) (to-show grandchild) - (exists (parent) + (_exists (parent) (all (father 'sam parent) (father parent grandchild)))))) (test-check 'test-grandpa-sam-1 @@ -2429,7 +2437,7 @@ (let ((grandpa (relation ((once grandad) (once grandchild)) (to-show grandad grandchild) - (exists (parent) + (_exists (parent) (all (father grandad parent) (father parent grandchild)))))) @@ -2441,7 +2449,7 @@ (lambda (guide* grandad*) (relation (grandchild) (to-show grandchild) - (exists (parent) + (_exists (parent) (all (guide* grandad* parent) (guide* parent grandchild))))))) @@ -2472,14 +2480,14 @@ ((grandpa/father (relation (grandad grandchild) (to-show grandad grandchild) - (exists (parent) + (_exists (parent) (all (father grandad parent) (father parent grandchild))))) (grandpa/mother (relation (grandad grandchild) (to-show grandad grandchild) - (exists (parent) + (_exists (parent) (all (father grandad parent) (mother parent grandchild))))) @@ -2496,7 +2504,7 @@ ((grandpa-sam (let ((r (relation (child) (to-show child) - (exists (parent) + (_exists (parent) (all (father 'sam parent) (father parent child)))))) @@ -2513,7 +2521,7 @@ ; (define grandpa/father ; (relation/cut cut (grandad grandchild) ; (to-show grandad grandchild) - ; (exists (parent) + ; (_exists (parent) ; (all ; (father grandad parent) ; (father parent grandchild) @@ -2522,7 +2530,7 @@ ; (define grandpa/mother ; (relation (grandad grandchild) ; (to-show grandad grandchild) - ; (exists (parent) + ; (_exists (parent) ; (all ; (father grandad parent) ; (mother parent grandchild))))) @@ -2533,7 +2541,7 @@ ((grandpa/father (relation (grandad grandchild) (to-show grandad grandchild) - (exists (parent) + (_exists (parent) (all! (father grandad parent) (father parent grandchild))))) @@ -2541,7 +2549,7 @@ (grandpa/mother (relation (grandad grandchild) (to-show grandad grandchild) - (exists (parent) + (_exists (parent) (all (father grandad parent) (mother parent grandchild))))) @@ -2560,21 +2568,21 @@ ; (define grandpa/father ; (relation/cut cut (grandad grandchild) ; (to-show grandad grandchild) - ; (exists (parent) + ; (_exists (parent) ; (all cut (father grandad parent) (father parent grandchild))))) (let ((grandpa/father (relation (grandad grandchild) (to-show grandad grandchild) - (exists (parent) + (_exists (parent) (all (father grandad parent) (father parent grandchild))))) (grandpa/mother (relation (grandad grandchild) (to-show grandad grandchild) - (exists (parent) + (_exists (parent) (all (father grandad parent) (mother parent grandchild))))) ) @@ -2638,7 +2646,7 @@ ((a-grandma (relation (grandad grandchild) (to-show grandad grandchild) - (exists (parent) + (_exists (parent) (all! (mother grandad parent))))) (no-grandma-grandpa (let-gls (a1 a2) ((a-grandma a-grandma) @@ -2671,14 +2679,14 @@ (let* ((parents-of-scouts-sgl ((parents-of-scouts p1 p2) empty-subst)) (cons@ (lambda@ (x y) (cons x y))) - (split1 (@ + (split1 (at@ partially-eval-sgl parents-of-scouts-sgl cons@ (lambda () '()))) (a1 (car split1)) - (split2 (@ partially-eval-sgl (cdr split1) cons@ + (split2 (at@ partially-eval-sgl (cdr split1) cons@ (lambda () '()))) (a2 (car split2)) - (split3 (@ partially-eval-sgl (cdr split2) cons@ + (split3 (at@ partially-eval-sgl (cdr split2) cons@ (lambda () '()))) (a3 (car split3))) (map (lambda (subst) @@ -2730,7 +2738,7 @@ (lambda (old young) (any (father old young) - (exists (not-so-old) + (_exists (not-so-old) (all (father old not-so-old) (ancestor not-so-old young))))))) @@ -2749,7 +2757,7 @@ (letrec ((move (extend-relation (a1 a2 a3 a4) - (fact () 0 _ _ _) + (fact () 0 __ __ __) (relation (n a b c) (to-show n a b c) (project (n) @@ -2788,7 +2796,7 @@ (letrec ((move (extend-relation (a1 a2 a3 a4) - (fact () 0 _ _ _) + (fact () 0 __ __ __) (relation (n a b c) (to-show n a b c) (project (n) @@ -2841,7 +2849,7 @@ (test-check 'unification-of-free-vars-4 (solve 1 (x) - (exists (y) + (_exists (y) (all! (== y x) (== y 5) (== x y)))) '(((x.0 5)))) @@ -2928,8 +2936,8 @@ ; (test-check 'lv-elim-1 ; (reify ; (let-lv (x z dummy) - ; (@ - ; (exists (y) + ; (at@ + ; (_exists (y) ; (== `(,x ,z ,y) `(5 9 ,x))) ; (lambda@ (fk subst) subst) ; initial-fk @@ -2940,8 +2948,8 @@ ; (test-check 'lv-elim-2 ; (reify ; (let-lv (x dummy) - ; (@ - ; (exists (y) + ; (at@ + ; (_exists (y) ; (== `(,x ,y) `((5 ,y) ,7))) ; (lambda@ (fk subst) subst) ; initial-fk @@ -2953,8 +2961,8 @@ ; (test-check 'lv-elim-3 ; (reify ; (let-lv (x v dummy) - ; (@ - ; (exists (y) + ; (at@ + ; (_exists (y) ; (== x `(a b c ,v d))) ; (lambda@ (fk subst) subst) ; initial-fk @@ -2966,7 +2974,7 @@ ; (test-check 'lv-elim-4-1 ; (reify ; (let-lv (x v b dummy) - ; (@ + ; (at@ ; (let-lv (y) ; (== `(,b ,x ,y) `(,x ,y 1))) ; (lambda@ (fk subst) subst) @@ -2977,9 +2985,9 @@ ; ; (test-check 'lv-elim-4-2 ; ; (concretize ; ; (let-lv (v b dummy) - ; ; (@ - ; ; (exists (x) - ; ; (exists (y) + ; ; (at@ + ; ; (_exists (x) + ; ; (_exists (y) ; ; (== `(,b ,x ,y) `(,x ,y 1)))) ; ; (lambda@ (fk subst) subst) ; ; initial-fk @@ -2989,9 +2997,9 @@ ; ; (test-check 'lv-elim-4-3 ; ; (concretize ; ; (let-lv (v b dummy) - ; ; (@ - ; ; (exists (y) - ; ; (exists (x) + ; ; (at@ + ; ; (_exists (y) + ; ; (_exists (x) ; ; (== `(,b ,x ,y) `(,x ,y 1)))) ; ; (lambda@ (fk subst) subst) ; ; initial-fk @@ -3001,8 +3009,8 @@ ; (test-check 'lv-elim-4-4 ; (reify ; (let-lv (v b dummy) - ; (@ - ; (exists (x y) + ; (at@ + ; (_exists (x y) ; (== `(,b ,x ,y) `(,x ,y 1))) ; (lambda@ (fk subst) subst) ; initial-fk @@ -3015,7 +3023,7 @@ ; (test-check 'lv-elim-5-1 ; (reify ; (let-lv (x v b dummy) - ; (@ + ; (at@ ; (let-lv (y) ; (== `(,b ,y ,x) `(,x (1 ,x) ,y))) ; (lambda@ (fk subst) subst) @@ -3027,9 +3035,9 @@ ; ; (test-check 'lv-elim-5-2 ; ; (concretize ; ; (let-lv (v b dummy) - ; ; (@ - ; ; (exists (x) - ; ; (exists (y) + ; ; (at@ + ; ; (_exists (x) + ; ; (_exists (y) ; ; (== `(,b ,y ,x) `(,x (1 ,x) ,y)))) ; ; (lambda@ (fk subst) subst) ; ; initial-fk @@ -3039,9 +3047,9 @@ ; ; (test-check 'lv-elim-5-3 ; ; (concretize ; ; (let-lv (v b dummy) - ; ; (@ - ; ; (exists (y) - ; ; (exists (x) + ; ; (at@ + ; ; (_exists (y) + ; ; (_exists (x) ; ; (== `(,b ,y ,x) `(,x (1 ,x) ,y)))) ; ; (lambda@ (fk subst) subst) ; ; initial-fk @@ -3051,8 +3059,8 @@ ; (test-check 'lv-elim-5-4 ; (reify ; (let-lv (v b dummy) - ; (@ - ; (exists (x y) + ; (at@ + ; (_exists (x y) ; (== `(,b ,y ,x) `(,x (1 ,x) ,y))) ; (lambda@ (fk subst) subst) ; initial-fk @@ -3094,19 +3102,19 @@ ) (cout nl "R1:" nl) - (pretty-print (solve 10 (x y) (R1 x y))) + (_pretty-print (solve 10 (x y) (R1 x y))) (cout nl "R2:" nl) - (pretty-print (solve 10 (x y) (R2 x y))) + (_pretty-print (solve 10 (x y) (R2 x y))) (cout nl "R1+R2:" nl) - (pretty-print + (_pretty-print (solve 10 (x y) ((extend-relation (a1 a2) R1 R2) x y))) (cout nl "Rinf:" nl) - (values (pretty-print (solve 5 (x y) (Rinf x y)))) + (values (_pretty-print (solve 5 (x y) (Rinf x y)))) (cout nl "Rinf+R1: Rinf starves R1:" nl) (values - (pretty-print + (_pretty-print (solve 5 (x y) ((extend-relation (a1 a2) Rinf R1) x y)))) @@ -3393,7 +3401,8 @@ ((x.0 (succ (succ (succ (succ (succ zero)))))) (y.0 zero)))) (newline) - )) + ) +10) ;; ======================================================================== ;; type-inference example @@ -3418,7 +3427,7 @@ ; ; $Id: type-inference.scm,v 4.50 2005/02/12 00:05:01 oleg Exp $ -(display "Type inference") (newline) +; (display "Type inference") (newline) ; Variation 1: use a subset of Scheme itself as the source language ; The following two functions translate between the source language @@ -3529,12 +3538,12 @@ (define env (relation (head-let g v t) - (exists (tq) + (_exists (tq) (all!! (membero `(,v . ,tq) g) (any (== tq `(non-generic ,t)) - (exists (type-gen) + (_exists (type-gen) (all!! (== tq `(generic ,type-gen)) (project (type-gen) @@ -3584,7 +3593,7 @@ (define app-rel (relation (g t rand rator) (to-show g `(app ,rator ,rand) t) - (exists (t-rand) + (_exists (t-rand) (all!! (!- g rator `(a--> ,t-rand ,t)) (!- g rand t-rand))))) (define fix-rel @@ -3606,7 +3615,7 @@ (relation (g v rand body t) (to-show g `(let ((,v ,rand)) ,body) t) (all!! - (exists (some-type) (!- g rand some-type)) + (_exists (some-type) (!- g rand some-type)) (!- `((,v generic ,(relation (head-let t-rand) (all!! (!- g rand t-rand) @@ -3819,7 +3828,9 @@ (t.0 a-->) (u.0 int) (v.0 int)))) - #t)) + #t) + +10) ;---------------------------------------------------------------------- ; A different implementation of type environments @@ -3834,7 +3845,7 @@ ; !- as the argument. Actually, they will receive the 'self'-like ; argument. We need to explicitly find the fixpoint. -(cout nl "Natural-deduction-like type inference" nl nl) +; (cout nl "Natural-deduction-like type inference" nl nl) (define pint-rel @@ -3893,7 +3904,7 @@ (let ((!- (s!- s!-))) (relation (t rand rator) (to-show `(app ,rator ,rand) t) - (exists (t-rand) + (_exists (t-rand) (all!! (!- rator `(a--> ,t-rand ,t)) (!- rand t-rand))))))) (define pfix-rel @@ -3919,7 +3930,7 @@ (relation (v rand body t) (to-show `(let ((,v ,rand)) ,body) t) (all!! - (exists (some-type) (!- rand some-type)) + (_exists (some-type) (!- rand some-type)) (let* ((snew-!- (lambda (self) (extend-relation (v t) @@ -4144,7 +4155,8 @@ (t.0 a-->) (u.0 int) (v.0 int)))) - #t)) + #t) +10) ; The code below uses the low-level function var? Every use of var? @@ -4217,15 +4229,16 @@ (equal? (solution (x) (name x '(115 108 101 101 112))) '((x.0 sleep)))) - #t)) + #t) +10) ;; ======================================================================== ;; typeclasses example ;; ======================================================================== -(newline) -(display "Checking for dependency satisfaction in Haskell typeclasses") -(newline) +;(newline) +;(display "Checking for dependency satisfaction in Haskell typeclasses") +;(newline) ; Suppose we have the following Haskell class and instance declarations ; class C a b c | a b -> c ; instance C a b c => C a (x,y,b) c @@ -4261,10 +4274,10 @@ (fails (project/no-check (c1 c2) (predicate (*equal? c1 c2))))))) ; This does loop -'(define typeclass-C - (extend-relation (a b c) - typeclass-C-instance-1 - typeclass-C-instance-2)) +;'(define typeclass-C +; (extend-relation (a b c) +; typeclass-C-instance-1 +; typeclass-C-instance-2)) (define typeclass-C/x (extend-relation-with-recur-limit 2 (a b c) @@ -4359,13 +4372,15 @@ (test-check "Typechecking (open world) f [x] int" (solve 4 (a) (typeclass-F-instance-1 `(list ,a) 'int)) '()) ; meaning: does not typecheck! + + 10 ) ;; ======================================================================== ;; zebra example ;; ======================================================================== -(display "Zebra") (newline) +; (display "Zebra") (newline) ; 1. There are five houses in a row, each of a different color ; and inhabited by men of different nationalities, @@ -4392,9 +4407,9 @@ (define memb (relation (head-let item lst) - (any (== lst `(,item . ,_)) - (exists (rest) - (if-only (== lst `(,_ . ,rest)) (memb item rest)))))) + (any (== lst `(,item . ,__)) + (_exists (rest) + (if-only (== lst `(,__ . ,rest)) (memb item rest)))))) (define next-to @@ -4403,38 +4418,38 @@ (define on-right (extend-relation (a0 a1 a2) - (fact (item1 item2) item1 item2 `(,item1 ,item2 . ,_)) + (fact (item1 item2) item1 item2 `(,item1 ,item2 . ,__)) (relation ((once item1) (once item2) rest) - (to-show item1 item2 `(,_ . ,rest)) + (to-show item1 item2 `(,__ . ,rest)) (on-right item1 item2 rest)))) (define zebra (relation (head-let h) (if-only (all! - (== h `((norwegian ,_ ,_ ,_ ,_) ,_ (,_ ,_ milk ,_ ,_) ,_ ,_)) - (memb `(englishman ,_ ,_ ,_ red) h) - (on-right `(,_ ,_ ,_ ,_ ivory) `(,_ ,_ ,_ ,_ green) h) - (next-to `(norwegian ,_ ,_ ,_ ,_) `(,_ ,_ ,_ ,_ blue) h) - (memb `(,_ kools ,_ ,_ yellow) h) - (memb `(spaniard ,_ ,_ dog ,_) h) - (memb `(,_ ,_ coffee ,_ green) h) - (memb `(ukrainian ,_ tea ,_ ,_) h) - (memb `(,_ luckystrikes oj ,_ ,_) h) - (memb `(japanese parliaments ,_ ,_ ,_) h) - (memb `(,_ oldgolds ,_ snails ,_) h) - (next-to `(,_ ,_ ,_ horse ,_) `(,_ kools ,_ ,_ ,_) h) - (next-to `(,_ ,_ ,_ fox ,_) `(,_ chesterfields ,_ ,_ ,_) h) + (== h `((norwegian ,__ ,__ ,__ ,__) ,__ (,__ ,__ milk ,__ ,__) ,__ ,__)) + (memb `(englishman ,__ ,__ ,__ red) h) + (on-right `(,__ ,__ ,__ ,__ ivory) `(,__ ,__ ,__ ,__ green) h) + (next-to `(norwegian ,__ ,__ ,__ ,__) `(,__ ,__ ,__ ,__ blue) h) + (memb `(,__ kools ,__ ,__ yellow) h) + (memb `(spaniard ,__ ,__ dog ,__) h) + (memb `(,__ ,__ coffee ,__ green) h) + (memb `(ukrainian ,__ tea ,__ ,__) h) + (memb `(,__ luckystrikes oj ,__ ,__) h) + (memb `(japanese parliaments ,__ ,__ ,__) h) + (memb `(,__ oldgolds ,__ snails ,__) h) + (next-to `(,__ ,__ ,__ horse ,__) `(,__ kools ,__ ,__ ,__) h) + (next-to `(,__ ,__ ,__ fox ,__) `(,__ chesterfields ,__ ,__ ,__) h) ) - (all (memb `(,_ ,_ water ,_ ,_) h) - (memb `(,_ ,_ ,_ zebra ,_) h))))) + (all (memb `(,__ ,__ water ,__ ,__) h) + (memb `(,__ ,__ ,__ zebra ,__) h))))) -'(pretty-print - (time (let loop ((n 100000)) - (cond - ((zero? n) 'done) - (else (solution (h) (zebra h)) - (loop (sub1 n))))))) +;'(_pretty-print +; (time (let loop ((n 100000)) +; (cond +; ((zero? n) 'done) +; (else (solution (h) (zebra h)) +; (loop (sub1 n))))))) (define (zebra-test) (test-check "Zebra" @@ -4443,7 +4458,8 @@ (ukrainian chesterfields tea horse blue) (englishman oldgolds milk snails red) (spaniard luckystrikes oj dog ivory) - (japanese parliaments coffee zebra green)))))) + (japanese parliaments coffee zebra green))))) +10) ; Sample timing (Pentium IV, 2GHz, 1GB RAM) ; (time (solution (h) ...)) @@ -4550,7 +4566,7 @@ ; we need to check if terms btree(T1) and btree(T2) are consistent. ; Thus, to add btree(root(T1,T2)) to our database, we need to use ; the database itself to verify btree(T1) and btree(T2). Clearly, -; we need a fixpoint. The need for the fixpoint exists no matter what is +; we need a fixpoint. The need for the fixpoint _exists no matter what is ; the representation of the database -- a finite map or a relation. ; Prolog solves the fixpoint problem by making the database global ; and using mutations (similar to the way letrec is implemented in Scheme). @@ -4884,7 +4900,9 @@ (let ((kb1 (goal-fwd kb))) (kb1 '(goal (root t1 t2))))) (cout (reify-subst '() subst) nl) #t) - #t)) + #t) + +10) ; Again, we use Y because btree and mirror-axiom-eq-2 are recursive. @@ -4921,7 +4939,7 @@ (kb `(myeq ,b ,a)))) (relation (a b) ; transitivity (to-show `(myeq ,a ,b)) - (exists (c) + (_exists (c) (all (kb `(myeq ,a ,c)) (kb `(myeq ,c ,b))))) @@ -4945,7 +4963,7 @@ (to-show `(myeq (mirror ,a) ,b)) (all (trace-vars 'mirror (a b)) - (exists (c) + (_exists (c) (all (kb `(myeq ,b (mirror ,c))) (kb `(myeq ,a ,c))))))))) @@ -5010,7 +5028,7 @@ (define-syntax un@ ; uncurry (syntax-rules () ((_ proc arg1 ...) - (lambda (arg1 ...) (@ proc arg1 ...))))) + (lambda (arg1 ...) (at@ proc arg1 ...))))) ; The initial assumptions: just the btrii ;(define init-kb (Y btrii)) @@ -5091,7 +5109,8 @@ ;(solve 1 (x) (kb `(myeq (root t1 t2) (mirror ,x)))) (solve 1 (x) (kb `(myeq ,x (mirror (root t1 t2))))) ))) -) + +10) ;; ======================================================================== ;; pure bin arith example @@ -5108,7 +5127,7 @@ ; aka: division as relation. ; The function divo below is a KANREN relation between four binary numerals ; n, m, q, and r such that the following holds -; exists r. 0<=r= 2 - (exists (r1 r2) - (all (== r `(,r1 ,r2)) - (half-adder carry-in 1 1 r1 r2)))) - - ; cin + 1 + (2*br + bb) = (2*rr + rb) where br > 0 and so is rr > 0 - (relation (carry-in bb br rb rr) - (to-show carry-in '(1) `(,bb . ,br) `(,rb . ,rr)) - (all - (pos br) (pos rr) - (exists (carry-out) - (all - (half-adder carry-in 1 bb rb carry-out) - (full-adder carry-out '() br rr))))) - - ; symmetric case for the above - (relation (head-let carry-in a '(1) r) - (all - (gt1 a) (gt1 r) - (full-adder carry-in '(1) a r))) - - ; carry-in + (2*ar + ab) + (2*br + bb) - ; = (carry-in + ab + bb) (mod 2) - ; + 2*(ar + br + (carry-in + ab + bb)/2) - ; The cases of ar= 0 or br = 0 have already been handled. - ; So, now we require ar >0 and br>0. That implies that rr>0. - (relation (carry-in ab ar bb br rb rr) - (to-show carry-in `(,ab . ,ar) `(,bb . ,br) `(,rb . ,rr)) - (all - (pos ar) (pos br) (pos rr) - (exists (carry-out) - (all - (half-adder carry-in ab bb rb carry-out) - (full-adder carry-out ar br rr)))) - ))) +; (define full-adder +; (extend-relation (carry-in a b r) +; (fact (a) 0 a '() a) ; 0 + a + 0 = a +; (relation (b) ; 0 + 0 + b = b +; (to-show 0 '() b b) +; (pos b)) +; (relation (head-let '1 a '() r) ; 1 + a + 0 = 0 + a + 1 +; (full-adder 0 a '(1) r)) +; (relation (head-let '1 '() b r) ; 1 + 0 + b = 0 + 1 + b +; (all (pos b) +; (full-adder 0 '(1) b r))) +; +; ; The following three relations are needed +; ; to make all numbers well-formed by construction, +; ; that is, to make sure the higher-order bit is one. +; (relation (head-let carry-in '(1) '(1) r) ; c + 1 + 1 >= 2 +; (_exists (r1 r2) +; (all (== r `(,r1 ,r2)) +; (half-adder carry-in 1 1 r1 r2)))) +; +; ; cin + 1 + (2*br + bb) = (2*rr + rb) where br > 0 and so is rr > 0 +; (relation (carry-in bb br rb rr) +; (to-show carry-in '(1) `(,bb . ,br) `(,rb . ,rr)) +; (all +; (pos br) (pos rr) +; (_exists (carry-out) +; (all +; (half-adder carry-in 1 bb rb carry-out) +; (full-adder carry-out '() br rr))))) +; +; ; symmetric case for the above +; (relation (head-let carry-in a '(1) r) +; (all +; (gt1 a) (gt1 r) +; (full-adder carry-in '(1) a r))) +; +; ; carry-in + (2*ar + ab) + (2*br + bb) +; ; = (carry-in + ab + bb) (mod 2) +; ; + 2*(ar + br + (carry-in + ab + bb)/2) +; ; The cases of ar= 0 or br = 0 have already been handled. +; ; So, now we require ar >0 and br>0. That implies that rr>0. +; (relation (carry-in ab ar bb br rb rr) +; (to-show carry-in `(,ab . ,ar) `(,bb . ,br) `(,rb . ,rr)) +; (all +; (pos ar) (pos br) (pos rr) +; (_exists (carry-out) +; (all +; (half-adder carry-in ab bb rb carry-out) +; (full-adder carry-out ar br rr)))) +; ))) ; After we have checked that both summands have some bits, and so we ; can decompose them the least-significant bit and the other ones, it appears @@ -5384,7 +5402,7 @@ ; uninstantiated variables. We don't know which are the input and which ; are the output. So, if we keep only the last relation for the ; case of positive summands, and try to -; (exists (x) (full-adder 0 (1 . ()) x (0 1 . ()))) +; (_exists (x) (full-adder 0 (1 . ()) x (0 1 . ()))) ; we will see x bound to (1 0) -- an invalid number. So, our adder, when ; asked to subtract numbers, gave a bad number. And it would give us ; a bad number in all the cases when we use it to subtract numbers and @@ -5433,9 +5451,63 @@ ; version would be minimal and without loss of speed. ; The following full-adder* is almost the same as full-adder above. -' -(define full-adder* - (extend-relation (carry-in a b r) +; +; (define full-adder* +; (extend-relation (carry-in a b r) +; ; (fact (a) 0 a '() a) ; 0 + a + 0 = a +; ; (relation (b) ; 0 + 0 + b = b +; ; (to-show 0 '() b b) +; ; (pos b)) +; ; (relation (head-let '1 a '() r) ; 1 + a + 0 = 0 + a + 1 +; ; (full-adder 0 a '(1) r)) +; ; (relation (head-let '1 '() b r) ; 1 + 0 + b = 0 + 1 + b +; ; (all (pos b) +; ; (full-adder 0 '(1) b r))) +; +; ; The following three relations are needed +; ; to make all numbers well-formed by construction, +; ; that is, to make sure the higher-order bit is one. +; (relation (head-let carry-in '(1) '(1) r) ; c + 1 + 1 >= 2 +; (_exists (r1 r2) +; (all (== r `(,r1 ,r2)) +; (half-adder carry-in 1 1 r1 r2)))) +; +; ; cin + 1 + (2*br + bb) = (2*rr + rb) where br > 0 and so is rr > 0 +; (relation (carry-in bb br rb rr) +; (to-show carry-in '(1) `(,bb . ,br) `(,rb . ,rr)) +; (all +; (pos br) (pos rr) +; (_exists (carry-out) +; (all +; (half-adder carry-in 1 bb rb carry-out) +; (full-adder carry-out '() br rr))))) +; +; ; symmetric case for the above +; (relation (head-let carry-in a '(1) r) +; (all +; (gt1 a) (gt1 r) +; (full-adder* carry-in '(1) a r))) +; +; ; carry-in + (2*ar + ab) + (2*br + bb) +; ; = (carry-in + ab + bb) (mod 2) +; ; + 2*(ar + br + (carry-in + ab + bb)/2) +; ; The cases of ar= 0 or br = 0 have already been handled. +; ; So, now we require ar >0 and br>0. That implies that rr>0. +; (relation (carry-in ab ar bb br rb rr) +; (to-show carry-in `(,ab . ,ar) `(,bb . ,br) `(,rb . ,rr)) +; (all +; (pos ar) (pos br) (pos rr) +; (_exists (carry-out) +; (all +; (half-adder carry-in ab bb rb carry-out) +; (full-adder* carry-out ar br rr)))) +; ))) + +; This driver handles the trivial cases and then invokes full-adder* +; coupled with the recursively enumerating generator. + +; (define full-adder +; (extend-relation (carry-in a b r) ; (fact (a) 0 a '() a) ; 0 + a + 0 = a ; (relation (b) ; 0 + 0 + b = b ; (to-show 0 '() b b) @@ -5445,73 +5517,18 @@ ; (relation (head-let '1 '() b r) ; 1 + 0 + b = 0 + 1 + b ; (all (pos b) ; (full-adder 0 '(1) b r))) - - ; The following three relations are needed - ; to make all numbers well-formed by construction, - ; that is, to make sure the higher-order bit is one. - (relation (head-let carry-in '(1) '(1) r) ; c + 1 + 1 >= 2 - (exists (r1 r2) - (all (== r `(,r1 ,r2)) - (half-adder carry-in 1 1 r1 r2)))) - - ; cin + 1 + (2*br + bb) = (2*rr + rb) where br > 0 and so is rr > 0 - (relation (carry-in bb br rb rr) - (to-show carry-in '(1) `(,bb . ,br) `(,rb . ,rr)) - (all - (pos br) (pos rr) - (exists (carry-out) - (all - (half-adder carry-in 1 bb rb carry-out) - (full-adder carry-out '() br rr))))) - - ; symmetric case for the above - (relation (head-let carry-in a '(1) r) - (all - (gt1 a) (gt1 r) - (full-adder* carry-in '(1) a r))) - - ; carry-in + (2*ar + ab) + (2*br + bb) - ; = (carry-in + ab + bb) (mod 2) - ; + 2*(ar + br + (carry-in + ab + bb)/2) - ; The cases of ar= 0 or br = 0 have already been handled. - ; So, now we require ar >0 and br>0. That implies that rr>0. - (relation (carry-in ab ar bb br rb rr) - (to-show carry-in `(,ab . ,ar) `(,bb . ,br) `(,rb . ,rr)) - (all - (pos ar) (pos br) (pos rr) - (exists (carry-out) - (all - (half-adder carry-in ab bb rb carry-out) - (full-adder* carry-out ar br rr)))) - ))) - -; This driver handles the trivial cases and then invokes full-adder* -; coupled with the recursively enumerating generator. - -' -(define full-adder - (extend-relation (carry-in a b r) - (fact (a) 0 a '() a) ; 0 + a + 0 = a - (relation (b) ; 0 + 0 + b = b - (to-show 0 '() b b) - (pos b)) - (relation (head-let '1 a '() r) ; 1 + a + 0 = 0 + a + 1 - (full-adder 0 a '(1) r)) - (relation (head-let '1 '() b r) ; 1 + 0 + b = 0 + 1 + b - (all (pos b) - (full-adder 0 '(1) b r))) - (relation (head-let carry-in a b r) - (any-interleave - ; Note that we take advantage of the fact that if - ; a + b = r and length(b) <= length(a) then length(a) <= length(r) - (all (
      = 2 - (exists (r1 r2) + (_exists (r1 r2) (all (== r `(,r1 ,r2)) (half-adder carry-in 1 1 r1 r2)))) @@ -5557,7 +5574,7 @@ (to-show carry-in '(1) `(,bb . ,br) `(,rb . ,rr)) (all (pos br) (pos rr) - (exists (carry-out) + (_exists (carry-out) (all-interleave (half-adder carry-in 1 bb rb carry-out) (full-adder carry-out '() br rr))))) @@ -5577,7 +5594,7 @@ (to-show carry-in `(,ab . ,ar) `(,bb . ,br) `(,rb . ,rr)) (all (pos ar) (pos br) (pos rr) - (exists (carry-out) + (_exists (carry-out) (all-interleave (half-adder carry-in ab bb rb carry-out) (full-adder carry-out ar br rr)))) @@ -5594,22 +5611,21 @@ (a++o y out x))) -' -(define 0 such that n + x = m - (relation (head-let n m) - (exists (x) (all (pos x) (a++o n x m))))) +;(define 0 such that n + x = m +; (relation (head-let n m) +; (_exists (x) (all (pos x) (a++o n x m))))) ; The following is an optimization: it is easier to test for the ; length of two numbers. If one number has fewer bits than the other number, ; the former is clearly shorter (provided that the numbers are well-formed, ; that is, the higher-order bit is one). So we don't need to go through ; the trouble of subtracting them. -(define 0 such that n + x = m +(define 0 such that n + x = m (relation (head-let n m) (any-interleave (
        0 (the case of m=0 is taken care of already) ; nr > 0, otherwise the number is ill-formed - (exists (nr pr) + (_exists (nr pr) (all (gt1 m) (== n `(0 . ,nr)) @@ -5632,9 +5648,9 @@ (**o nr m pr))) ; The symmetric case to the above: m is even, n is odd - (exists (mr pr) + (_exists (mr pr) (all - (== n `(1 ,_ . ,_)) ; n is odd and n > 1 + (== n `(1 ,__ . ,__)) ; n is odd and n > 1 (== m `(0 . ,mr)) (== p `(0 . ,pr)) (pos mr) (pos pr) @@ -5645,9 +5661,9 @@ ; the result is certainly greater than 1. ; we note that m > 0 and so 2*(nr*m) < 2*(nr*m) + m ; and (floor (log2 (nr*m))) < (floor (log2 (2*(nr*m) + m))) - (exists (nr p1) + (_exists (nr p1) (all - (== m `(1 ,_ . ,_)) ; m is odd and n > 1 + (== m `(1 ,__ . ,__)) ; m is odd and n > 1 (== n `(1 . ,nr)) (pos nr) (gt1 p) (0, so q*m <= n, - (exists (p) ; definitely q*m < 2*n - (all ( (n - r) is even and (n-r)/2 = m*q -; (exists (p m1) -; (all (== m `(0 . ,m1)) -; (== m1 `(_, . ,_)) -; (**o m1 q p) -; (a--o n r `(0 . ,p)))) - +; +; (define divo +; (relation (head-let n m q r) +; (any-interleave +; (all (== r n) (== q '()) (
          0, so q*m <= n, +; (_exists (p) ; definitely q*m < 2*n +; (all ( (n - r) is even and (n-r)/2 = m*q +; ; (_exists (p m1) +; ; (all (== m `(0 . ,m1)) +; ; (== m1 `(__, . ,__)) +; ; (**o m1 q p) +; ; (a--o n r `(0 . ,p)))) +; ; A faster and more refutationally complete divo algorithm ; Again, divo n m q r @@ -5745,7 +5761,7 @@ ; Note that m is L-instantiated here (0 ; in the rest, n is longer than b (all (== b '(0 1)) ; b = 2 - (exists (n1) + (_exists (n1) (all (pos n1) - (== n `(,_ ,_ . ,n1)) ; n is at least 4 + (== n `(,__ ,__ . ,n1)) ; n is at least 4 (exp2 n '() q) ; that will L-instantiate n and n1 - (split n n1 _ r)))) + (split n n1 __ r)))) ; the general case (all - (any (== b '(1 1)) (== b `(,_ ,_ ,_ . ,_))) ; b >= 3 + (any (== b '(1 1)) (== b `(,__ ,__ ,__ . ,__))) ; b >= 3 (
            list x))) (let ((new (map f old))) - (if (andmap eq? old new) x (list->vector new))))) + (if (andmap2 eq? old new) x (list->vector new))))) (else x)))))) (define strip @@ -3698,13 +3698,13 @@ (let f ((ls orig-ls)) (syntax-case ls () (() '()) - ((x . r) (cons #'x (f #'r))) + ((x . r) (cons (syntax x) (f (syntax r)))) (_ (error 'syntax->list "invalid argument ~s" orig-ls)))))) (set! syntax->vector (lambda (v) (syntax-case v () - (#(x ...) (apply vector (syntax->list #'(x ...)))) + (#(x ...) (apply vector (syntax->list (syntax (x ...))))) (_ (error 'syntax->vector "invalid argument ~s" v))))) (set! syntax-object->datum @@ -4029,67 +4029,67 @@ (syntax-case p (unquote quasiquote) ((unquote p) (if (= lev 0) - #'("value" p) - (quasicons #'("quote" unquote) (quasi #'(p) (- lev 1))))) - ((quasiquote p) (quasicons #'("quote" quasiquote) (quasi #'(p) (+ lev 1)))) + (syntax ("value" p)) + (quasicons (syntax ("quote" unquote)) (quasi (syntax (p)) (- lev 1))))) + ((quasiquote p) (quasicons (syntax ("quote" quasiquote)) (quasi (syntax (p)) (+ lev 1)))) ((p . q) - (syntax-case #'p (unquote unquote-splicing) + (syntax-case (syntax p) (unquote unquote-splicing) ((unquote p ...) (if (= lev 0) - (quasilist* #'(("value" p) ...) (quasi #'q lev)) + (quasilist* (syntax (("value" p) ...)) (quasi (syntax q) lev)) (quasicons - (quasicons #'("quote" unquote) (quasi #'(p ...) (- lev 1))) - (quasi #'q lev)))) + (quasicons (syntax ("quote" unquote)) (quasi (syntax (p ...)) (- lev 1))) + (quasi (syntax q) lev)))) ((unquote-splicing p ...) (if (= lev 0) - (quasiappend #'(("value" p) ...) (quasi #'q lev)) + (quasiappend (syntax (("value" p) ...)) (quasi (syntax q) lev)) (quasicons - (quasicons #'("quote" unquote-splicing) (quasi #'(p ...) (- lev 1))) - (quasi #'q lev)))) - (_ (quasicons (quasi #'p lev) (quasi #'q lev))))) - (#(x ...) (quasivector (vquasi #'(x ...) lev))) - (p #'("quote" p)))) + (quasicons (syntax ("quote" unquote-splicing)) (quasi (syntax (p ...)) (- lev 1))) + (quasi (syntax q) lev)))) + (_ (quasicons (quasi (syntax p) lev) (quasi (syntax q) lev))))) + (#(x ...) (quasivector (vquasi (syntax (x ...)) lev))) + (p (syntax ("quote" p))))) (define (vquasi p lev) (syntax-case p () ((p . q) - (syntax-case #'p (unquote unquote-splicing) + (syntax-case (syntax p) (unquote unquote-splicing) ((unquote p ...) (if (= lev 0) - (quasilist* #'(("value" p) ...) (vquasi #'q lev)) + (quasilist* (syntax (("value" p) ...)) (vquasi (syntax q) lev)) (quasicons - (quasicons #'("quote" unquote) (quasi #'(p ...) (- lev 1))) - (vquasi #'q lev)))) + (quasicons (syntax ("quote" unquote)) (quasi (syntax (p ...)) (- lev 1))) + (vquasi (syntax q) lev)))) ((unquote-splicing p ...) (if (= lev 0) - (quasiappend #'(("value" p) ...) (vquasi #'q lev)) + (quasiappend (syntax (("value" p) ...)) (vquasi (syntax q) lev)) (quasicons (quasicons - #'("quote" unquote-splicing) - (quasi #'(p ...) (- lev 1))) - (vquasi #'q lev)))) - (_ (quasicons (quasi #'p lev) (vquasi #'q lev))))) - (() #'("quote" ())))) + (syntax ("quote" unquote-splicing)) + (quasi (syntax (p ...)) (- lev 1))) + (vquasi (syntax q) lev)))) + (_ (quasicons (quasi (syntax p) lev) (vquasi (syntax q) lev))))) + (() (syntax ("quote" ()))))) (define (quasicons x y) (with-syntax ((x x) (y y)) - (syntax-case #'y () + (syntax-case (syntax y) () (("quote" dy) - (syntax-case #'x () - (("quote" dx) #'("quote" (dx . dy))) - (_ (if (null? #'dy) #'("list" x) #'("list*" x y))))) - (("list" . stuff) #'("list" x . stuff)) - (("list*" . stuff) #'("list*" x . stuff)) - (_ #'("list*" x y))))) + (syntax-case (syntax x) () + (("quote" dx) (syntax ("quote" (dx . dy)))) + (_ (if (null? (syntax dy)) (syntax ("list" x)) (syntax ("list*" x y)))))) + (("list" . stuff) (syntax ("list" x . stuff))) + (("list*" . stuff) (syntax ("list*" x . stuff))) + (_ (syntax ("list*" x y)))))) (define (quasiappend x y) (syntax-case y () (("quote" ()) (cond - ((null? x) #'("quote" ())) + ((null? x) (syntax ("quote" ()))) ((null? (cdr x)) (car x)) - (else (with-syntax (((p ...) x)) #'("append" p ...))))) + (else (with-syntax (((p ...) x)) (syntax ("append" p ...)))))) (_ (cond ((null? x) y) - (else (with-syntax (((p ...) x) (y y)) #'("append" p ... y))))))) + (else (with-syntax (((p ...) x) (y y)) (syntax ("append" p ... y)))))))) (define (quasilist* x y) (let f ((x x)) (if (null? x) @@ -4097,35 +4097,35 @@ (quasicons (car x) (f (cdr x)))))) (define (quasivector x) (syntax-case x () - (("quote" (x ...)) #'("quote" #(x ...))) + (("quote" (x ...)) (syntax ("quote" #(x ...)))) (_ - (let f ((y x) (k (lambda (ls) #`("vector" #,@ls)))) + (let f ((y x) (k (lambda (ls) (quasisyntax ("vector" (unsyntax-splicing ls)))))) (syntax-case y () - (("quote" (y ...)) (k #'(("quote" y) ...))) - (("list" y ...) (k #'(y ...))) - (("list*" y ... z) (f #'z (lambda (ls) (k (append #'(y ...) ls))))) - (else #`("list->vector" #,x))))))) + (("quote" (y ...)) (k (syntax (("quote" y) ...)))) + (("list" y ...) (k (syntax (y ...)))) + (("list*" y ... z) (f (syntax z) (lambda (ls) (k (append (syntax (y ...)) ls))))) + (else (quasisyntax ("list->vector" (unsyntax-splicing x))))))))) (define (emit x) (syntax-case x () - (("quote" x) #''x) - (("list" x ...) #`(list #,@(map emit #'(x ...)))) + (("quote" x) (syntax 'x)) + (("list" x ...) (quasisyntax (list (unsyntax-splicing (map emit (syntax (x ...))))))) ; could emit list* for 3+ arguments if implementation supports list* (("list*" x ... y) - (let f ((x* #'(x ...))) + (let f ((x* (syntax (x ...)))) (if (null? x*) - (emit #'y) - #`(cons #,(emit (car x*)) #,(f (cdr x*)))))) - (("append" x ...) #`(append #,@(map emit #'(x ...)))) - (("vector" x ...) #`(vector #,@(map emit #'(x ...)))) - (("list->vector" x) #`(list->vector #,(emit #'x))) - (("value" x) #'x))) + (emit (syntax y)) + (quasisyntax (cons (unsyntax (emit (car x*))) (unsyntax (f (cdr x*)))))))) + (("append" x ...) (quasisyntax (append (unsyntax-splicing (map emit (syntax (x ...))))))) + (("vector" x ...) (quasisyntax (vector (unsyntax-splicing (map emit (syntax (x ...))))))) + (("list->vector" x) (quasisyntax (list->vector (unsyntax (emit (syntax x)))))) + (("value" x) (syntax x)))) (lambda (x) (syntax-case x () ; convert to intermediate language, combining introduced (but not ; unquoted source) quote expressions where possible and choosing ; optimal construction code otherwise, then emit Scheme code ; corresponding to the intermediate language forms. - ((_ e) (emit (quasi #'e 0))))))) + ((_ e) (emit (quasi (syntax e) 0))))))) (define-syntax unquote (lambda (x) @@ -4140,68 +4140,68 @@ (define (qs q n b* k) (syntax-case q (quasisyntax unsyntax unsyntax-splicing) ((quasisyntax . d) - (qs #'d (+ n 1) b* + (qs (syntax d) (+ n 1) b* (lambda (b* dnew) (k b* - (if (eq? dnew #'d) + (if (eq? dnew (syntax d)) q - (with-syntax ((d dnew)) #'(quasisyntax . d))))))) + (with-syntax ((d dnew)) (syntax (quasisyntax . d)))))))) ((unsyntax . d) (not (= n 0)) - (qs #'d (- n 1) b* + (qs (syntax d) (- n 1) b* (lambda (b* dnew) (k b* - (if (eq? dnew #'d) + (if (eq? dnew (syntax d)) q - (with-syntax ((d dnew)) #'(unsyntax . d))))))) + (with-syntax ((d dnew)) (syntax (unsyntax . d)))))))) ((unsyntax-splicing . d) (not (= n 0)) - (qs #'d (- n 1) b* + (qs (syntax d) (- n 1) b* (lambda (b* dnew) (k b* - (if (eq? dnew #'d) + (if (eq? dnew (syntax d)) q - (with-syntax ((d dnew)) #'(unsyntax-splicing . d))))))) + (with-syntax ((d dnew)) (syntax (unsyntax-splicing . d)))))))) ((unsyntax q) (= n 0) - (with-syntax (((t) (generate-temporaries #'(q)))) - (k (cons #'(t q) b*) #'t))) + (with-syntax (((t) (generate-temporaries (syntax (q))))) + (k (cons (syntax (t q)) b*) (syntax t)))) (((unsyntax q ...) . d) (= n 0) - (qs #'d n b* + (qs (syntax d) n b* (lambda (b* dnew) - (with-syntax (((t ...) (generate-temporaries #'(q ...)))) - (k (append #'((t q) ...) b*) - (with-syntax ((d dnew)) #'(t ... . d))))))) + (with-syntax (((t ...) (generate-temporaries (syntax (q ...))))) + (k (append (syntax ((t q) ...)) b*) + (with-syntax ((d dnew)) (syntax (t ... . d)))))))) (((unsyntax-splicing q ...) . d) (= n 0) - (qs #'d n b* + (qs (syntax d) n b* (lambda (b* dnew) - (with-syntax (((t ...) (generate-temporaries #'(q ...)))) - (k (append #'(((t (... ...)) q) ...) b*) - (with-syntax ((((m ...) ...) #'((t (... ...)) ...))) - (with-syntax ((d dnew)) #'(m ... ... . d)))))))) + (with-syntax (((t ...) (generate-temporaries (syntax (q ...))))) + (k (append (syntax (((t (... ...)) q) ...)) b*) + (with-syntax ((((m ...) ...) (syntax ((t (... ...)) ...)))) + (with-syntax ((d dnew)) (syntax (m ... ... . d))))))))) ((a . d) - (qs #'a n b* + (qs (syntax a) n b* (lambda (b* anew) - (qs #'d n b* + (qs (syntax d) n b* (lambda (b* dnew) (k b* - (if (and (eq? anew #'a) (eq? dnew #'d)) + (if (and (eq? anew (syntax a)) (eq? dnew (syntax d))) q - (with-syntax ((a anew) (d dnew)) #'(a . d))))))))) + (with-syntax ((a anew) (d dnew)) (syntax (a . d)))))))))) (#(x ...) - (vqs #'(x ...) n b* + (vqs (syntax (x ...)) n b* (lambda (b* xnew*) (k b* - (if (let same? ((x* #'(x ...)) (xnew* xnew*)) + (if (let same? ((x* (syntax (x ...))) (xnew* xnew*)) (if (null? x*) (null? xnew*) (and (not (null? xnew*)) (eq? (car x*) (car xnew*)) (same? (cdr x*) (cdr xnew*))))) q - (with-syntax (((x ...) xnew*)) #'#(x ...))))))) + (with-syntax (((x ...) xnew*)) (syntax #(x ...)))))))) (_ (k b* q)))) (define (vqs x* n b* k) (if (null? x*) @@ -4211,26 +4211,26 @@ (syntax-case (car x*) (unsyntax unsyntax-splicing) ((unsyntax q ...) (= n 0) - (with-syntax (((t ...) (generate-temporaries #'(q ...)))) - (k (append #'((t q) ...) b*) - (append #'(t ...) xnew*)))) + (with-syntax (((t ...) (generate-temporaries (syntax (q ...))))) + (k (append (syntax ((t q) ...)) b*) + (append (syntax (t ...)) xnew*)))) ((unsyntax-splicing q ...) (= n 0) - (with-syntax (((t ...) (generate-temporaries #'(q ...)))) - (k (append #'(((t (... ...)) q) ...) b*) - (with-syntax ((((m ...) ...) #'((t (... ...)) ...))) - (append #'(m ... ...) xnew*))))) + (with-syntax (((t ...) (generate-temporaries (syntax (q ...))))) + (k (append (syntax (((t (... ...)) q) ...)) b*) + (with-syntax ((((m ...) ...) (syntax ((t (... ...)) ...)))) + (append (syntax (m ... ...)) xnew*))))) (_ (qs (car x*) n b* (lambda (b* xnew) (k b* (cons xnew xnew*)))))))))) (syntax-case x () ((_ x) - (qs #'x 0 '() + (qs (syntax x) 0 '() (lambda (b* xnew) - (if (eq? xnew #'x) - #'(syntax x) + (if (eq? xnew (syntax x)) + (syntax (syntax x)) (with-syntax (((b ...) b*) (x xnew)) - #'(with-syntax (b ...) (syntax x)))))))))) + (syntax (with-syntax (b ...) (syntax x))))))))))) (define-syntax unsyntax (lambda (x) diff --git a/collects/tests/mzscheme/benchmarks/common/psyntax.sch b/collects/tests/mzscheme/benchmarks/common/psyntax.sch index 2e1fbd43b9..016f2199d0 100644 --- a/collects/tests/mzscheme/benchmarks/common/psyntax.sch +++ b/collects/tests/mzscheme/benchmarks/common/psyntax.sch @@ -1,3 +1,5 @@ +;; smashed into benchmark form by Matthew + ;;; psyntax.pp ;;; automatically generated from psyntax.ss ;;; Mon Feb 26 23:22:05 EST 2007 @@ -8,13 +10,12 @@ ;;; Mon Feb 26 23:22:05 EST 2007 ;;; see copyright notice in psyntax.ss -(define (error . args) (+ args)) -(define (void) (if #f #t)) -(define (annotation-expression e) #f) -(define (annotation-stripped e) e) +(define (voide) (if #f #t)) +(define (sc-annotation-expression e) #f) +(define (sc-annotation-stripped e) e) (define props '()) -(define (getprop s k) +(define (sc-getprop s k) (let loop ((props props)) (if (null? props) #f @@ -26,7 +27,7 @@ (cdar vals) (loop (cdr vals))))) (loop (cdr props)))))) -(define (putprop s k v) +(define (sc-putprop s k v) (set! props (let loop ((props props)) (if (null? props) @@ -42,7 +43,7 @@ (cons (car vals) (loop (cdr vals))))))) (cdr props)) (cons (car props) (loop (cdr props)))))))) -(define (remprop s k) +(define (sc-remprop s k) (set! props (let loop ((props props)) (if (null? props) @@ -59,24 +60,29 @@ (cdr props)) (cons (car props) (loop (cdr props)))))))) (define counter 0) -(define (gensym) +(define (jensym) (set! counter (+ counter 1)) (string->symbol (string-append "!$gen$!" (number->string counter)))) -(define (gensym? s) +(define (jensym? s) (and (symbol? s) (let ((s (symbol->string s))) (char=? (string-ref s 0) #\!)))) -(define (ormap proc l) +(define (sc-ormap proc l) (if (null? l) #f (or (proc (car l)) - (ormap proc (cdr l))))) -(define (andmap proc l) + (sc-ormap proc (cdr l))))) +(define (sc-andmap proc l) (if (null? l) #t (and (proc (car l)) - (andmap proc (cdr l))))) + (sc-andmap proc (cdr l))))) +(define (sc-andmap2 proc l l2) + (if (null? l) + #t + (and (proc (car l) (car l2)) + (sc-andmap2 proc (cdr l) (cdr l2))))) (define $sc-put-cte #f) (define $syntax-dispatch #f) @@ -87,14 +93,64 @@ (define datum->syntax-object #f) (define syntax->list #f) (define syntax->vector #f) -(define identifier? #f) -(define free-identifier=? #f) -(define bound-identifier=? #f) +(define sc-identifier? #f) +(define sc-free-identifier=? #f) +(define sc-bound-identifier=? #f) (define literal-identifier=? #f) -(define generate-temporaries #f) -(define environment? #f) +(define sc-generate-temporaries #f) +(define sc-environment? #f) (define sc-interaction-environment #f) -(define syntax-error #f) +(define sc-syntax-error #f) + +(define env (scheme-report-environment 5)) + +(define (sc-eval e) + ((eval `(lambda (syntax-object->datum + datum->syntax-object + syntax->list + syntax->vector + identifier? + free-identifier=? + bound-identifier=? + literal-identifier=? + generate-temporaries + environment? + syntax-error + $sc-put-cte + $syntax-dispatch + $make-environment + sc-expand + andmap + andmap2 + ormap + gensym + gensym? + eval + interaction-environment) + ,(cadr e)) + env) + syntax-object->datum + datum->syntax-object + syntax->list + syntax->vector + sc-identifier? + sc-free-identifier=? + sc-bound-identifier=? + literal-identifier=? + sc-generate-temporaries + sc-environment? + sc-syntax-error + $sc-put-cte + $syntax-dispatch + $make-environment + sc-expand + sc-andmap + sc-andmap2 + sc-ormap + jensym + jensym? + sc-eval + sc-interaction-environment)) ((lambda () (letrec ((noexpand62 '"noexpand") @@ -140,29 +196,29 @@ (put-cte-hook137 (lambda (symbol2513 val2512) ($sc-put-cte symbol2513 val2512 '*top*))) (get-global-definition-hook138 (lambda (symbol2511) - (getprop + (sc-getprop symbol2511 '*sc-expander*))) (put-global-definition-hook139 (lambda (symbol2510 x2509) (if (not x2509) - (remprop + (sc-remprop symbol2510 '*sc-expander*) - (putprop + (sc-putprop symbol2510 '*sc-expander* x2509)))) (read-only-binding?140 (lambda (symbol2508) '#f)) (get-import-binding141 (lambda (symbol2507 token2506) - (getprop symbol2507 token2506))) + (sc-getprop symbol2507 token2506))) (update-import-binding!142 (lambda (symbol2504 token2503 p2502) ((lambda (x2505) (if (not x2505) - (remprop + (sc-remprop symbol2504 token2503) - (putprop + (sc-putprop symbol2504 token2503 x2505))) @@ -226,7 +282,7 @@ (car exps2486) (if (equal? (car exps2486) - '(void)) + '(voide)) (loop2485 (cdr exps2486)) (cons @@ -289,7 +345,7 @@ var2470 x2474) sets2471))) - (gensym)) + (jensym)) (values (cons var2470 @@ -442,7 +498,7 @@ '#f)) (id-var-name434 id2442 '(()))))) (displaced-lexical-error299 (lambda (id2440) - (syntax-error + (sc-syntax-error id2440 (if (id-var-name434 id2440 @@ -481,14 +537,14 @@ b2433 (make-transformer-binding302 ((binding-value282 b2433)))) - (void)) + (voide)) b2433)) (lookup*300 x2431 r2430))))) (make-transformer-binding302 (lambda (b2428) ((lambda (t2429) (if t2429 t2429 - (syntax-error + (sc-syntax-error b2428 '"invalid transformer"))) (sanitize-binding271 b2428)))) @@ -509,7 +565,7 @@ (symbol? ((lambda (e2422) (if (annotation?132 e2422) - (annotation-expression e2422) + (sc-annotation-expression e2422) e2422)) (syntax-object-expression65 x2421))) @@ -521,11 +577,11 @@ (symbol? ((lambda (e2420) (if (annotation?132 e2420) - (annotation-expression e2420) + (sc-annotation-expression e2420) e2420)) (syntax-object-expression65 x2419))) (if (annotation?132 x2419) - (symbol? (annotation-expression x2419)) + (symbol? (sc-annotation-expression x2419)) '#f))))) (id-marks312 (lambda (id2418) (if (syntax-object?64 id2418) @@ -542,7 +598,7 @@ (values ((lambda (e2415) (if (annotation?132 e2415) - (annotation-expression + (sc-annotation-expression e2415) e2415)) (syntax-object-expression65 @@ -555,7 +611,7 @@ (values ((lambda (e2416) (if (annotation?132 e2416) - (annotation-expression + (sc-annotation-expression e2416) e2416)) x2414) @@ -703,7 +759,7 @@ (cons ((lambda (e2359) (if (annotation?132 e2359) - (annotation-expression + (sc-annotation-expression e2359) e2359)) (syntax-object-expression65 @@ -731,7 +787,7 @@ ((lambda (e2355) (if (annotation?132 e2355) - (annotation-expression + (sc-annotation-expression e2355) e2355)) (syntax-object-expression65 @@ -880,12 +936,12 @@ marks2326 old-binding2327))))) (id-marks312 id2324)) - (void))) + (voide))) ((lambda (x2329) ((lambda (e2330) (if (annotation?132 e2330) - (annotation-expression + (sc-annotation-expression e2330) e2330)) (if (syntax-object?64 @@ -901,7 +957,7 @@ ((lambda (e2332) (if (annotation?132 e2332) - (annotation-expression + (sc-annotation-expression e2332) e2332)) (if (syntax-object?64 @@ -951,7 +1007,7 @@ (cdr ids2316) (+ i2315 '1))))) - (void))))) + (voide))))) f2314) ids2309 '0) @@ -983,15 +1039,15 @@ (lambda (tosym2301 marks2300) (begin (if (not tosym2301) - (syntax-error + (sc-syntax-error id2299 '"identifier not visible for export") - (void)) + (voide)) (make-resolved-id418 ((lambda (x2302) ((lambda (e2303) (if (annotation?132 e2303) - (annotation-expression + (sc-annotation-expression e2303) e2303)) (if (syntax-object?64 x2302) @@ -1305,7 +1361,7 @@ ((lambda (e2250) (if (annotation?132 e2250) - (annotation-expression + (sc-annotation-expression e2250) e2250)) (if (syntax-object?64 @@ -1422,7 +1478,7 @@ ((lambda (e2217) (if (annotation?132 e2217) - (annotation-expression + (sc-annotation-expression e2217) e2217)) (syntax-object-expression65 @@ -1435,7 +1491,7 @@ ((lambda (e2218) (if (annotation?132 e2218) - (annotation-expression + (sc-annotation-expression e2218) e2218)) id2209) @@ -1481,7 +1537,7 @@ (if (eq? ((lambda (x2194) ((lambda (e2195) (if (annotation?132 e2195) - (annotation-expression + (sc-annotation-expression e2195) e2195)) (if (syntax-object?64 x2194) @@ -1492,7 +1548,7 @@ ((lambda (x2192) ((lambda (e2193) (if (annotation?132 e2193) - (annotation-expression + (sc-annotation-expression e2193) e2193)) (if (syntax-object?64 x2192) @@ -1507,7 +1563,7 @@ (if (eq? ((lambda (x2183) ((lambda (e2184) (if (annotation?132 e2184) - (annotation-expression + (sc-annotation-expression e2184) e2184)) (if (syntax-object?64 x2183) @@ -1518,7 +1574,7 @@ ((lambda (x2181) ((lambda (e2182) (if (annotation?132 e2182) - (annotation-expression + (sc-annotation-expression e2182) e2182)) (if (syntax-object?64 x2181) @@ -1559,7 +1615,7 @@ ((lambda (x2173) ((lambda (e2174) (if (annotation?132 e2174) - (annotation-expression e2174) + (sc-annotation-expression e2174) e2174)) (if (syntax-object?64 x2173) (syntax-object-expression65 x2173) @@ -1569,7 +1625,7 @@ ((lambda (x2171) ((lambda (e2172) (if (annotation?132 e2172) - (annotation-expression e2172) + (sc-annotation-expression e2172) e2172)) (if (syntax-object?64 x2171) (syntax-object-expression65 x2171) @@ -1612,14 +1668,14 @@ gooduns2159) (if (null? ids2160) - (syntax-error + (sc-syntax-error exp2156) (if (id?306 (car ids2160)) (if (bound-id-member?442 (car ids2160) gooduns2159) - (syntax-error + (sc-syntax-error (car ids2160) '"duplicate " class2155) @@ -1628,7 +1684,7 @@ (cons (car ids2160) gooduns2159))) - (syntax-error + (sc-syntax-error (car ids2160) '"invalid " class2155)))))) @@ -1665,12 +1721,12 @@ (wrap443 (if (annotation?132 ae2147) (begin - (if (not (eq? (annotation-expression + (if (not (eq? (sc-annotation-expression ae2147) x2149)) (error 'sc-expand '"internal error in source-wrap: ae/x mismatch") - (void)) + (voide)) ae2147) x2149) w2148))) @@ -1696,7 +1752,7 @@ x2146 '#(syntax-object eval ((top) #(ribcage () () ()) #(ribcage #(x) #((top)) #("i")) #(ribcage () () ()) #(ribcage #(when-list w) #((top) (top)) #("i" "i")) #(ribcage (lambda-var-list gen-var strip strip* strip-annotation ellipsis? chi-void chi-local-syntax chi-lambda-clause parse-begin parse-alias parse-eval-when parse-meta parse-define-syntax parse-define parse-import parse-module do-import! lookup-import-label import-mark-delta chi-internal chi-body chi-macro chi-set! chi-application chi-expr chi chi-sequence chi-meta-frob chi-frobs ct-eval/residualize3 ct-eval/residualize2 rt-eval/residualize initial-mode-set update-mode-set do-top-import vfor-each vmap chi-external check-defined-ids check-module-exports id-set-diff chi-top-module set-frob-meta?! set-frob-e! frob-meta? frob-e frob? make-frob create-module-binding set-module-binding-exported! set-module-binding-val! set-module-binding-imps! set-module-binding-label! set-module-binding-id! set-module-binding-type! module-binding-exported module-binding-val module-binding-imps module-binding-label module-binding-id module-binding-type module-binding? make-module-binding make-resolved-interface make-unresolved-interface set-interface-token! set-interface-exports! set-interface-marks! interface-token interface-exports interface-marks interface? make-interface flatten-exports chi-top chi-top-sequence chi-top* syntax-type chi-when-list source-wrap wrap bound-id-member? invalid-ids-error distinct-bound-ids? valid-bound-ids? bound-id=? help-bound-id=? literal-id=? free-id=? id-var-name id-var-name-loc id-var-name&marks id-var-name-loc&marks top-id-free-var-name top-id-bound-var-name anon diff-marks same-marks? join-subst join-marks join-wraps smart-append resolved-id-var-name id->resolved-id make-resolved-id make-binding-wrap store-import-binding lookup-import-binding-name extend-ribcage-subst! extend-ribcage-barrier-help! extend-ribcage-barrier! import-extend-ribcage! extend-ribcage! make-empty-ribcage barrier-marker new-mark anti-mark the-anti-mark set-env-wrap! set-env-top-ribcage! env-wrap env-top-ribcage env? make-env set-import-interface-new-marks! set-import-interface-interface! import-interface-new-marks import-interface-interface import-interface? make-import-interface set-top-ribcage-mutable?! set-top-ribcage-key! top-ribcage-mutable? top-ribcage-key top-ribcage? make-top-ribcage set-ribcage-labels! set-ribcage-marks! set-ribcage-symnames! ribcage-labels ribcage-marks ribcage-symnames ribcage? make-ribcage gen-labels label? gen-label set-indirect-label! get-indirect-label indirect-label? gen-indirect-label anon only-top-marked? top-marked? tmp-wrap top-wrap empty-wrap wrap-subst wrap-marks make-wrap id-sym-name&marks id-subst id-marks id-sym-name id? nonsymbol-id? global-extend defer-or-eval-transformer make-transformer-binding lookup lookup* displaced-lexical-error displaced-lexical? extend-var-env* extend-env* extend-env null-env binding? set-binding-value! set-binding-type! binding-value binding-type make-binding sanitize-binding arg-check no-source unannotate self-evaluating? lexical-var? build-lexical-var build-top-module build-body build-letrec build-sequence build-data build-primref built-lambda? build-lambda build-revisit-only build-visit-only build-cte-install build-global-definition build-global-assignment build-global-reference build-lexical-assignment build-lexical-reference build-conditional build-application generate-id update-import-binding! get-import-binding read-only-binding? put-global-definition-hook get-global-definition-hook put-cte-hook error-hook define-top-level-value-hook local-eval-hook top-level-eval-hook annotation? fx>= fx<= fx> fx< fx= fx- fx+ set-syntax-object-wrap! set-syntax-object-expression! syntax-object-wrap syntax-object-expression syntax-object? make-syntax-object noexpand let-values define-structure unless when) ((top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) ("m" top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) ("m" top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top)) ("i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i")) #(top-ribcage *top* #t)))) 'eval - (syntax-error + (sc-syntax-error (wrap443 x2146 w2144) @@ -1892,7 +1948,7 @@ '#f rib2125) (if (annotation?132 e2129) (syntax-type446 - (annotation-expression + (sc-annotation-expression e2129) r2128 w2127 e2129 rib2125) (if ((lambda (x2139) @@ -2062,16 +2118,16 @@ r2046) (displaced-lexical-error299 id2067) - (void)) + (voide)) (if (not (top-ribcage-mutable?376 top-ribcage2041)) - (syntax-error + (sc-syntax-error (source-wrap444 e2050 w2064 ae2048) '"invalid definition in read-only environment") - (void)) + (voide)) ((lambda (sym2068) (call-with-values (lambda () @@ -2088,22 +2144,22 @@ id2067 '(())) valsym2070)) - (syntax-error + (sc-syntax-error (source-wrap444 e2050 w2064 ae2048) '"definition not permitted") - (void)) + (voide)) (if (read-only-binding?140 valsym2070) - (syntax-error + (sc-syntax-error (source-wrap444 e2050 w2064 ae2048) '"invalid definition of read-only identifier") - (void)) + (voide)) (ct-eval/residualize2493 ctem2044 (lambda () @@ -2126,7 +2182,7 @@ ((lambda (e2072) (if (annotation?132 e2072) - (annotation-expression + (sc-annotation-expression e2072) e2072)) (if (syntax-object?64 @@ -2157,16 +2213,16 @@ r2046) (displaced-lexical-error299 id2076) - (void)) + (voide)) (if (not (top-ribcage-mutable?376 top-ribcage2041)) - (syntax-error + (sc-syntax-error (source-wrap444 e2050 w2073 ae2048) '"invalid definition in read-only environment") - (void)) + (voide)) ((lambda (sym2077) (call-with-values (lambda () @@ -2183,22 +2239,22 @@ id2076 '(())) valsym2079)) - (syntax-error + (sc-syntax-error (source-wrap444 e2050 w2073 ae2048) '"definition not permitted") - (void)) + (voide)) (if (read-only-binding?140 valsym2079) - (syntax-error + (sc-syntax-error (source-wrap444 e2050 w2073 ae2048) '"invalid definition of read-only identifier") - (void)) + (voide)) (if meta?2042 (ct-eval/residualize2493 ctem2044 @@ -2267,7 +2323,7 @@ ((lambda (e2082) (if (annotation?132 e2082) - (annotation-expression + (sc-annotation-expression e2082) e2082)) (if (syntax-object?64 @@ -2308,13 +2364,13 @@ (wrap443 id2086 w2049)) - (void)) + (voide)) (if (not (top-ribcage-mutable?376 top-ribcage2041)) - (syntax-error + (sc-syntax-error orig2087 '"invalid definition in read-only environment") - (void)) + (voide)) (chi-top-module482 orig2087 r2046 @@ -2347,10 +2403,10 @@ (begin (if (not (top-ribcage-mutable?376 top-ribcage2041)) - (syntax-error + (sc-syntax-error orig2090 '"invalid definition in read-only environment") - (void)) + (voide)) (ct-eval/residualize2493 ctem2044 (lambda () @@ -2371,7 +2427,7 @@ '(displaced-lexical)) (displaced-lexical-error299 mid2088) - (syntax-error + (sc-syntax-error mid2088 '"unknown module")))) (binding-type281 @@ -2399,16 +2455,16 @@ r2046) (displaced-lexical-error299 new-id2095) - (void)) + (voide)) (if (not (top-ribcage-mutable?376 top-ribcage2041)) - (syntax-error + (sc-syntax-error (source-wrap444 e2050 w2049 ae2048) '"invalid definition in read-only environment") - (void)) + (voide)) ((lambda (sym2096) (call-with-values (lambda () @@ -2425,22 +2481,22 @@ new-id2095 '(())) valsym2098)) - (syntax-error + (sc-syntax-error (source-wrap444 e2050 w2049 ae2048) '"definition not permitted") - (void)) + (voide)) (if (read-only-binding?140 valsym2098) - (syntax-error + (sc-syntax-error (source-wrap444 e2050 w2049 ae2048) '"invalid definition of read-only identifier") - (void)) + (voide)) (ct-eval/residualize2493 ctem2044 (lambda () @@ -2469,7 +2525,7 @@ ((lambda (e2100) (if (annotation?132 e2100) - (annotation-expression + (sc-annotation-expression e2100) e2100)) (if (syntax-object?64 @@ -2483,13 +2539,13 @@ w2049)))) (begin (if meta-seen?2039 - (syntax-error + (sc-syntax-error (source-wrap444 e2050 w2049 ae2048) '"invalid meta definition") - (void)) + (voide)) (if meta?2042 ((lambda (x2101) (begin @@ -2497,7 +2553,7 @@ x2101) (ct-eval/residualize3494 ctem2044 - void + voide (lambda () x2101)))) (chi-expr499 @@ -2725,16 +2781,16 @@ id1909 '(())) valsym1938)) - (syntax-error + (sc-syntax-error orig1917 '"definition not permitted") - (void)) + (voide)) (if (read-only-binding?140 valsym1938) - (syntax-error + (sc-syntax-error orig1917 '"invalid definition of read-only identifier") - (void)) + (voide)) (list '$sc-put-cte (list @@ -2759,7 +2815,7 @@ ((lambda (e1940) (if (annotation?132 e1940) - (annotation-expression + (sc-annotation-expression e1940) e1940)) (if (syntax-object?64 @@ -2918,7 +2974,7 @@ ((lambda (e1961) (if (annotation?132 e1961) - (annotation-expression + (sc-annotation-expression e1961) e1961)) (if (syntax-object?64 @@ -3002,7 +3058,7 @@ ((lambda (e1967) (if (annotation?132 e1967) - (annotation-expression + (sc-annotation-expression e1967) e1967)) (if (syntax-object?64 @@ -3060,7 +3116,7 @@ ((lambda (e1973) (if (annotation?132 e1973) - (annotation-expression + (sc-annotation-expression e1973) e1973)) (if (syntax-object?64 @@ -3084,12 +3140,12 @@ (if (not (symbol? (get-indirect-label360 label1955))) - (syntax-error + (sc-syntax-error (module-binding-id464 b1953) '"unexported target of alias") - (void)) - (void)) + (voide)) + (voide)) rest1974)) (ctdefs1924)))) (error 'sc-expand-internal @@ -3135,7 +3191,7 @@ fexports1878 ids1877) (letrec ((defined?1880 (lambda (e1887 ids1886) - (ormap + (sc-ormap (lambda (x1888) (if (import-interface?380 x1888) @@ -3149,7 +3205,7 @@ ((lambda (e1894) (if (annotation?132 e1894) - (annotation-expression + (sc-annotation-expression e1894) e1894)) (if (syntax-object?64 @@ -3179,7 +3235,7 @@ ((lambda (e1903) (if (annotation?132 e1903) - (annotation-expression + (sc-annotation-expression e1903) e1903)) (if (syntax-object?64 @@ -3196,7 +3252,7 @@ ((lambda (e1901) (if (annotation?132 e1901) - (annotation-expression + (sc-annotation-expression e1901) e1901)) (if (syntax-object?64 @@ -3233,14 +3289,14 @@ fexports1883) (if (not (null? missing1882)) - (syntax-error + (sc-syntax-error (car missing1882) (if (= (length missing1882) '1) '"missing definition for export" '"missing definition for multiple exports, including")) - (void)) + (voide)) ((lambda (e1885 fexports1884) (if (defined?1880 @@ -3400,7 +3456,7 @@ ((lambda (e1852) (if (annotation?132 e1852) - (annotation-expression + (sc-annotation-expression e1852) e1852)) (if (syntax-object?64 @@ -3420,7 +3476,7 @@ ((lambda (e1854) (if (annotation?132 e1854) - (annotation-expression + (sc-annotation-expression e1854) e1854)) (if (syntax-object?64 @@ -3442,7 +3498,7 @@ (if (not (null? cls1831)) ((lambda (cls1834) - (syntax-error + (sc-syntax-error source-exp1826 '"duplicate definition for " (symbol->string @@ -3450,7 +3506,7 @@ '" in")) (syntax-object->datum cls1831)) - (void)) + (voide)) ((letrec ((lp21835 (lambda (ls21837 cls1836) (if (null? @@ -3472,7 +3528,7 @@ (car ls1825) (cdr ls1825) '()) - (void))))) + (voide))))) (chi-external486 (lambda (ribcage1721 source-exp1720 body1719 r1718 mr1717 ctem1716 exports1715 fexports1714 @@ -3610,7 +3666,7 @@ (meta-residualize!1713 (ct-eval/residualize3494 ctem1716 - void + voide (lambda () (list 'define @@ -3652,7 +3708,7 @@ ((lambda (e1753) (if (annotation?132 e1753) - (annotation-expression + (sc-annotation-expression e1753) e1753)) (if (syntax-object?64 @@ -3881,7 +3937,7 @@ (extend-ribcage-barrier!412 ribcage1721 mid1781) - (void)) + (voide)) (do-import!507 import-iface1788 ribcage1721) @@ -3911,7 +3967,7 @@ '(displaced-lexical)) (displaced-lexical-error299 mid1781) - (syntax-error + (sc-syntax-error mid1781 '"unknown module")))) (binding-type281 @@ -4091,13 +4147,13 @@ '#f))) (begin (if meta-seen?1726 - (syntax-error + (sc-syntax-error (source-wrap444 e1738 w1737 ae1736) '"invalid meta definition") - (void)) + (voide)) ((letrec ((f1807 (lambda (body1808) (if ((lambda (t1809) (if t1809 @@ -4122,7 +4178,7 @@ (meta-residualize!1713 (ct-eval/residualize3494 ctem1716 - void + voide (lambda () x1810))))) (chi-meta-frob496 @@ -4174,7 +4230,7 @@ i1707)) (do1706 (+ i1707 '1))) - (void))))) + (voide))))) do1706) '0)) (vector-length v1703)))) @@ -4305,7 +4361,7 @@ (if (not t1677) (set! t1677 (thunk1675)) - (void)) + (voide)) (top-level-eval-hook133 t1677))) (lambda () @@ -4324,7 +4380,7 @@ (begin (if (memq 'c ctem1672) (eval-thunk1671) - (void)) + (voide)) (if (memq 'r ctem1672) (if ((lambda (t1673) (if t1673 @@ -4487,7 +4543,7 @@ (if (memv t1629 '(meta-form)) - (syntax-error + (sc-syntax-error (source-wrap444 e1626 w1623 @@ -4501,7 +4557,7 @@ e1626 w1623 ae1622) - (syntax-error + (sc-syntax-error (source-wrap444 e1626 w1623 @@ -4515,7 +4571,7 @@ e1626 w1623 ae1622) - (syntax-error + (sc-syntax-error (source-wrap444 e1626 w1623 @@ -4535,7 +4591,7 @@ id1639 exports1638 forms1637) - (syntax-error + (sc-syntax-error orig1640 '"invalid context for definition"))) (if (memv @@ -4550,7 +4606,7 @@ (lambda (orig1643 only?1642 mid1641) - (syntax-error + (sc-syntax-error orig1643 '"invalid context for definition"))) (if (memv @@ -4561,7 +4617,7 @@ e1626 w1623 ae1622) - (syntax-error + (sc-syntax-error (source-wrap444 e1626 w1623 @@ -4570,7 +4626,7 @@ (if (memv t1629 '(syntax)) - (syntax-error + (sc-syntax-error (source-wrap444 e1626 w1623 @@ -4584,7 +4640,7 @@ e1626 w1623 ae1622)) - (syntax-error + (sc-syntax-error (source-wrap444 e1626 w1623 @@ -4606,7 +4662,7 @@ e11616))) tmp1615) ((lambda (_1620) - (syntax-error + (sc-syntax-error (source-wrap444 e1612 w1609 @@ -4679,13 +4735,13 @@ (begin (if (read-only-binding?140 n1601) - (syntax-error + (sc-syntax-error (source-wrap444 e1600 w1597 ae1596) '"invalid assignment to read-only variable") - (void)) + (voide)) (list 'set! sym1605 @@ -4712,7 +4768,7 @@ (wrap443 id1588 w1597)) - (syntax-error + (sc-syntax-error (source-wrap444 e1600 w1597 @@ -4735,7 +4791,7 @@ (id-var-name434 id1588 w1579))) tmp1583) ((lambda (_1606) - (syntax-error + (sc-syntax-error (source-wrap444 e1581 w1579 @@ -4820,7 +4876,7 @@ x1569)) (if (symbol? x1569) - (syntax-error + (sc-syntax-error (source-wrap444 e1563 w1561 @@ -4836,11 +4892,11 @@ (out1566 (lambda (id1567) (begin - (if (not (identifier? id1567)) - (syntax-error + (if (not (sc-identifier? id1567)) + (sc-syntax-error id1567 '"environment argument is not an identifier") - (void)) + (voide)) (lookup301 (id-var-name434 id1567 @@ -4869,10 +4925,10 @@ inits1551) (begin (if (null? exprs1555) - (syntax-error + (sc-syntax-error outer-form1546 '"no expressions in body") - (void)) + (voide)) (build-body237 '#f (reverse vars1553) @@ -5006,7 +5062,7 @@ ((lambda (e1479) (if (annotation?132 e1479) - (annotation-expression + (sc-annotation-expression e1479) e1479)) (if (syntax-object?64 @@ -5228,7 +5284,7 @@ (extend-ribcage-barrier!412 ribcage1451 mid1508) - (void)) + (voide)) (do-import!507 import-iface1515 ribcage1451) @@ -5255,7 +5311,7 @@ '(displaced-lexical)) (displaced-lexical-error299 mid1508) - (syntax-error + (sc-syntax-error mid1508 '"unknown module")))) (binding-type281 @@ -5427,13 +5483,13 @@ '#f))) (begin (if meta-seen?1454 - (syntax-error + (sc-syntax-error (source-wrap444 e1467 w1466 ae1465) '"invalid meta definition") - (void)) + (voide)) ((letrec ((f1532 (lambda (body1533) (if ((lambda (t1534) (if t1534 @@ -5482,10 +5538,10 @@ ((lambda (label1443) (begin (if (not label1443) - (syntax-error + (sc-syntax-error id1442 '"exported identifier not visible") - (void)) + (voide)) label1443)) (id-var-name-loc433 id1442 @@ -5531,7 +5587,7 @@ (wrap443 x1436 *w1410) - (syntax-error + (sc-syntax-error (source-wrap444 e1413 w1412 @@ -5569,7 +5625,7 @@ form1422))) tmp1416) ((lambda (_1430) - (syntax-error + (sc-syntax-error (source-wrap444 e1413 w1412 @@ -5617,7 +5673,7 @@ w1392))) tmp1402) ((lambda (_1409) - (syntax-error + (sc-syntax-error (source-wrap444 e1393 w1392 @@ -5698,11 +5754,11 @@ (wrap443 name1388 w1363) - '#(syntax-object (void) ((top) #(ribcage #(_ name) #((top) (top)) #("i" "i")) #(ribcage () () ()) #(ribcage #(e w ae) #((top) (top) (top)) #("i" "i" "i")) #(ribcage (lambda-var-list gen-var strip strip* strip-annotation ellipsis? chi-void chi-local-syntax chi-lambda-clause parse-begin parse-alias parse-eval-when parse-meta parse-define-syntax parse-define parse-import parse-module do-import! lookup-import-label import-mark-delta chi-internal chi-body chi-macro chi-set! chi-application chi-expr chi chi-sequence chi-meta-frob chi-frobs ct-eval/residualize3 ct-eval/residualize2 rt-eval/residualize initial-mode-set update-mode-set do-top-import vfor-each vmap chi-external check-defined-ids check-module-exports id-set-diff chi-top-module set-frob-meta?! set-frob-e! frob-meta? frob-e frob? make-frob create-module-binding set-module-binding-exported! set-module-binding-val! set-module-binding-imps! set-module-binding-label! set-module-binding-id! set-module-binding-type! module-binding-exported module-binding-val module-binding-imps module-binding-label module-binding-id module-binding-type module-binding? make-module-binding make-resolved-interface make-unresolved-interface set-interface-token! set-interface-exports! set-interface-marks! interface-token interface-exports interface-marks interface? make-interface flatten-exports chi-top chi-top-sequence chi-top* syntax-type chi-when-list source-wrap wrap bound-id-member? invalid-ids-error distinct-bound-ids? valid-bound-ids? bound-id=? help-bound-id=? literal-id=? free-id=? id-var-name id-var-name-loc id-var-name&marks id-var-name-loc&marks top-id-free-var-name top-id-bound-var-name anon diff-marks same-marks? join-subst join-marks join-wraps smart-append resolved-id-var-name id->resolved-id make-resolved-id make-binding-wrap store-import-binding lookup-import-binding-name extend-ribcage-subst! extend-ribcage-barrier-help! extend-ribcage-barrier! import-extend-ribcage! extend-ribcage! make-empty-ribcage barrier-marker new-mark anti-mark the-anti-mark set-env-wrap! set-env-top-ribcage! env-wrap env-top-ribcage env? make-env set-import-interface-new-marks! set-import-interface-interface! import-interface-new-marks import-interface-interface import-interface? make-import-interface set-top-ribcage-mutable?! set-top-ribcage-key! top-ribcage-mutable? top-ribcage-key top-ribcage? make-top-ribcage set-ribcage-labels! set-ribcage-marks! set-ribcage-symnames! ribcage-labels ribcage-marks ribcage-symnames ribcage? make-ribcage gen-labels label? gen-label set-indirect-label! get-indirect-label indirect-label? gen-indirect-label anon only-top-marked? top-marked? tmp-wrap top-wrap empty-wrap wrap-subst wrap-marks make-wrap id-sym-name&marks id-subst id-marks id-sym-name id? nonsymbol-id? global-extend defer-or-eval-transformer make-transformer-binding lookup lookup* displaced-lexical-error displaced-lexical? extend-var-env* extend-env* extend-env null-env binding? set-binding-value! set-binding-type! binding-value binding-type make-binding sanitize-binding arg-check no-source unannotate self-evaluating? lexical-var? build-lexical-var build-top-module build-body build-letrec build-sequence build-data build-primref built-lambda? build-lambda build-revisit-only build-visit-only build-cte-install build-global-definition build-global-assignment build-global-reference build-lexical-assignment build-lexical-reference build-conditional build-application generate-id update-import-binding! get-import-binding read-only-binding? put-global-definition-hook get-global-definition-hook put-cte-hook error-hook define-top-level-value-hook local-eval-hook top-level-eval-hook annotation? fx>= fx<= fx> fx< fx= fx- fx+ set-syntax-object-wrap! set-syntax-object-expression! syntax-object-wrap syntax-object-expression syntax-object? make-syntax-object noexpand let-values define-structure unless when) ((top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) ("m" top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) ("m" top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top)) ("i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i")) #(top-ribcage *top* #t))) + '#(syntax-object (voide) ((top) #(ribcage #(_ name) #((top) (top)) #("i" "i")) #(ribcage () () ()) #(ribcage #(e w ae) #((top) (top) (top)) #("i" "i" "i")) #(ribcage (lambda-var-list gen-var strip strip* strip-annotation ellipsis? chi-void chi-local-syntax chi-lambda-clause parse-begin parse-alias parse-eval-when parse-meta parse-define-syntax parse-define parse-import parse-module do-import! lookup-import-label import-mark-delta chi-internal chi-body chi-macro chi-set! chi-application chi-expr chi chi-sequence chi-meta-frob chi-frobs ct-eval/residualize3 ct-eval/residualize2 rt-eval/residualize initial-mode-set update-mode-set do-top-import vfor-each vmap chi-external check-defined-ids check-module-exports id-set-diff chi-top-module set-frob-meta?! set-frob-e! frob-meta? frob-e frob? make-frob create-module-binding set-module-binding-exported! set-module-binding-val! set-module-binding-imps! set-module-binding-label! set-module-binding-id! set-module-binding-type! module-binding-exported module-binding-val module-binding-imps module-binding-label module-binding-id module-binding-type module-binding? make-module-binding make-resolved-interface make-unresolved-interface set-interface-token! set-interface-exports! set-interface-marks! interface-token interface-exports interface-marks interface? make-interface flatten-exports chi-top chi-top-sequence chi-top* syntax-type chi-when-list source-wrap wrap bound-id-member? invalid-ids-error distinct-bound-ids? valid-bound-ids? bound-id=? help-bound-id=? literal-id=? free-id=? id-var-name id-var-name-loc id-var-name&marks id-var-name-loc&marks top-id-free-var-name top-id-bound-var-name anon diff-marks same-marks? join-subst join-marks join-wraps smart-append resolved-id-var-name id->resolved-id make-resolved-id make-binding-wrap store-import-binding lookup-import-binding-name extend-ribcage-subst! extend-ribcage-barrier-help! extend-ribcage-barrier! import-extend-ribcage! extend-ribcage! make-empty-ribcage barrier-marker new-mark anti-mark the-anti-mark set-env-wrap! set-env-top-ribcage! env-wrap env-top-ribcage env? make-env set-import-interface-new-marks! set-import-interface-interface! import-interface-new-marks import-interface-interface import-interface? make-import-interface set-top-ribcage-mutable?! set-top-ribcage-key! top-ribcage-mutable? top-ribcage-key top-ribcage? make-top-ribcage set-ribcage-labels! set-ribcage-marks! set-ribcage-symnames! ribcage-labels ribcage-marks ribcage-symnames ribcage? make-ribcage gen-labels label? gen-label set-indirect-label! get-indirect-label indirect-label? gen-indirect-label anon only-top-marked? top-marked? tmp-wrap top-wrap empty-wrap wrap-subst wrap-marks make-wrap id-sym-name&marks id-subst id-marks id-sym-name id? nonsymbol-id? global-extend defer-or-eval-transformer make-transformer-binding lookup lookup* displaced-lexical-error displaced-lexical? extend-var-env* extend-env* extend-env null-env binding? set-binding-value! set-binding-type! binding-value binding-type make-binding sanitize-binding arg-check no-source unannotate self-evaluating? lexical-var? build-lexical-var build-top-module build-body build-letrec build-sequence build-data build-primref built-lambda? build-lambda build-revisit-only build-visit-only build-cte-install build-global-definition build-global-assignment build-global-reference build-lexical-assignment build-lexical-reference build-conditional build-application generate-id update-import-binding! get-import-binding read-only-binding? put-global-definition-hook get-global-definition-hook put-cte-hook error-hook define-top-level-value-hook local-eval-hook top-level-eval-hook annotation? fx>= fx<= fx> fx< fx= fx- fx+ set-syntax-object-wrap! set-syntax-object-expression! syntax-object-wrap syntax-object-expression syntax-object? make-syntax-object noexpand let-values define-structure unless when) ((top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) ("m" top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) ("m" top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top)) ("i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i")) #(top-ribcage *top* #t))) '(()))) tmp1385) ((lambda (_1390) - (syntax-error + (sc-syntax-error (source-wrap444 e1364 w1363 @@ -5778,7 +5834,7 @@ w1339)) tmp1354) ((lambda (_1361) - (syntax-error + (sc-syntax-error (source-wrap444 e1340 w1339 @@ -5802,7 +5858,7 @@ (lambda (_1336 form1335) form1335) tmp1334) ((lambda (_1337) - (syntax-error + (sc-syntax-error (source-wrap444 e1332 w1331 @@ -5824,7 +5880,7 @@ (cons e11324 e21323))) tmp1322) ((lambda (_1329) - (syntax-error + (sc-syntax-error (source-wrap444 e1320 w1319 @@ -5852,7 +5908,7 @@ (values new-id1315 old-id1314)) tmp1310) ((lambda (_1317) - (syntax-error + (sc-syntax-error (source-wrap444 e1308 w1307 @@ -5882,7 +5938,7 @@ (cons e11302 e21301)) tmp1300) ((lambda (_1305) - (syntax-error + (sc-syntax-error (source-wrap444 e1295 w1294 @@ -5904,7 +5960,7 @@ ((lambda (ids1275) (if (not (valid-bound-ids?439 ids1275)) - (syntax-error + (sc-syntax-error e1269 '"invalid parameter list in") ((lambda (labels1277 @@ -5941,7 +5997,7 @@ ((lambda (old-ids1284) (if (not (valid-bound-ids?439 old-ids1284)) - (syntax-error + (sc-syntax-error e1269 '"invalid parameter list in") ((lambda (labels1286 @@ -5983,7 +6039,7 @@ ids1283))) tmp1280) ((lambda (_1291) - (syntax-error + (sc-syntax-error e1269)) tmp1270))) ($syntax-dispatch @@ -6056,7 +6112,7 @@ id1251)) tmp1247) ((lambda (_1263) - (syntax-error + (sc-syntax-error (source-wrap444 e1244 w1241 @@ -6069,7 +6125,7 @@ . each-any)))) e1244))) - (chi-void518 (lambda () (cons 'void '()))) + (chi-void518 (lambda () (cons 'voide '()))) (ellipsis?519 (lambda (x1239) (if (nonsymbol-id?305 x1239) (literal-id=?436 @@ -6082,7 +6138,7 @@ (strip-annotation520 (car x1238)) (strip-annotation520 (cdr x1238))) (if (annotation?132 x1238) - (annotation-stripped x1238) + (sc-annotation-stripped x1238) x1238)))) (strip*521 (lambda (x1231 w1230 fn1229) (if (memq 'top (wrap-marks316 w1230)) @@ -6115,7 +6171,7 @@ (if (vector? x1233) ((lambda (old1236) ((lambda (new1237) - (if (andmap + (if (sc-andmap2 eq? old1236 new1237) @@ -6146,8 +6202,8 @@ (gen-var523 (lambda (id1223) ((lambda (id1224) (if (annotation?132 id1224) - (gensym) - (gensym))) + (jensym) + (jensym))) (if (syntax-object?64 id1223) (syntax-object-expression65 id1223) id1223)))) @@ -6186,7 +6242,7 @@ (if (annotation?132 vars1222) (lvl1219 - (annotation-expression + (sc-annotation-expression vars1222) ls1221 w1220) @@ -6258,10 +6314,10 @@ (if (not (eq? (interface-token455 iface1208) token1205)) - (syntax-error + (sc-syntax-error id1199 '"import mismatch for module") - (void)) + (voide)) (sc-put-module1200 (interface-exports454 iface1208) @@ -6272,7 +6328,7 @@ (interface-exports454 iface1208))) (binding-value282 b1206)) - (syntax-error + (sc-syntax-error id1199 '"unknown module"))) (binding-type281 b1206))) @@ -6310,7 +6366,7 @@ (if (memv t1193 '(displaced-lexical)) (displaced-lexical-error299 (wrap443 id1192 w1168)) - (void))) + (voide))) (binding-type281 (lookup301 n1191 r1170)))) var1183 @@ -6332,7 +6388,7 @@ var1183))) tmp1173) ((lambda (_1196) - (syntax-error (source-wrap444 e1171 w1168 ae1167))) + (sc-syntax-error (source-wrap444 e1171 w1168 ae1167))) tmp1172))) ($syntax-dispatch tmp1172 @@ -6350,7 +6406,7 @@ (list 'quote (strip522 e1163 w1157))) tmp1162) ((lambda (_1165) - (syntax-error (source-wrap444 e1160 w1157 ae1156))) + (sc-syntax-error (source-wrap444 e1160 w1157 ae1156))) tmp1161))) ($syntax-dispatch tmp1161 '(any any)))) e1160))) @@ -6386,7 +6442,7 @@ maps1103))) (if (ellipsis?1096 e1099) - (syntax-error + (sc-syntax-error src1100 '"misplaced ellipsis in syntax form") (values @@ -6412,7 +6468,7 @@ (lambda (dots1111 e1110) (if vec?1095 - (syntax-error + (sc-syntax-error src1100 '"misplaced ellipsis in syntax template") (gen-syntax1039 @@ -6465,7 +6521,7 @@ maps1130) (if (null? (car maps1130)) - (syntax-error + (sc-syntax-error src1100 '"extra ellipsis in syntax form") (values @@ -6521,7 +6577,7 @@ maps1138) (if (null? (car maps1138)) - (syntax-error + (sc-syntax-error src1100 '"extra ellipsis in syntax form") (values @@ -6623,7 +6679,7 @@ (if (= level1088 '0) (values var1089 maps1087) (if (null? maps1087) - (syntax-error + (sc-syntax-error src1090 '"missing ellipsis in syntax form") (call-with-values @@ -6670,7 +6726,7 @@ ((lambda (formals1078 actuals1077) (if (eq? (car e1076) 'ref) (car actuals1077) - (if (andmap + (if (sc-andmap (lambda (x1079) (if (eq? (car x1079) 'ref) @@ -6807,7 +6863,7 @@ (lambda (e1059 maps1058) (regen1046 e1059)))) tmp1055) - ((lambda (_1060) (syntax-error e1053)) + ((lambda (_1060) (sc-syntax-error e1053)) tmp1054))) ($syntax-dispatch tmp1054 '(any any)))) e1053)) @@ -6829,7 +6885,7 @@ (lambda (vars1038 body1037) (list 'lambda vars1038 body1037)))) tmp1034) - (syntax-error tmp1033))) + (sc-syntax-error tmp1033))) ($syntax-dispatch tmp1033 '(any . any)))) e1032))) (global-extend304 @@ -6877,7 +6933,7 @@ id1014)) tmp1010) ((lambda (_1026) - (syntax-error (source-wrap444 e1008 w1005 ae1004))) + (sc-syntax-error (source-wrap444 e1008 w1005 ae1004))) tmp1009))) ($syntax-dispatch tmp1009 @@ -6909,7 +6965,7 @@ (chi498 else998 r990 mr989 w988 m?986))) tmp997) ((lambda (_1002) - (syntax-error + (sc-syntax-error (source-wrap444 e991 w988 ae987))) tmp992))) ($syntax-dispatch tmp992 '(any any any any))))) @@ -7197,12 +7253,12 @@ (map car pvars906) pat899 '"pattern variable") - (if (not (andmap + (if (not (sc-andmap (lambda (x908) (not (ellipsis?519 (car x908)))) pvars906)) - (syntax-error + (sc-syntax-error pat899 '"misplaced ellipsis in syntax-case pattern") ((lambda (y909) @@ -7344,7 +7400,7 @@ exp893)) tmp892) ((lambda (_896) - (syntax-error + (sc-syntax-error (car clauses883) '"invalid syntax-case clause")) tmp886))) @@ -7363,7 +7419,7 @@ (if tmp870 (apply (lambda (_874 val873 key872 m871) - (if (andmap + (if (sc-andmap (lambda (x876) (if (id?306 x876) (not (ellipsis?519 x876)) @@ -7380,11 +7436,11 @@ (chi498 val873 r866 mr865 '(()) m?862)))) (gen-var523 'tmp)) - (syntax-error + (sc-syntax-error e868 '"invalid literals list in"))) tmp870) - (syntax-error tmp869))) + (sc-syntax-error tmp869))) ($syntax-dispatch tmp869 '(any any each-any . each-any)))) @@ -7399,15 +7455,15 @@ (if tmp853 (apply (lambda (id855 e854) - (if (identifier? + (if (sc-identifier? id855) - (andmap + (sc-andmap proper-export?828 e854) '#f)) tmp853) ((lambda (id857) - (identifier? id857)) + (sc-identifier? id857)) tmp852))) ($syntax-dispatch tmp852 @@ -7420,7 +7476,7 @@ (if tmp832 (apply (lambda (_835 e834 d833) - (if (andmap proper-export?828 e834) + (if (sc-andmap proper-export?828 e834) (list '#(syntax-object begin ((top) #(ribcage #(_ e d) #((top) (top) (top)) #("i" "i" "i")) #(ribcage #(orig) #((top)) #("i")) #(ribcage (proper-export?) ((top)) ("i")) #(ribcage #(x) #((top)) #("i")) #(ribcage (lambda-var-list gen-var strip strip* strip-annotation ellipsis? chi-void chi-local-syntax chi-lambda-clause parse-begin parse-alias parse-eval-when parse-meta parse-define-syntax parse-define parse-import parse-module do-import! lookup-import-label import-mark-delta chi-internal chi-body chi-macro chi-set! chi-application chi-expr chi chi-sequence chi-meta-frob chi-frobs ct-eval/residualize3 ct-eval/residualize2 rt-eval/residualize initial-mode-set update-mode-set do-top-import vfor-each vmap chi-external check-defined-ids check-module-exports id-set-diff chi-top-module set-frob-meta?! set-frob-e! frob-meta? frob-e frob? make-frob create-module-binding set-module-binding-exported! set-module-binding-val! set-module-binding-imps! set-module-binding-label! set-module-binding-id! set-module-binding-type! module-binding-exported module-binding-val module-binding-imps module-binding-label module-binding-id module-binding-type module-binding? make-module-binding make-resolved-interface make-unresolved-interface set-interface-token! set-interface-exports! set-interface-marks! interface-token interface-exports interface-marks interface? make-interface flatten-exports chi-top chi-top-sequence chi-top* syntax-type chi-when-list source-wrap wrap bound-id-member? invalid-ids-error distinct-bound-ids? valid-bound-ids? bound-id=? help-bound-id=? literal-id=? free-id=? id-var-name id-var-name-loc id-var-name&marks id-var-name-loc&marks top-id-free-var-name top-id-bound-var-name anon diff-marks same-marks? join-subst join-marks join-wraps smart-append resolved-id-var-name id->resolved-id make-resolved-id make-binding-wrap store-import-binding lookup-import-binding-name extend-ribcage-subst! extend-ribcage-barrier-help! extend-ribcage-barrier! import-extend-ribcage! extend-ribcage! make-empty-ribcage barrier-marker new-mark anti-mark the-anti-mark set-env-wrap! set-env-top-ribcage! env-wrap env-top-ribcage env? make-env set-import-interface-new-marks! set-import-interface-interface! import-interface-new-marks import-interface-interface import-interface? make-import-interface set-top-ribcage-mutable?! set-top-ribcage-key! top-ribcage-mutable? top-ribcage-key top-ribcage? make-top-ribcage set-ribcage-labels! set-ribcage-marks! set-ribcage-symnames! ribcage-labels ribcage-marks ribcage-symnames ribcage? make-ribcage gen-labels label? gen-label set-indirect-label! get-indirect-label indirect-label? gen-indirect-label anon only-top-marked? top-marked? tmp-wrap top-wrap empty-wrap wrap-subst wrap-marks make-wrap id-sym-name&marks id-subst id-marks id-sym-name id? nonsymbol-id? global-extend defer-or-eval-transformer make-transformer-binding lookup lookup* displaced-lexical-error displaced-lexical? extend-var-env* extend-env* extend-env null-env binding? set-binding-value! set-binding-type! binding-value binding-type make-binding sanitize-binding arg-check no-source unannotate self-evaluating? lexical-var? build-lexical-var build-top-module build-body build-letrec build-sequence build-data build-primref built-lambda? build-lambda build-revisit-only build-visit-only build-cte-install build-global-definition build-global-assignment build-global-reference build-lexical-assignment build-lexical-reference build-conditional build-application generate-id update-import-binding! get-import-binding read-only-binding? put-global-definition-hook get-global-definition-hook put-cte-hook error-hook define-top-level-value-hook local-eval-hook top-level-eval-hook annotation? fx>= fx<= fx> fx< fx= fx- fx+ set-syntax-object-wrap! set-syntax-object-expression! syntax-object-wrap syntax-object-expression syntax-object? make-syntax-object noexpand let-values define-structure unless when) ((top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) ("m" top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) ("m" top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top)) ("i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i")) #(top-ribcage *top* #t))) (cons @@ -7435,7 +7491,7 @@ (cons orig830 '#(syntax-object (#f anon) ((top) #(ribcage #(_ e d) #((top) (top) (top)) #("i" "i" "i")) #(ribcage #(orig) #((top)) #("i")) #(ribcage (proper-export?) ((top)) ("i")) #(ribcage #(x) #((top)) #("i")) #(ribcage (lambda-var-list gen-var strip strip* strip-annotation ellipsis? chi-void chi-local-syntax chi-lambda-clause parse-begin parse-alias parse-eval-when parse-meta parse-define-syntax parse-define parse-import parse-module do-import! lookup-import-label import-mark-delta chi-internal chi-body chi-macro chi-set! chi-application chi-expr chi chi-sequence chi-meta-frob chi-frobs ct-eval/residualize3 ct-eval/residualize2 rt-eval/residualize initial-mode-set update-mode-set do-top-import vfor-each vmap chi-external check-defined-ids check-module-exports id-set-diff chi-top-module set-frob-meta?! set-frob-e! frob-meta? frob-e frob? make-frob create-module-binding set-module-binding-exported! set-module-binding-val! set-module-binding-imps! set-module-binding-label! set-module-binding-id! set-module-binding-type! module-binding-exported module-binding-val module-binding-imps module-binding-label module-binding-id module-binding-type module-binding? make-module-binding make-resolved-interface make-unresolved-interface set-interface-token! set-interface-exports! set-interface-marks! interface-token interface-exports interface-marks interface? make-interface flatten-exports chi-top chi-top-sequence chi-top* syntax-type chi-when-list source-wrap wrap bound-id-member? invalid-ids-error distinct-bound-ids? valid-bound-ids? bound-id=? help-bound-id=? literal-id=? free-id=? id-var-name id-var-name-loc id-var-name&marks id-var-name-loc&marks top-id-free-var-name top-id-bound-var-name anon diff-marks same-marks? join-subst join-marks join-wraps smart-append resolved-id-var-name id->resolved-id make-resolved-id make-binding-wrap store-import-binding lookup-import-binding-name extend-ribcage-subst! extend-ribcage-barrier-help! extend-ribcage-barrier! import-extend-ribcage! extend-ribcage! make-empty-ribcage barrier-marker new-mark anti-mark the-anti-mark set-env-wrap! set-env-top-ribcage! env-wrap env-top-ribcage env? make-env set-import-interface-new-marks! set-import-interface-interface! import-interface-new-marks import-interface-interface import-interface? make-import-interface set-top-ribcage-mutable?! set-top-ribcage-key! top-ribcage-mutable? top-ribcage-key top-ribcage? make-top-ribcage set-ribcage-labels! set-ribcage-marks! set-ribcage-symnames! ribcage-labels ribcage-marks ribcage-symnames ribcage? make-ribcage gen-labels label? gen-label set-indirect-label! get-indirect-label indirect-label? gen-indirect-label anon only-top-marked? top-marked? tmp-wrap top-wrap empty-wrap wrap-subst wrap-marks make-wrap id-sym-name&marks id-subst id-marks id-sym-name id? nonsymbol-id? global-extend defer-or-eval-transformer make-transformer-binding lookup lookup* displaced-lexical-error displaced-lexical? extend-var-env* extend-env* extend-env null-env binding? set-binding-value! set-binding-type! binding-value binding-type make-binding sanitize-binding arg-check no-source unannotate self-evaluating? lexical-var? build-lexical-var build-top-module build-body build-letrec build-sequence build-data build-primref built-lambda? build-lambda build-revisit-only build-visit-only build-cte-install build-global-definition build-global-assignment build-global-reference build-lexical-assignment build-lexical-reference build-conditional build-application generate-id update-import-binding! get-import-binding read-only-binding? put-global-definition-hook get-global-definition-hook put-cte-hook error-hook define-top-level-value-hook local-eval-hook top-level-eval-hook annotation? fx>= fx<= fx> fx< fx= fx- fx+ set-syntax-object-wrap! set-syntax-object-expression! syntax-object-wrap syntax-object-expression syntax-object? make-syntax-object noexpand let-values define-structure unless when) ((top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) ("m" top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) ("m" top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top)) ("i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i")) #(top-ribcage *top* #t)))))) - (syntax-error + (sc-syntax-error x827 '"invalid exports list in"))) tmp832) @@ -7443,12 +7499,12 @@ (if (if tmp839 (apply (lambda (_843 m842 e841 d840) - (identifier? m842)) + (sc-identifier? m842)) tmp839) '#f) (apply (lambda (_847 m846 e845 d844) - (if (andmap proper-export?828 e845) + (if (sc-andmap proper-export?828 e845) (cons '#(syntax-object $module ((top) #(ribcage #(_ m e d) #((top) (top) (top) (top)) #("i" "i" "i" "i")) #(ribcage #(orig) #((top)) #("i")) #(ribcage (proper-export?) ((top)) ("i")) #(ribcage #(x) #((top)) #("i")) #(ribcage (lambda-var-list gen-var strip strip* strip-annotation ellipsis? chi-void chi-local-syntax chi-lambda-clause parse-begin parse-alias parse-eval-when parse-meta parse-define-syntax parse-define parse-import parse-module do-import! lookup-import-label import-mark-delta chi-internal chi-body chi-macro chi-set! chi-application chi-expr chi chi-sequence chi-meta-frob chi-frobs ct-eval/residualize3 ct-eval/residualize2 rt-eval/residualize initial-mode-set update-mode-set do-top-import vfor-each vmap chi-external check-defined-ids check-module-exports id-set-diff chi-top-module set-frob-meta?! set-frob-e! frob-meta? frob-e frob? make-frob create-module-binding set-module-binding-exported! set-module-binding-val! set-module-binding-imps! set-module-binding-label! set-module-binding-id! set-module-binding-type! module-binding-exported module-binding-val module-binding-imps module-binding-label module-binding-id module-binding-type module-binding? make-module-binding make-resolved-interface make-unresolved-interface set-interface-token! set-interface-exports! set-interface-marks! interface-token interface-exports interface-marks interface? make-interface flatten-exports chi-top chi-top-sequence chi-top* syntax-type chi-when-list source-wrap wrap bound-id-member? invalid-ids-error distinct-bound-ids? valid-bound-ids? bound-id=? help-bound-id=? literal-id=? free-id=? id-var-name id-var-name-loc id-var-name&marks id-var-name-loc&marks top-id-free-var-name top-id-bound-var-name anon diff-marks same-marks? join-subst join-marks join-wraps smart-append resolved-id-var-name id->resolved-id make-resolved-id make-binding-wrap store-import-binding lookup-import-binding-name extend-ribcage-subst! extend-ribcage-barrier-help! extend-ribcage-barrier! import-extend-ribcage! extend-ribcage! make-empty-ribcage barrier-marker new-mark anti-mark the-anti-mark set-env-wrap! set-env-top-ribcage! env-wrap env-top-ribcage env? make-env set-import-interface-new-marks! set-import-interface-interface! import-interface-new-marks import-interface-interface import-interface? make-import-interface set-top-ribcage-mutable?! set-top-ribcage-key! top-ribcage-mutable? top-ribcage-key top-ribcage? make-top-ribcage set-ribcage-labels! set-ribcage-marks! set-ribcage-symnames! ribcage-labels ribcage-marks ribcage-symnames ribcage? make-ribcage gen-labels label? gen-label set-indirect-label! get-indirect-label indirect-label? gen-indirect-label anon only-top-marked? top-marked? tmp-wrap top-wrap empty-wrap wrap-subst wrap-marks make-wrap id-sym-name&marks id-subst id-marks id-sym-name id? nonsymbol-id? global-extend defer-or-eval-transformer make-transformer-binding lookup lookup* displaced-lexical-error displaced-lexical? extend-var-env* extend-env* extend-env null-env binding? set-binding-value! set-binding-type! binding-value binding-type make-binding sanitize-binding arg-check no-source unannotate self-evaluating? lexical-var? build-lexical-var build-top-module build-body build-letrec build-sequence build-data build-primref built-lambda? build-lambda build-revisit-only build-visit-only build-cte-install build-global-definition build-global-assignment build-global-reference build-lexical-assignment build-lexical-reference build-conditional build-application generate-id update-import-binding! get-import-binding read-only-binding? put-global-definition-hook get-global-definition-hook put-cte-hook error-hook define-top-level-value-hook local-eval-hook top-level-eval-hook annotation? fx>= fx<= fx> fx< fx= fx- fx+ set-syntax-object-wrap! set-syntax-object-expression! syntax-object-wrap syntax-object-expression syntax-object? make-syntax-object noexpand let-values define-structure unless when) ((top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) ("m" top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) ("m" top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top)) ("i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i")) #(top-ribcage *top* #t))) (cons @@ -7456,11 +7512,11 @@ (cons m846 (cons e845 d844)))) - (syntax-error + (sc-syntax-error x827 '"invalid exports list in"))) tmp839) - (syntax-error tmp831))) + (sc-syntax-error tmp831))) ($syntax-dispatch tmp831 '(any any each-any . each-any))))) @@ -7516,7 +7572,7 @@ '(displaced-lexical)) (displaced-lexical-error299 m819) - (syntax-error + (sc-syntax-error m819 '"unknown module")))) (binding-type281 b820))) @@ -7569,12 +7625,12 @@ np812) prefix808) '#f)) - (syntax-error + (sc-syntax-error id809 (string-append '"missing expected prefix " prefix808)) - (void)) + (voide)) (datum->syntax-object id809 (string->symbol @@ -7600,7 +7656,7 @@ ((lambda (e806) (if (annotation?132 e806) - (annotation-expression + (sc-annotation-expression e806) e806)) (if (syntax-object?64 @@ -7623,8 +7679,8 @@ (apply (lambda (m663 id662) - (andmap - identifier? + (sc-andmap + sc-identifier? id662)) tmp661) '#f) @@ -7664,7 +7720,7 @@ id665 '#f))) tmp671) - (syntax-error + (sc-syntax-error tmp670))) ($syntax-dispatch tmp670 @@ -7679,8 +7735,8 @@ (apply (lambda (m678 id677) - (andmap - identifier? + (sc-andmap + sc-identifier? id677)) tmp676) '#f) @@ -7721,7 +7777,7 @@ id688 '#f))) tmp687) - (syntax-error + (sc-syntax-error tmp685))) ($syntax-dispatch tmp685 @@ -7740,7 +7796,7 @@ (apply (lambda (m695 prefix-id694) - (identifier? + (sc-identifier? prefix-id694)) tmp693) '#f) @@ -7822,7 +7878,7 @@ id703 '#f))) tmp702) - (syntax-error + (sc-syntax-error tmp701))) ($syntax-dispatch tmp701 @@ -7835,7 +7891,7 @@ (gen-mid638 mid700) exports698 - (generate-temporaries + (sc-generate-temporaries exports698) (map (prefix-add636 prefix-id696) @@ -7846,7 +7902,7 @@ (apply (lambda (m719 prefix-id718) - (identifier? + (sc-identifier? prefix-id718)) tmp717) '#f) @@ -7928,7 +7984,7 @@ id727 '#f))) tmp726) - (syntax-error + (sc-syntax-error tmp725))) ($syntax-dispatch tmp725 @@ -7941,7 +7997,7 @@ (gen-mid638 mid724) exports722 - (generate-temporaries + (sc-generate-temporaries exports722) (map (prefix-drop637 prefix-id720) @@ -7953,11 +8009,11 @@ (lambda (m744 new-id743 old-id742) - (if (andmap - identifier? + (if (sc-andmap + sc-identifier? new-id743) - (andmap - identifier? + (sc-andmap + sc-identifier? old-id742) '#f)) tmp741) @@ -8046,7 +8102,7 @@ other-id757) '#f))) tmp756) - (syntax-error + (sc-syntax-error tmp753))) ($syntax-dispatch tmp753 @@ -8057,7 +8113,7 @@ d751 (gen-mid638 mid752) - (generate-temporaries + (sc-generate-temporaries old-id747) (difference635 exports750 @@ -8069,11 +8125,11 @@ (lambda (m776 new-id775 old-id774) - (if (andmap - identifier? + (if (sc-andmap + sc-identifier? new-id775) - (andmap - identifier? + (sc-andmap + sc-identifier? old-id774) '#f)) tmp773) @@ -8134,7 +8190,7 @@ other-id787) '#f))) tmp786) - (syntax-error + (sc-syntax-error tmp785))) ($syntax-dispatch tmp785 @@ -8150,7 +8206,7 @@ (if (if tmp797 (apply (lambda (mid798) - (identifier? + (sc-identifier? mid798)) tmp797) '#f) @@ -8173,7 +8229,7 @@ (if (if tmp800 (apply (lambda (mid801) - (identifier? + (sc-identifier? mid801)) tmp800) '#f) @@ -8193,7 +8249,7 @@ '#f))) tmp800) ((lambda (_803) - (syntax-error + (sc-syntax-error m655 '"invalid module specifier")) tmp660))) @@ -8246,7 +8302,7 @@ each-any)))) m655)) tmp657) - (syntax-error + (sc-syntax-error tmp656))) ($syntax-dispatch tmp656 @@ -8278,7 +8334,7 @@ '#(syntax-object begin ((top) #(ribcage #(d) #((top)) #("i")) #(ribcage #(_ m) #((top) (top)) #("i" "i")) #(ribcage (modspec* modspec gen-mid prefix-drop prefix-add difference) ((top) (top) (top) (top) (top) (top)) ("i" "i" "i" "i" "i" "i")) #(ribcage #(r) #((top)) #("i")) #(ribcage () () ()) #(ribcage #(orig import-only?) #((top) (top)) #("i" "i")) #(ribcage ($import-help $module-exports) ((top) (top)) ("i" "i")) #(ribcage (lambda-var-list gen-var strip strip* strip-annotation ellipsis? chi-void chi-local-syntax chi-lambda-clause parse-begin parse-alias parse-eval-when parse-meta parse-define-syntax parse-define parse-import parse-module do-import! lookup-import-label import-mark-delta chi-internal chi-body chi-macro chi-set! chi-application chi-expr chi chi-sequence chi-meta-frob chi-frobs ct-eval/residualize3 ct-eval/residualize2 rt-eval/residualize initial-mode-set update-mode-set do-top-import vfor-each vmap chi-external check-defined-ids check-module-exports id-set-diff chi-top-module set-frob-meta?! set-frob-e! frob-meta? frob-e frob? make-frob create-module-binding set-module-binding-exported! set-module-binding-val! set-module-binding-imps! set-module-binding-label! set-module-binding-id! set-module-binding-type! module-binding-exported module-binding-val module-binding-imps module-binding-label module-binding-id module-binding-type module-binding? make-module-binding make-resolved-interface make-unresolved-interface set-interface-token! set-interface-exports! set-interface-marks! interface-token interface-exports interface-marks interface? make-interface flatten-exports chi-top chi-top-sequence chi-top* syntax-type chi-when-list source-wrap wrap bound-id-member? invalid-ids-error distinct-bound-ids? valid-bound-ids? bound-id=? help-bound-id=? literal-id=? free-id=? id-var-name id-var-name-loc id-var-name&marks id-var-name-loc&marks top-id-free-var-name top-id-bound-var-name anon diff-marks same-marks? join-subst join-marks join-wraps smart-append resolved-id-var-name id->resolved-id make-resolved-id make-binding-wrap store-import-binding lookup-import-binding-name extend-ribcage-subst! extend-ribcage-barrier-help! extend-ribcage-barrier! import-extend-ribcage! extend-ribcage! make-empty-ribcage barrier-marker new-mark anti-mark the-anti-mark set-env-wrap! set-env-top-ribcage! env-wrap env-top-ribcage env? make-env set-import-interface-new-marks! set-import-interface-interface! import-interface-new-marks import-interface-interface import-interface? make-import-interface set-top-ribcage-mutable?! set-top-ribcage-key! top-ribcage-mutable? top-ribcage-key top-ribcage? make-top-ribcage set-ribcage-labels! set-ribcage-marks! set-ribcage-symnames! ribcage-labels ribcage-marks ribcage-symnames ribcage? make-ribcage gen-labels label? gen-label set-indirect-label! get-indirect-label indirect-label? gen-indirect-label anon only-top-marked? top-marked? tmp-wrap top-wrap empty-wrap wrap-subst wrap-marks make-wrap id-sym-name&marks id-subst id-marks id-sym-name id? nonsymbol-id? global-extend defer-or-eval-transformer make-transformer-binding lookup lookup* displaced-lexical-error displaced-lexical? extend-var-env* extend-env* extend-env null-env binding? set-binding-value! set-binding-type! binding-value binding-type make-binding sanitize-binding arg-check no-source unannotate self-evaluating? lexical-var? build-lexical-var build-top-module build-body build-letrec build-sequence build-data build-primref built-lambda? build-lambda build-revisit-only build-visit-only build-cte-install build-global-definition build-global-assignment build-global-reference build-lexical-assignment build-lexical-reference build-conditional build-application generate-id update-import-binding! get-import-binding read-only-binding? put-global-definition-hook get-global-definition-hook put-cte-hook error-hook define-top-level-value-hook local-eval-hook top-level-eval-hook annotation? fx>= fx<= fx> fx< fx= fx- fx+ set-syntax-object-wrap! set-syntax-object-expression! syntax-object-wrap syntax-object-expression syntax-object? make-syntax-object noexpand let-values define-structure unless when) ((top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) ("m" top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) ("m" top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top) (top)) ("i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i" "i")) #(top-ribcage *top* #t))) d648)) tmp647) - (syntax-error + (sc-syntax-error tmp645))) ($syntax-dispatch tmp645 @@ -8286,7 +8342,7 @@ (map modspec*640 m643))) tmp642) - (syntax-error tmp641))) + (sc-syntax-error tmp641))) ($syntax-dispatch tmp641 '(any . each-any)))) @@ -8318,11 +8374,11 @@ (wrap-marks316 '((top))) (cons top-ribcage623 (wrap-subst317 '((top))))))) (make-top-ribcage373 token622 mutable?621)))) - (set! environment? (lambda (x620) (env?386 x620))) + (set! sc-environment? (lambda (x620) (env?386 x620))) (set! sc-interaction-environment ((lambda (e619) (lambda () e619)) ($make-environment '*top* '#t))) - (set! identifier? (lambda (x618) (nonsymbol-id?305 x618))) + (set! sc-identifier? (lambda (x618) (nonsymbol-id?305 x618))) (set! datum->syntax-object (lambda (id616 datum615) (begin @@ -8332,7 +8388,7 @@ 'datum->syntax-object '"invalid argument" x617) - (void))) + (voide))) id616) (make-syntax-object63 datum615 @@ -8379,7 +8435,7 @@ v600))) (set! syntax-object->datum (lambda (x599) (strip522 x599 '(())))) - (set! generate-temporaries + (set! sc-generate-temporaries ((lambda (n595) (lambda (ls596) (begin @@ -8389,7 +8445,7 @@ 'generate-temporaries '"invalid argument" x598) - (void))) + (voide))) ls596) (map (lambda (x597) (begin @@ -8400,7 +8456,7 @@ '((tmp))))) ls596)))) '0)) - (set! free-identifier=? + (set! sc-free-identifier=? (lambda (x592 y591) (begin ((lambda (x594) @@ -8409,7 +8465,7 @@ 'free-identifier=? '"invalid argument" x594) - (void))) + (voide))) x592) ((lambda (x593) (if (not (nonsymbol-id?305 x593)) @@ -8417,10 +8473,10 @@ 'free-identifier=? '"invalid argument" x593) - (void))) + (voide))) y591) (free-id=?435 x592 y591)))) - (set! bound-identifier=? + (set! sc-bound-identifier=? (lambda (x588 y587) (begin ((lambda (x590) @@ -8429,7 +8485,7 @@ 'bound-identifier=? '"invalid argument" x590) - (void))) + (voide))) x588) ((lambda (x589) (if (not (nonsymbol-id?305 x589)) @@ -8437,7 +8493,7 @@ 'bound-identifier=? '"invalid argument" x589) - (void))) + (voide))) y587) (bound-id=?438 x588 y587)))) (set! literal-identifier=? @@ -8449,7 +8505,7 @@ 'literal-identifier=? '"invalid argument" x586) - (void))) + (voide))) x584) ((lambda (x585) (if (not (nonsymbol-id?305 x585)) @@ -8457,10 +8513,10 @@ 'literal-identifier=? '"invalid argument" x585) - (void))) + (voide))) y583) (literal-id=?436 x584 y583)))) - (set! syntax-error + (set! sc-syntax-error (lambda (object578 . messages579) (begin (for-each @@ -8471,7 +8527,7 @@ 'syntax-error '"invalid argument" x582) - (void))) + (voide))) x581)) messages579) ((lambda (message580) @@ -8483,7 +8539,7 @@ (letrec ((match-each525 (lambda (e575 p574 w573) (if (annotation?132 e575) (match-each525 - (annotation-expression e575) + (sc-annotation-expression e575) p574 w573) (if (pair? e575) @@ -8564,7 +8620,7 @@ (if (annotation?132 e568) (f566 - (annotation-expression + (sc-annotation-expression e568) w567) (if (syntax-object?64 @@ -8590,7 +8646,7 @@ (match-each-any527 (lambda (e558 w557) (if (annotation?132 e558) (match-each-any527 - (annotation-expression e558) + (sc-annotation-expression e558) w557) (if (pair? e558) ((lambda (l559) @@ -8668,7 +8724,7 @@ p555 '1) r554) - (void)))))) + (voide)))))) (vector-ref p555 '0)))))))) @@ -8799,7 +8855,7 @@ w543 r542) '#f) - (void))))))) + (voide))))))) (vector-ref p544 '0))))))) (match531 (lambda (e539 p538 w537 r536) (if (not r536) @@ -8810,7 +8866,7 @@ (match*530 ((lambda (e540) (if (annotation?132 e540) - (annotation-expression + (sc-annotation-expression e540) e540)) (syntax-object-expression65 @@ -8823,7 +8879,7 @@ (match*530 ((lambda (e541) (if (annotation?132 e541) - (annotation-expression + (sc-annotation-expression e541) e541)) e539) @@ -8838,7 +8894,7 @@ (match*530 ((lambda (e534) (if (annotation?132 e534) - (annotation-expression e534) + (sc-annotation-expression e534) e534)) (syntax-object-expression65 e533)) p532 @@ -8847,7 +8903,7 @@ (match*530 ((lambda (e535) (if (annotation?132 e535) - (annotation-expression e535) + (sc-annotation-expression e535) e535)) e533) p532 @@ -8895,7 +8951,7 @@ '#(syntax-object begin ((top) #(ribcage #(_ out in e1 e2) #((top) (top) (top) (top) (top)) #("i" "i" "i" "i" "i")) #(ribcage () () ()) #(ribcage #(x) #((top)) #("i")) #(top-ribcage *top* #t))) (cons e12547 e22546))))) tmp2545) - (syntax-error tmp2532))) + (sc-syntax-error tmp2532))) ($syntax-dispatch tmp2532 '(any #(each (any any)) any . each-any))))) @@ -8913,7 +8969,7 @@ (if (if tmp2556 (apply (lambda (dummy2561 tid2560 id2559 e12558 e22557) - (andmap identifier? (cons tid2560 id2559))) + (sc-andmap sc-identifier? (cons tid2560 id2559))) tmp2556) '#f) (apply @@ -8951,7 +9007,7 @@ id2565) (cons e12564 e22563))))) tmp2556) - (syntax-error tmp2555))) + (sc-syntax-error tmp2555))) ($syntax-dispatch tmp2555 '(any (any . each-any) any . each-any)))) @@ -8971,7 +9027,7 @@ '#(syntax-object syntax ((top) #(ribcage #(dummy x) #(("m" top) (top)) #("i" "i")) #(ribcage () () ()) #(ribcage #(x) #(("m" top)) #("i")) #(top-ribcage *top* #t))) x2573))) tmp2572) - (syntax-error tmp2571))) + (sc-syntax-error tmp2571))) ($syntax-dispatch tmp2571 '(any any)))) x2570)) '*top*) @@ -9010,7 +9066,7 @@ template2599))) tmp2598) ((lambda (_2603) - (syntax-error x2575)) + (sc-syntax-error x2575)) tmp2593))) ($syntax-dispatch tmp2593 @@ -9024,7 +9080,7 @@ (if (if tmp2578 (apply (lambda (_2581 k2580 cl2579) - (andmap identifier? k2580)) + (sc-andmap sc-identifier? k2580)) tmp2578) '#f) (apply @@ -9043,11 +9099,11 @@ '#(syntax-object x ((top) #(ribcage #(cl) #((top)) #("i")) #(ribcage #(_ k cl) #((top) (top) (top)) #("i" "i" "i")) #(ribcage (clause) ((top)) ("i")) #(ribcage #(x) #((top)) #("i")) #(top-ribcage *top* #t))) (cons k2584 cl2589))))) tmp2588) - (syntax-error tmp2586))) + (sc-syntax-error tmp2586))) ($syntax-dispatch tmp2586 'each-any))) (map clause2576 cl2583))) tmp2578) - (syntax-error tmp2577))) + (sc-syntax-error tmp2577))) ($syntax-dispatch tmp2577 '(any each-any . each-any)))) x2575))) '*top*) @@ -9082,7 +9138,7 @@ '#(syntax-object or ((top) #(ribcage #(_ e1 e2 e3) #((top) (top) (top) (top)) #("i" "i" "i" "i")) #(ribcage () () ()) #(ribcage #(x) #((top)) #("i")) #(top-ribcage *top* #t))) (cons e22613 e32612))))) tmp2611) - (syntax-error tmp2605))) + (sc-syntax-error tmp2605))) ($syntax-dispatch tmp2605 '(any any any . each-any))))) @@ -9117,7 +9173,7 @@ (lambda (_2629) '#(syntax-object #t ((top) #(ribcage #(_) #((top)) #("i")) #(ribcage () () ()) #(ribcage #(x) #((top)) #("i")) #(top-ribcage *top* #t)))) tmp2628) - (syntax-error tmp2618))) + (sc-syntax-error tmp2618))) ($syntax-dispatch tmp2618 '(any))))) ($syntax-dispatch tmp2618 '(any any))))) ($syntax-dispatch tmp2618 '(any any any . each-any)))) @@ -9131,7 +9187,7 @@ (if (if tmp2632 (apply (lambda (_2637 x2636 v2635 e12634 e22633) - (andmap identifier? x2636)) + (sc-andmap sc-identifier? x2636)) tmp2632) '#f) (apply @@ -9146,7 +9202,7 @@ (if (if tmp2647 (apply (lambda (_2653 f2652 x2651 v2650 e12649 e22648) - (andmap identifier? (cons f2652 x2651))) + (sc-andmap sc-identifier? (cons f2652 x2651))) tmp2647) '#f) (apply @@ -9163,7 +9219,7 @@ f2659) v2657)) tmp2647) - (syntax-error tmp2631))) + (sc-syntax-error tmp2631))) ($syntax-dispatch tmp2631 '(any any #(each (any any)) any . each-any))))) @@ -9180,7 +9236,7 @@ (if (if tmp2666 (apply (lambda (let*2671 x2670 v2669 e12668 e22667) - (andmap identifier? x2670)) + (sc-andmap sc-identifier? x2670)) tmp2666) '#f) (apply @@ -9201,7 +9257,7 @@ (list binding2683) body2684)) tmp2682) - (syntax-error tmp2681))) + (sc-syntax-error tmp2681))) ($syntax-dispatch tmp2681 '(any any)))) @@ -9211,7 +9267,7 @@ f2678) (map list x2676 v2675))) tmp2666) - (syntax-error tmp2665))) + (sc-syntax-error tmp2665))) ($syntax-dispatch tmp2665 '(any #(each (any any)) any . each-any)))) @@ -9286,7 +9342,7 @@ e22707)))) tmp2706) ((lambda (_2711) - (syntax-error + (sc-syntax-error x2687)) tmp2696))) ($syntax-dispatch @@ -9365,7 +9421,7 @@ rest2713)) tmp2720) ((lambda (_2725) - (syntax-error + (sc-syntax-error x2687)) tmp2714))) ($syntax-dispatch @@ -9390,7 +9446,7 @@ m12691 m22690)) tmp2689) - (syntax-error tmp2688))) + (sc-syntax-error tmp2688))) ($syntax-dispatch tmp2688 '(any any . each-any)))) x2687)) '*top*) @@ -9458,14 +9514,14 @@ '#(syntax-object do ((top) #(ribcage #(e1 e2) #((top) (top)) #("i" "i")) #(ribcage #(step) #((top)) #("i")) #(ribcage #(_ var init step e0 e1 c) #((top) (top) (top) (top) (top) (top) (top)) #("i" "i" "i" "i" "i" "i" "i")) #(ribcage () () ()) #(ribcage #(orig-x) #((top)) #("i")) #(top-ribcage *top* #t))) step2748))))))) tmp2756) - (syntax-error tmp2749))) + (sc-syntax-error tmp2749))) ($syntax-dispatch tmp2749 '(any . each-any))))) ($syntax-dispatch tmp2749 '()))) e12731)) tmp2747) - (syntax-error tmp2737))) + (sc-syntax-error tmp2737))) ($syntax-dispatch tmp2737 'each-any))) (map (lambda (v2741 s2740) ((lambda (tmp2742) @@ -9478,7 +9534,7 @@ (lambda (e2745) e2745) tmp2744) ((lambda (_2746) - (syntax-error orig-x2727)) + (sc-syntax-error orig-x2727)) tmp2742))) ($syntax-dispatch tmp2742 '(any))))) ($syntax-dispatch tmp2742 '()))) @@ -9486,7 +9542,7 @@ var2735 step2733))) tmp2729) - (syntax-error tmp2728))) + (sc-syntax-error tmp2728))) ($syntax-dispatch tmp2728 '(any #(each (any any . any)) @@ -9723,7 +9779,7 @@ (lambda () '#(syntax-object ("quote" ()) ((top) #(ribcage () () ()) #(ribcage #(p lev) #((top) (top)) #("i" "i")) #(ribcage (emit quasivector quasilist* quasiappend quasicons vquasi quasi) ((top) (top) (top) (top) (top) (top) (top)) ("i" "i" "i" "i" "i" "i" "i")) #(top-ribcage *top* #t)))) tmp2898) - (syntax-error tmp2884))) + (sc-syntax-error tmp2884))) ($syntax-dispatch tmp2884 '())))) ($syntax-dispatch tmp2884 '(any . any)))) p2883))) @@ -9810,7 +9866,7 @@ any)))) y2868)) tmp2867) - (syntax-error tmp2866))) + (sc-syntax-error tmp2866))) ($syntax-dispatch tmp2866 '(any any)))) (list x2865 y2864)))) (quasiappend2767 (lambda (x2851 y2850) @@ -9832,7 +9888,7 @@ '#(syntax-object "append" ((top) #(ribcage #(p) #((top)) #("i")) #(ribcage () () ()) #(ribcage #(x y) #((top) (top)) #("i" "i")) #(ribcage (emit quasivector quasilist* quasiappend quasicons vquasi quasi) ((top) (top) (top) (top) (top) (top) (top)) ("i" "i" "i" "i" "i" "i" "i")) #(top-ribcage *top* #t))) p2856)) tmp2855) - (syntax-error + (sc-syntax-error tmp2854))) ($syntax-dispatch tmp2854 @@ -9855,7 +9911,7 @@ (list y2861)))) tmp2860) - (syntax-error + (sc-syntax-error tmp2859))) ($syntax-dispatch tmp2859 @@ -9963,7 +10019,7 @@ '#(syntax-object "vector" ((top) #(ribcage #(t8) #(("m" tmp)) #("i")) #(ribcage () () ()) #(ribcage #(ls) #((top)) #("i")) #(ribcage #(_) #((top)) #("i")) #(ribcage () () ()) #(ribcage #(x) #((top)) #("i")) #(ribcage (emit quasivector quasilist* quasiappend quasicons vquasi quasi) ((top) (top) (top) (top) (top) (top) (top)) ("i" "i" "i" "i" "i" "i" "i")) #(top-ribcage *top* #t))) t82844)) tmp2843) - (syntax-error + (sc-syntax-error tmp2842))) ($syntax-dispatch tmp2842 @@ -9997,7 +10053,7 @@ '#(syntax-object list ((top) #(ribcage #(t1) #(("m" tmp)) #("i")) #(ribcage #(x) #((top)) #("i")) #(ribcage () () ()) #(ribcage #(x) #((top)) #("i")) #(ribcage (emit quasivector quasilist* quasiappend quasicons vquasi quasi) ((top) (top) (top) (top) (top) (top) (top)) ("i" "i" "i" "i" "i" "i" "i")) #(top-ribcage *top* #t))) t12785)) tmp2784) - (syntax-error + (sc-syntax-error tmp2782))) ($syntax-dispatch tmp2782 @@ -10024,7 +10080,7 @@ t32795 t22794)) tmp2793) - (syntax-error + (sc-syntax-error tmp2792))) ($syntax-dispatch tmp2792 @@ -10050,7 +10106,7 @@ '#(syntax-object append ((top) #(ribcage #(t4) #(("m" tmp)) #("i")) #(ribcage #(x) #((top)) #("i")) #(ribcage () () ()) #(ribcage #(x) #((top)) #("i")) #(ribcage (emit quasivector quasilist* quasiappend quasicons vquasi quasi) ((top) (top) (top) (top) (top) (top) (top)) ("i" "i" "i" "i" "i" "i" "i")) #(top-ribcage *top* #t))) t42802)) tmp2801) - (syntax-error + (sc-syntax-error tmp2799))) ($syntax-dispatch tmp2799 @@ -10071,7 +10127,7 @@ '#(syntax-object vector ((top) #(ribcage #(t5) #(("m" tmp)) #("i")) #(ribcage #(x) #((top)) #("i")) #(ribcage () () ()) #(ribcage #(x) #((top)) #("i")) #(ribcage (emit quasivector quasilist* quasiappend quasicons vquasi quasi) ((top) (top) (top) (top) (top) (top) (top)) ("i" "i" "i" "i" "i" "i" "i")) #(top-ribcage *top* #t))) t52809)) tmp2808) - (syntax-error + (sc-syntax-error tmp2806))) ($syntax-dispatch tmp2806 @@ -10098,7 +10154,7 @@ (lambda (x2816) x2816) tmp2815) - (syntax-error + (sc-syntax-error tmp2777))) ($syntax-dispatch tmp2777 @@ -10141,17 +10197,17 @@ (apply (lambda (_2775 e2774) (emit2770 (quasi2764 e2774 '0))) tmp2773) - (syntax-error tmp2772))) + (sc-syntax-error tmp2772))) ($syntax-dispatch tmp2772 '(any any)))) x2771))))) '*top*) ($sc-put-cte '#(syntax-object unquote ((top) #(ribcage #(unquote) #((top)) #(unquote)))) - (lambda (x2923) (syntax-error x2923 '"misplaced")) + (lambda (x2923) (sc-syntax-error x2923 '"misplaced")) '*top*) ($sc-put-cte '#(syntax-object unquote-splicing ((top) #(ribcage #(unquote-splicing) #((top)) #(unquote-splicing)))) - (lambda (x2924) (syntax-error x2924 '"misplaced")) + (lambda (x2924) (sc-syntax-error x2924 '"misplaced")) '*top*) ($sc-put-cte '#(syntax-object quasisyntax ((top) #(ribcage #(quasisyntax) #((top)) #(quasisyntax)))) @@ -10255,12 +10311,12 @@ b*2975) t3004)) tmp3003) - (syntax-error + (sc-syntax-error tmp3002))) ($syntax-dispatch tmp3002 '(any)))) - (generate-temporaries + (sc-generate-temporaries (list q3001)))) tmp2999) @@ -10301,12 +10357,12 @@ tmp3016)) dnew3010))) tmp3014) - (syntax-error + (sc-syntax-error tmp3012))) ($syntax-dispatch tmp3012 'each-any))) - (generate-temporaries + (sc-generate-temporaries q3009))))) tmp3005) ((lambda (tmp3021) @@ -10359,7 +10415,7 @@ tmp3036)) dnew3026)) tmp3034) - (syntax-error + (sc-syntax-error tmp3032))) ($syntax-dispatch tmp3032 @@ -10371,12 +10427,12 @@ '(#(syntax-object ... ((top) #(ribcage #(t) #((top)) #("i")) #(ribcage () () ()) #(ribcage #(b* dnew) #((top) (top)) #("i" "i")) #(ribcage #(q d) #((top) (top)) #("i" "i")) #(ribcage () () ()) #(ribcage #(q n b* k) #((top) (top) (top) (top)) #("i" "i" "i" "i")) #(ribcage (vqs qs) ((top) (top)) ("i" "i")) #(ribcage #(x) #((top)) #("i")) #(top-ribcage *top* #t)))))) t3031)))) tmp3030) - (syntax-error + (sc-syntax-error tmp3028))) ($syntax-dispatch tmp3028 'each-any))) - (generate-temporaries + (sc-generate-temporaries q3025))))) tmp3021) ((lambda (tmp3042) @@ -10414,7 +10470,7 @@ a3052 d3051)) tmp3050) - (syntax-error + (sc-syntax-error tmp3049))) ($syntax-dispatch tmp3049 @@ -10462,7 +10518,7 @@ (list->vector x3063)) tmp3062) - (syntax-error + (sc-syntax-error tmp3061))) ($syntax-dispatch tmp3061 @@ -10555,12 +10611,12 @@ t2952 xnew*2943))) tmp2951) - (syntax-error + (sc-syntax-error tmp2949))) ($syntax-dispatch tmp2949 'each-any))) - (generate-temporaries + (sc-generate-temporaries q2948))) tmp2946) ((lambda (tmp2956) @@ -10600,7 +10656,7 @@ m2966) xnew*2943)) tmp2965) - (syntax-error + (sc-syntax-error tmp2963))) ($syntax-dispatch tmp2963 @@ -10612,12 +10668,12 @@ '(#(syntax-object ... ((top) #(ribcage #(t) #((top)) #("i")) #(ribcage #(q) #((top)) #("i")) #(ribcage () () ()) #(ribcage #(b* xnew*) #((top) (top)) #("i" "i")) #(ribcage () () ()) #(ribcage #(x* n b* k) #((top) (top) (top) (top)) #("i" "i" "i" "i")) #(ribcage (vqs qs) ((top) (top)) ("i" "i")) #(ribcage #(x) #((top)) #("i")) #(top-ribcage *top* #t)))))) t2962)))) tmp2961) - (syntax-error + (sc-syntax-error tmp2959))) ($syntax-dispatch tmp2959 'each-any))) - (generate-temporaries + (sc-generate-temporaries q2958))) tmp2956) ((lambda (_2971) @@ -10672,23 +10728,23 @@ '#(syntax-object syntax ((top) #(ribcage #(b x) #((top) (top)) #("i" "i")) #(ribcage () () ()) #(ribcage #(b* xnew) #((top) (top)) #("i" "i")) #(ribcage #(_ x) #((top) (top)) #("i" "i")) #(ribcage (vqs qs) ((top) (top)) ("i" "i")) #(ribcage #(x) #((top)) #("i")) #(top-ribcage *top* #t))) x2936))) tmp2935) - (syntax-error tmp2934))) + (sc-syntax-error tmp2934))) ($syntax-dispatch tmp2934 '(each-any any)))) (list b*2933 xnew2932)))))) tmp2929) - (syntax-error tmp2928))) + (sc-syntax-error tmp2928))) ($syntax-dispatch tmp2928 '(any any)))) x2925))) '*top*) ($sc-put-cte '#(syntax-object unsyntax ((top) #(ribcage #(unsyntax) #((top)) #(unsyntax)))) - (lambda (x3067) (syntax-error x3067 '"misplaced")) + (lambda (x3067) (sc-syntax-error x3067 '"misplaced")) '*top*) ($sc-put-cte '#(syntax-object unsyntax-splicing ((top) #(ribcage #(unsyntax-splicing) #((top)) #(unsyntax-splicing)))) - (lambda (x3068) (syntax-error x3068 '"misplaced")) + (lambda (x3068) (sc-syntax-error x3068 '"misplaced")) '*top*) ($sc-put-cte '#(syntax-object include ((top) #(ribcage #(include) #((top)) #(include)))) @@ -10726,12 +10782,12 @@ '#(syntax-object begin ((top) #(ribcage #(exp) #((top)) #("i")) #(ribcage () () ()) #(ribcage #(fn) #((top)) #("i")) #(ribcage #(k filename) #((top) (top)) #("i" "i")) #(ribcage (read-file) ((top)) ("i")) #(ribcage #(x) #((top)) #("i")) #(top-ribcage *top* #t))) exp3078)) tmp3077) - (syntax-error tmp3076))) + (sc-syntax-error tmp3076))) ($syntax-dispatch tmp3076 'each-any))) (read-file3070 fn3075 k3074))) (syntax-object->datum filename3073))) tmp3072) - (syntax-error tmp3071))) + (sc-syntax-error tmp3071))) ($syntax-dispatch tmp3071 '(any any)))) x3069))) '*top*) @@ -10788,7 +10844,7 @@ e23102)))) tmp3101) ((lambda (_3107) - (syntax-error + (sc-syntax-error x3085)) tmp3096))) ($syntax-dispatch @@ -10830,7 +10886,7 @@ rest3109)) tmp3111) ((lambda (_3117) - (syntax-error + (sc-syntax-error x3085)) tmp3110))) ($syntax-dispatch @@ -10848,7 +10904,7 @@ m13089 m23088))) tmp3087) - (syntax-error tmp3086))) + (sc-syntax-error tmp3086))) ($syntax-dispatch tmp3086 '(any any any . each-any)))) x3085)) '*top*) @@ -10889,8 +10945,8 @@ (apply (lambda (dummy3131 id3130 exp13129 var3128 val3127 exp23126) - (if (identifier? id3130) - (identifier? var3128) + (if (sc-identifier? id3130) + (sc-identifier? var3128) '#f)) tmp3125) '#f) @@ -10937,7 +10993,7 @@ '#(syntax-object syntax ((top) #(ribcage #(dummy id exp1 var val exp2) #(("m" top) (top) (top) (top) (top) (top)) #("i" "i" "i" "i" "i" "i")) #(ribcage () () ()) #(ribcage #(x) #(("m" top)) #("i")) #(top-ribcage *top* #t))) exp13135)))))) tmp3125) - (syntax-error tmp3121))) + (sc-syntax-error tmp3121))) ($syntax-dispatch tmp3121 '(any (any any) @@ -10950,34 +11006,6 @@ x3120)) '*top*) -(define env (scheme-report-environment 5)) - -(define (sc-eval e) - (eval (cadr e) env)) - -(eval `(define syntax-object->datum ,syntax-object->datum) env) -(eval `(define datum->syntax-object ,datum->syntax-object) env) -(eval `(define syntax->list ,syntax->list) env) -(eval `(define syntax->vector ,syntax->vector) env) -(eval `(define identifier? ,identifier?) env) -(eval `(define free-identifier=? ,free-identifier=?) env) -(eval `(define bound-identifier=? ,bound-identifier=?) env) -(eval `(define literal-identifier=? ,literal-identifier=?) env) -(eval `(define generate-temporaries ,generate-temporaries) env) -(eval `(define environment? ,environment?) env) -(eval `(define syntax-error ,syntax-error) env) -(eval `(define $sc-put-cte ,$sc-put-cte) env) -(eval `(define $syntax-dispatch ,$syntax-dispatch) env) -(eval `(define $make-environment ,$make-environment) env) -(eval `(define sc-expand ,sc-expand) env) -(eval `(define andmap ,andmap) env) -(eval `(define ormap ,ormap) env) -(eval `(define gensym ,gensym) env) -(eval `(define gensym? ,gensym?) env) - -(eval `(define eval ,sc-eval) env) -(eval `(define interaction-environment ,sc-interaction-environment) env) - (time (with-input-from-file "psyntax-input.txt" (lambda () diff --git a/collects/tests/mzscheme/benchmarks/common/psyntax.ss b/collects/tests/mzscheme/benchmarks/common/psyntax.ss index 2e6d5b82c2..e5d40e6426 100644 --- a/collects/tests/mzscheme/benchmarks/common/psyntax.ss +++ b/collects/tests/mzscheme/benchmarks/common/psyntax.ss @@ -1,6 +1,6 @@ #lang r5rs (#%require scheme/include - (only scheme/base time current-directory) + (only scheme/base time current-directory error) (only mzlib/etc this-expression-source-directory)) (current-directory (this-expression-source-directory)) (include "psyntax.sch") From 4271b7970c77cc0b6341bbc6aab25ccd6841b9f5 Mon Sep 17 00:00:00 2001 From: Casey Klein Date: Wed, 27 Jan 2010 15:52:15 +0000 Subject: [PATCH 081/113] Dropped the "preferred productions" heuristic and the failed prototype supporting accumulator-style generators. svn: r17851 --- collects/redex/private/rg.ss | 296 +++++++++++++------------------- collects/redex/tests/rg-test.ss | 175 +------------------ 2 files changed, 119 insertions(+), 352 deletions(-) diff --git a/collects/redex/private/rg.ss b/collects/redex/private/rg.ss index 573c7cecfb..b335676808 100644 --- a/collects/redex/private/rg.ss +++ b/collects/redex/private/rg.ss @@ -14,9 +14,6 @@ (define (exotic-choice? [random random]) (= 0 (random 5))) (define (use-lang-literal? [random random]) (= 0 (random 20))) -(define (preferred-production? attempt [random random]) - (and (>= attempt preferred-production-threshold) - (zero? (random 2)))) (define default-check-attempts 1000) @@ -57,27 +54,8 @@ (define (pick-string lang-lits attempt [random random]) (random-string lang-lits (random-natural 1/5 random) attempt random)) -(define (pick-nt name cross? lang attempt pref-prods - [random random] - [pref-prod? preferred-production?]) - (let ([prods (nt-rhs (nt-by-name lang name cross?))]) - (cond [(and pref-prods (pref-prod? attempt random)) - (hash-ref - ((if cross? pref-prods-cross pref-prods-non-cross) - pref-prods) - name)] - [else prods]))) - -(define-struct pref-prods (cross non-cross)) - -(define (pick-preferred-productions lang) - (let ([pick (λ (sel) - (for/hash ([nt (sel lang)]) - (values (nt-name nt) - (list (pick-from-list (nt-rhs nt))))))]) - (make-pref-prods - (pick compiled-lang-cclang) - (pick compiled-lang-lang)))) +(define (pick-nts name cross? lang attempt) + (nt-rhs (nt-by-name lang name cross?))) (define (pick-from-list l [random random]) (list-ref l (random (length l)))) @@ -118,9 +96,6 @@ (define proportion-at-size 1/10) (define post-threshold-incr 50) -(define preferred-production-threshold - (+ retry-threshold 2000)) - ;; Determines the parameter p for which random-natural's expected value is E (define (expected-value->p E) ;; E = 0 => p = 1, which breaks random-natural @@ -177,11 +152,11 @@ who what attempts (if (= attempts 1) "" "s"))]) (raise (make-exn:fail:redex:generation-failure str (current-continuation-marks))))) -(define (generate lang decisions@ user-gen retries what) +(define (generate lang decisions@ retries what) (define-values/invoke-unit decisions@ (import) (export decisions^)) - (define ((generate-nt lang base-cases generate pref-prods) + (define ((generate-nt lang base-cases generate) name cross? size attempt in-hole env) (let*-values ([(term _) @@ -193,7 +168,7 @@ (min-prods (nt-by-name lang name cross?) ((if cross? base-cases-cross base-cases-non-cross) base-cases)) - ((next-non-terminal-decision) name cross? lang attempt pref-prods)))]) + ((next-non-terminal-decision) name cross? lang attempt)))]) (generate (max 0 (sub1 size)) attempt empty-env in-hole (rhs-pattern rhs)))) (λ (_ env) (mismatches-satisfied? env)) size attempt)]) @@ -279,114 +254,101 @@ (cons (make-bind (binder-name key) val) bindings) bindings)))) - (define (generate-pat lang sexp pref-prods user-gen user-acc size attempt env in-hole pat) - (define recur (curry generate-pat lang sexp pref-prods user-gen user-acc size attempt)) + (define (generate-pat lang sexp size attempt env in-hole pat) + (define recur (curry generate-pat lang sexp size attempt)) (define recur/pat (recur env in-hole)) (define ((recur/pat/size-attempt pat) size attempt) - (generate-pat lang sexp pref-prods user-gen user-acc size attempt env in-hole pat)) + (generate-pat lang sexp size attempt env in-hole pat)) (define clang (rg-lang-clang lang)) (define gen-nt (generate-nt clang (rg-lang-base-cases lang) - (curry generate-pat lang sexp pref-prods user-gen user-acc) - pref-prods)) + (curry generate-pat lang sexp))) - (define (default-gen user-acc) - (match pat - [`number (values ((next-number-decision) attempt) env)] - [`natural (values ((next-natural-decision) attempt) env)] - [`integer (values ((next-integer-decision) attempt) env)] - [`real (values ((next-real-decision) attempt) env)] - [`(variable-except ,vars ...) - (generate/pred 'variable - (recur/pat/size-attempt 'variable) - (λ (var _) (not (memq var vars))) - size attempt)] - [`variable - (values ((next-variable-decision) (rg-lang-lits lang) attempt) - env)] - [`variable-not-otherwise-mentioned - (generate/pred 'variable - (recur/pat/size-attempt 'variable) - (λ (var _) (not (memq var (compiled-lang-literals clang)))) - size attempt)] - [`(variable-prefix ,prefix) - (define (symbol-append prefix suffix) - (string->symbol (string-append (symbol->string prefix) (symbol->string suffix)))) - (let-values ([(term env) (recur/pat 'variable)]) - (values (symbol-append prefix term) env))] - [`string - (values ((next-string-decision) (rg-lang-lits lang) attempt) - env)] - [`(side-condition ,pat ,(? procedure? condition) ,guard-src-loc) - (generate/pred `(side-condition ,(unparse-pattern pat) ,guard-src-loc) - (recur/pat/size-attempt pat) - (λ (_ env) (condition (bindings env))) - size attempt)] - [`(name ,(? symbol? id) ,p) - (let-values ([(term env) (recur/pat p)]) - (values term (hash-set env (make-binder id) term)))] - [`hole (values in-hole env)] - [`(in-hole ,context ,contractum) - (let-values ([(term env) (recur/pat contractum)]) - (recur env term context))] - [`(hide-hole ,pattern) (recur env the-hole pattern)] - [`any - (let*-values ([(new-lang nt) ((next-any-decision) lang sexp)] - ; Don't use preferred productions for the sexp language. - [(pref-prods) (if (eq? new-lang lang) pref-prods #f)] - [(term _) (generate-pat new-lang - sexp - pref-prods - user-gen - user-acc - size - attempt - empty-env - the-hole - nt)]) - (values term env))] - [(? (is-nt? clang)) - (values (gen-nt pat #f size attempt in-hole env) env)] - [(struct binder ((or (? (is-nt? clang) nt) - (app (symbol-match named-nt-rx) (? (is-nt? clang) nt))))) - (generate/prior pat env (λ () (recur/pat nt)))] - [(struct binder ((or (? built-in? b) - (app (symbol-match named-nt-rx) (? built-in? b))))) - (generate/prior pat env (λ () (recur/pat b)))] - [(struct mismatch (name (app (symbol-match mismatch-nt-rx) - (? symbol? (? (is-nt? clang) nt))))) - (let-values ([(term _) (recur/pat nt)]) - (values term (hash-set env pat term)))] - [(struct mismatch (name (app (symbol-match mismatch-nt-rx) - (? symbol? (? built-in? b))))) - (let-values ([(term _) (recur/pat b)]) - (values term (hash-set env pat term)))] - [`(cross ,(? symbol? cross-nt)) - (values (gen-nt cross-nt #t size attempt in-hole env) env)] - [(or (? symbol?) (? number?) (? string?) (? boolean?) (? null?)) (values pat env)] - [(list-rest (and (struct ellipsis (name sub-pat class vars)) ellipsis) rest) - (let*-values ([(length) (let ([prior (hash-ref env class #f)]) - (if prior prior ((next-sequence-decision) attempt)))] - [(seq env) (generate-sequence ellipsis recur env length)] - [(rest env) (recur (hash-set (hash-set env class length) name length) - in-hole rest)]) - (values (append seq rest) env))] - [(list-rest pat rest) - (let*-values - ([(pat-term env) (recur/pat pat)] - [(rest-term env) (recur env in-hole rest)]) - (values (cons pat-term rest-term) env))] - [else - (error what "unknown pattern ~s\n" pat)])) - - (user-gen - pat size in-hole user-acc env attempt - (λ (pat #:size [size size] #:contractum [in-hole in-hole] #:acc [user-acc user-acc] #:env [env env]) - (generate-pat lang sexp pref-prods user-gen user-acc size attempt env in-hole pat)) - default-gen)) + (match pat + [`number (values ((next-number-decision) attempt) env)] + [`natural (values ((next-natural-decision) attempt) env)] + [`integer (values ((next-integer-decision) attempt) env)] + [`real (values ((next-real-decision) attempt) env)] + [`(variable-except ,vars ...) + (generate/pred 'variable + (recur/pat/size-attempt 'variable) + (λ (var _) (not (memq var vars))) + size attempt)] + [`variable + (values ((next-variable-decision) (rg-lang-lits lang) attempt) + env)] + [`variable-not-otherwise-mentioned + (generate/pred 'variable + (recur/pat/size-attempt 'variable) + (λ (var _) (not (memq var (compiled-lang-literals clang)))) + size attempt)] + [`(variable-prefix ,prefix) + (define (symbol-append prefix suffix) + (string->symbol (string-append (symbol->string prefix) (symbol->string suffix)))) + (let-values ([(term env) (recur/pat 'variable)]) + (values (symbol-append prefix term) env))] + [`string + (values ((next-string-decision) (rg-lang-lits lang) attempt) + env)] + [`(side-condition ,pat ,(? procedure? condition) ,guard-src-loc) + (generate/pred `(side-condition ,(unparse-pattern pat) ,guard-src-loc) + (recur/pat/size-attempt pat) + (λ (_ env) (condition (bindings env))) + size attempt)] + [`(name ,(? symbol? id) ,p) + (let-values ([(term env) (recur/pat p)]) + (values term (hash-set env (make-binder id) term)))] + [`hole (values in-hole env)] + [`(in-hole ,context ,contractum) + (let-values ([(term env) (recur/pat contractum)]) + (recur env term context))] + [`(hide-hole ,pattern) (recur env the-hole pattern)] + [`any + (let*-values ([(new-lang nt) ((next-any-decision) lang sexp)] + [(term _) (generate-pat new-lang + sexp + size + attempt + empty-env + the-hole + nt)]) + (values term env))] + [(? (is-nt? clang)) + (values (gen-nt pat #f size attempt in-hole env) env)] + [(struct binder ((or (? (is-nt? clang) nt) + (app (symbol-match named-nt-rx) (? (is-nt? clang) nt))))) + (generate/prior pat env (λ () (recur/pat nt)))] + [(struct binder ((or (? built-in? b) + (app (symbol-match named-nt-rx) (? built-in? b))))) + (generate/prior pat env (λ () (recur/pat b)))] + [(struct mismatch (name (app (symbol-match mismatch-nt-rx) + (? symbol? (? (is-nt? clang) nt))))) + (let-values ([(term _) (recur/pat nt)]) + (values term (hash-set env pat term)))] + [(struct mismatch (name (app (symbol-match mismatch-nt-rx) + (? symbol? (? built-in? b))))) + (let-values ([(term _) (recur/pat b)]) + (values term (hash-set env pat term)))] + [`(cross ,(? symbol? cross-nt)) + (values (gen-nt cross-nt #t size attempt in-hole env) env)] + [(or (? symbol?) (? number?) (? string?) (? boolean?) (? null?)) (values pat env)] + [(list-rest (and (struct ellipsis (name sub-pat class vars)) ellipsis) rest) + (let*-values ([(length) (let ([prior (hash-ref env class #f)]) + (if prior prior ((next-sequence-decision) attempt)))] + [(seq env) (generate-sequence ellipsis recur env length)] + [(rest env) (recur (hash-set (hash-set env class length) name length) + in-hole rest)]) + (values (append seq rest) env))] + [(list-rest pat rest) + (let*-values + ([(pat-term env) (recur/pat pat)] + [(rest-term env) (recur env in-hole rest)]) + (values (cons pat-term rest-term) env))] + [else + (error what "unknown pattern ~s\n" pat)])) (let ([rg-lang (prepare-lang lang)] [rg-sexp (prepare-lang sexp)]) @@ -400,9 +362,6 @@ (generate-pat rg-lang rg-sexp - ((next-pref-prods-decision) (rg-lang-clang rg-lang)) - user-gen - #f size attempt empty-env @@ -684,26 +643,24 @@ (define (defer-all pat size in-hole acc env att recur defer) (defer acc)) -(define-for-syntax (term-generator lang pat decisions@ custom retries what) +(define-for-syntax (term-generator lang pat decisions@ retries what) (with-syntax ([pattern (rewrite-side-conditions/check-errs (language-id-nts lang what) what #t pat)]) - #`((generate #,lang #,decisions@ #,custom #,retries '#,what) `pattern))) + #`((generate #,lang #,decisions@ #,retries '#,what) `pattern))) (define-syntax (generate-term stx) (syntax-case stx () [(_ lang pat size . kw-args) - (with-syntax ([(attempt retries custom) + (with-syntax ([(attempt retries) (parse-kw-args `((#:attempt . 1) - (#:retries . ,#'default-retries) - (#:custom . ,#'defer-all)) + (#:retries . ,#'default-retries)) (syntax kw-args) stx)]) (with-syntax ([generate (term-generator #'lang #'pat #'(generation-decisions) - #'custom #'retries 'generate-term)]) (syntax/loc stx @@ -734,12 +691,11 @@ (let-values ([(names names/ellipses) (extract-names (language-id-nts #'lang 'redex-check) 'redex-check #t #'pat)] - [(attempts-stx source-stx retries-stx custom-stx) + [(attempts-stx source-stx retries-stx) (apply values (parse-kw-args `((#:attempts . ,#'default-check-attempts) (#:source . #f) - (#:retries . ,#'default-retries) - (#:custom . ,#'defer-all)) + (#:retries . ,#'default-retries)) (syntax kw-args) stx))]) (with-syntax ([(name ...) names] @@ -751,18 +707,7 @@ property)))]) (quasisyntax/loc stx (let ([att (assert-nat 'redex-check #,attempts-stx)] - [ret (assert-nat 'redex-check #,retries-stx)] - [custom (contract - (-> any/c natural-number/c any/c any/c hash? natural-number/c - (->* (any/c) - (#:size natural-number/c - #:contractum any/c - #:acc any/c - #:env hash?) - (values any/c hash?)) - (-> any/c (values any/c hash?)) - (values any/c hash?)) - #,custom-stx '+ '-)]) + [ret (assert-nat 'redex-check #,retries-stx)]) (unsyntax (if source-stx #`(let-values ([(metafunc/red-rel num-cases) @@ -776,7 +721,6 @@ metafunc/red-rel property random-decisions@ - custom (max 1 (floor (/ att num-cases))) ret 'redex-check @@ -784,7 +728,7 @@ (test-match lang pat) (λ (generated) (redex-error 'redex-check "~s does not match ~s" generated 'pat)))) #`(check-prop - #,(term-generator #'lang #'pat #'random-decisions@ #'custom #'ret 'redex-check) + #,(term-generator #'lang #'pat #'random-decisions@ #'ret 'redex-check) property att show))) (void))))))])) @@ -831,10 +775,9 @@ [(_ name . kw-args) (identifier? #'name) (with-syntax ([m (metafunc/err #'name stx)] - [(attempts retries custom) + [(attempts retries) (parse-kw-args `((#:attempts . ,#'default-check-attempts) - (#:retries . ,#'default-retries) - (#:custom . ,#'defer-all)) + (#:retries . ,#'default-retries)) (syntax kw-args) stx)] [show (show-message stx)]) @@ -844,7 +787,7 @@ [decisions@ (generation-decisions)] [att (assert-nat 'check-metafunction-contract attempts)]) (check-prop - ((generate lang decisions@ custom retries 'check-metafunction-contract) + ((generate lang decisions@ retries 'check-metafunction-contract) (if dom dom '(any (... ...)))) (λ (t _) (with-handlers ([exn:fail:redex? (λ (_) #f)]) @@ -852,10 +795,10 @@ att show))))])) -(define (check-lhs-pats lang mf/rr prop decisions@ custom attempts retries what show +(define (check-lhs-pats lang mf/rr prop decisions@ attempts retries what show [match #f] [match-fail #f]) - (let ([lang-gen (generate lang decisions@ custom retries what)]) + (let ([lang-gen (generate lang decisions@ retries what)]) (let-values ([(pats srcs) (cond [(metafunc-proc? mf/rr) (values (map metafunc-case-lhs-pat (metafunc-proc-cases mf/rr)) @@ -884,10 +827,9 @@ (syntax-case stx () [(_ name property . kw-args) (with-syntax ([m (metafunc/err #'name stx)] - [(attempts retries custom) + [(attempts retries) (parse-kw-args `((#:attempts . , #'default-check-attempts) - (#:retries . ,#'default-retries) - (#:custm . ,#'defer-all)) + (#:retries . ,#'default-retries)) (syntax kw-args) stx)] [show (show-message stx)]) @@ -899,7 +841,6 @@ m (λ (term _) (property term)) (generation-decisions) - custom att ret 'check-metafunction @@ -917,11 +858,10 @@ (define-syntax (check-reduction-relation stx) (syntax-case stx () [(_ relation property . kw-args) - (with-syntax ([(attempts retries decisions@ custom) + (with-syntax ([(attempts retries decisions@) (parse-kw-args `((#:attempts . , #'default-check-attempts) (#:retries . ,#'default-retries) - (#:decisions . ,#'random-decisions@) - (#:custom . ,#'defer-all)) + (#:decisions . ,#'random-decisions@)) (syntax kw-args) stx)] [show (show-message stx)]) @@ -934,7 +874,6 @@ rel (λ (term _) (property term)) decisions@ - custom attempts retries 'check-reduction-relation @@ -949,8 +888,7 @@ next-non-terminal-decision next-sequence-decision next-any-decision - next-string-decision - next-pref-prods-decision)) + next-string-decision)) (define random-decisions@ (unit (import) (export decisions^) @@ -959,11 +897,10 @@ (define (next-natural-decision) pick-natural) (define (next-integer-decision) pick-integer) (define (next-real-decision) pick-real) - (define (next-non-terminal-decision) pick-nt) + (define (next-non-terminal-decision) pick-nts) (define (next-sequence-decision) pick-sequence-length) (define (next-any-decision) pick-any) - (define (next-string-decision) pick-string) - (define (next-pref-prods-decision) pick-preferred-productions))) + (define (next-string-decision) pick-string))) (define generation-decisions (make-parameter random-decisions@)) @@ -978,19 +915,16 @@ (struct-out mismatch) (struct-out class) (struct-out binder) - (struct-out base-cases) - (struct-out pref-prods)) + (struct-out base-cases)) -(provide pick-from-list pick-sequence-length - pick-char pick-var pick-string - pick-nt pick-any pick-preferred-productions +(provide pick-from-list pick-sequence-length pick-nts + pick-char pick-var pick-string pick-any pick-number pick-natural pick-integer pick-real parse-pattern unparse-pattern parse-language prepare-lang class-reassignments reassign-classes default-retries proportion-at-size - preferred-production-threshold retry-threshold - proportion-before-threshold post-threshold-incr + retry-threshold proportion-before-threshold post-threshold-incr is-nt? nt-by-name min-prods generation-decisions decisions^ random-string diff --git a/collects/redex/tests/rg-test.ss b/collects/redex/tests/rg-test.ss index c33928d593..af11812cef 100644 --- a/collects/redex/tests/rg-test.ss +++ b/collects/redex/tests/rg-test.ss @@ -111,23 +111,6 @@ (test (pick-string lits 0 (make-random .5 1 0 1 1 1 2 1)) "abc") (test (pick-var lits 0 (make-random .01 1 0 1 1 1 2 1)) 'abc)) -(let () - (define-language L - (a 5 (x a)) - (b 4)) - (test (pick-nt 'a #f L 1 'dontcare) - (nt-rhs (car (compiled-lang-lang L)))) - (test (pick-nt 'a #f L preferred-production-threshold 'dontcare (make-random 1)) - (nt-rhs (car (compiled-lang-lang L)))) - (let ([pref (car (nt-rhs (car (compiled-lang-lang L))))]) - (test (pick-nt 'a #f L preferred-production-threshold - (make-pref-prods 'dont-care - (make-immutable-hash `((a ,pref)))) - (make-random 0)) - (list pref))) - (test (pick-nt 'b #f L preferred-production-threshold #f) - (nt-rhs (cadr (compiled-lang-lang L))))) - (define-syntax raised-exn-msg (syntax-rules () [(_ expr) (raised-exn-msg exn:fail? expr)] @@ -141,7 +124,7 @@ (define (patterns . selectors) (map (λ (selector) - (λ (name cross? lang size pref-prods) + (λ (name cross? lang sizes) (list (selector (nt-rhs (nt-by-name lang name cross?)))))) selectors)) @@ -158,15 +141,14 @@ (test (raised-exn-msg (iter)) #rx"empty")) (define (decisions #:var [var pick-var] - #:nt [nt pick-nt] + #:nt [nt pick-nts] #:str [str pick-string] #:num [num pick-number] #:nat [nat pick-natural] #:int [int pick-integer] #:real [real pick-real] #:any [any pick-any] - #:seq [seq pick-sequence-length] - #:pref [pref pick-preferred-productions]) + #:seq [seq pick-sequence-length]) (define-syntax decision (syntax-rules () [(_ d) (if (procedure? d) (λ () d) (iterator (quote d) d))])) @@ -179,8 +161,7 @@ (define next-real-decision (decision real)) (define next-string-decision (decision str)) (define next-any-decision (decision any)) - (define next-sequence-decision (decision seq)) - (define next-pref-prods-decision (decision pref)))) + (define next-sequence-decision (decision seq)))) (define-syntax generate-term/decisions (syntax-rules () @@ -539,71 +520,6 @@ (get-output-string p) (close-output-port p)))) -;; preferred productions -(let ([make-pick-nt (λ opt (λ req (apply pick-nt (append req opt))))]) - (define-language L - (e (+ e e) (* e e) 7)) - (define-language M (e 0) (e-e 1)) - - (let ([pats (λ (L) (nt-rhs (car (compiled-lang-lang L))))]) - (test - (generate-term/decisions - L e 2 preferred-production-threshold - (decisions #:pref (list (λ (L) (make-pref-prods - 'dont-care - (make-immutable-hash `((e ,(car (pats L)))))))) - #:nt (make-pick-nt (make-random 0 0 0)))) - '(+ (+ 7 7) (+ 7 7))) - (test - (generate-term/decisions - L any 2 preferred-production-threshold - (decisions #:nt (patterns first) - #:var (list (λ _ 'x)) - #:any (list (λ (lang sexp) (values sexp 'sexp))))) - 'x) - (test - (generate-term/decisions - L any 2 preferred-production-threshold - (decisions #:pref (list (λ (L) (make-pref-prods - 'dont-care - (make-immutable-hash `((e ,(car (pats L)))))))) - #:nt (make-pick-nt (make-random 0 0 0)) - #:any (list (λ (lang sexp) (values lang 'e))))) - '(+ (+ 7 7) (+ 7 7))) - (test - (generate-term/decisions - M (cross e) 2 preferred-production-threshold - (decisions #:nt (make-pick-nt (make-random) (λ (att rand) #t)))) - (term hole)) - (test - (generate-term/decisions - M e-e 2 preferred-production-threshold - (decisions #:nt (make-pick-nt (make-random) (λ (att rand) #t)))) - 1) - - (test - (let ([generated null]) - (output - (λ () - (check-reduction-relation - (reduction-relation L (--> e e)) - (λ (t) (set! generated (cons t generated))) - #:decisions (decisions #:nt (make-pick-nt (make-random) - (λ (att rand) #t)) - #:pref (list (λ (_) 'dontcare) - (λ (_) 'dontcare) - (λ (_) 'dontcare) - ; size 0 terms prior to this attempt - (λ (L) (make-pref-prods - 'dont-care - (make-immutable-hash `((e ,(car (pats L))))))) - (λ (L) (make-pref-prods - 'dont-care - (make-immutable-hash `((e ,(cadr (pats L))))))))) - #:attempts 5))) - generated) - '((* 7 7) (+ 7 7) 7 7 7)))) - ;; redex-check (let () (define-language lang @@ -890,89 +806,6 @@ (check-metafunction n (λ (_) #t) #:retries 42)) #rx"check-metafunction: unable .* in 42")) -;; custom generators -(let () - (define-language L - (x variable)) - - (test - (generate-term - L x_1 0 - #:custom (λ (pat sz i-h acc env att rec def) - (match pat - ['x (values 'x env)] - [_ (def acc)]))) - 'x) - (test - (let/ec k - (equal? - (generate-term - L (x x) 0 - #:custom (let ([once? #f]) - (λ (pat sz i-h acc env att rec def) - (match pat - ['x (if once? - (k #f) - (begin - (set! once? #t) - (values 'x env)))] - [_ (def acc)])))) - '(x x))) - #t) - - (test - (hash-ref - (let/ec k - (generate-term - L (x (x)) 0 - #:custom (λ (pat sz i-h acc env att rec def) - (match pat - [(struct binder ('x)) - (values 'y (hash-set env pat 'y))] - [(list (struct binder ('x))) (k env)] - [_ (def acc)])))) - (make-binder 'x)) - 'y) - - (test - (generate-term - L (in-hole hole 7) 0 - #:custom (λ (pat sz i-h acc env att rec def) - (match pat - [`(in-hole hole 7) - (rec 'hole #:contractum 7)] - [_ (def acc)]))) - 7) - - (test - (let/ec k - (generate-term - L any 10 - #:attempt 42 - #:custom (λ (pat sz i-h acc env att rec def) (k (list sz att))))) - '(10 42)) - - (test - (let/ec k - (generate-term - L x 10 - #:custom (λ (pat sz i-h acc env att rec def) - (match pat - ['x (rec 7 #:size 0)] - [7 (k sz)] - [_ (def att)])))) - 0) - - (test - (generate-term - L (q 7) 0 - #:custom (λ (pat sz i-h acc env att rec def) - (match pat - ['q (rec '(7 7) #:acc 8)] - [7 (values (or acc 7) env)] - [_ (def att)]))) - '((8 8) 7))) - ;; parse/unparse-pattern (let-syntax ([test-match (syntax-rules () [(_ p x) (test (match x [p #t] [_ #f]) #t)])]) (define-language lang (x variable)) From 0cea5eb3901d49688d5193e6e508e1ea7e6fa832 Mon Sep 17 00:00:00 2001 From: Ryan Culpepper Date: Wed, 27 Jan 2010 17:31:22 +0000 Subject: [PATCH 082/113] macro-debugger: fixed breakage of stepper-text, expand-only Please propagate to release branch if possible. svn: r17852 --- collects/macro-debugger/expand.ss | 2 +- collects/macro-debugger/stepper-text.ss | 9 +-------- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/collects/macro-debugger/expand.ss b/collects/macro-debugger/expand.ss index 29f6d772ef..48d4c22007 100644 --- a/collects/macro-debugger/expand.ss +++ b/collects/macro-debugger/expand.ss @@ -25,7 +25,7 @@ (define (expand/show-predicate stx show?) (let-values ([(result deriv) (trace/result stx)]) (when (exn? result) (raise result)) - (let-values ([(_steps _uses stx exn2) + (let-values ([(_steps _defs _uses stx exn2) (parameterize ((macro-policy show?)) (reductions+ deriv))]) (when (exn? exn2) (raise exn2)) diff --git a/collects/macro-debugger/stepper-text.ss b/collects/macro-debugger/stepper-text.ss index 3df8213c8b..327b52a72c 100644 --- a/collects/macro-debugger/stepper-text.ss +++ b/collects/macro-debugger/stepper-text.ss @@ -93,13 +93,6 @@ ((if display-like? display write) (syntax-dummy-val obj) port)] [else (error 'pretty-print-hook "unexpected special value: ~e" obj)])) - (define (pp-extend-style-table) - (let* ([ids identifier-list] - [syms (map (lambda (x) (hash-ref stx=>flat x)) ids)] - [like-syms (map syntax-e ids)]) - (pretty-print-extend-style-table (pp-better-style-table) - syms - like-syms))) (define (pp-better-style-table) (pretty-print-extend-style-table (pretty-print-current-style-table) (map car extended-style-list) @@ -107,7 +100,7 @@ (parameterize ([pretty-print-size-hook pp-size-hook] [pretty-print-print-hook pp-print-hook] - [pretty-print-current-style-table (pp-extend-style-table)]) + [pretty-print-current-style-table (pp-better-style-table)]) (pretty-print/defaults datum))) (define (->show-function show) From 8454db8115070029d047427be772ef4c3e1df6f8 Mon Sep 17 00:00:00 2001 From: Casey Klein Date: Wed, 27 Jan 2010 17:45:01 +0000 Subject: [PATCH 083/113] Rename #:attempts to #:attempt-num in `generate-term'. Added a second form of `generate-term' that produces a procedure. Improved the docs for `generate-term'. svn: r17853 --- collects/redex/private/rg.ss | 86 +++++++++++++++-------------- collects/redex/redex.scrbl | 33 ++++++----- collects/redex/tests/rg-test.ss | 15 +++-- doc/release-notes/redex/HISTORY.txt | 2 + 4 files changed, 79 insertions(+), 57 deletions(-) diff --git a/collects/redex/private/rg.ss b/collects/redex/private/rg.ss index b335676808..0a29eccc60 100644 --- a/collects/redex/private/rg.ss +++ b/collects/redex/private/rg.ss @@ -152,11 +152,11 @@ who what attempts (if (= attempts 1) "" "s"))]) (raise (make-exn:fail:redex:generation-failure str (current-continuation-marks))))) -(define (generate lang decisions@ retries what) +(define (generate lang decisions@ what) (define-values/invoke-unit decisions@ (import) (export decisions^)) - (define ((generate-nt lang base-cases generate) + (define ((generate-nt lang base-cases generate retries) name cross? size attempt in-hole env) (let*-values ([(term _) @@ -171,7 +171,7 @@ ((next-non-terminal-decision) name cross? lang attempt)))]) (generate (max 0 (sub1 size)) attempt empty-env in-hole (rhs-pattern rhs)))) (λ (_ env) (mismatches-satisfied? env)) - size attempt)]) + size attempt retries)]) term)) (define (generate-sequence ellipsis generate env length) @@ -197,18 +197,18 @@ (values (cons term terms) (cons env envs)))))]) (values seq (merge-environments envs)))) - (define (generate/pred name gen pred init-sz init-att) + (define (generate/pred name gen pred init-sz init-att retries) (let ([pre-threshold-incr (ceiling (/ (- retry-threshold init-att) - (* proportion-before-threshold retries)))] + (* proportion-before-threshold (add1 retries))))] [incr-size? (λ (remain) (zero? (modulo (sub1 remain) (ceiling (* proportion-at-size retries)))))]) - (let retry ([remaining retries] + (let retry ([remaining (add1 retries)] [size init-sz] [attempt init-att]) (if (zero? remaining) @@ -254,18 +254,19 @@ (cons (make-bind (binder-name key) val) bindings) bindings)))) - (define (generate-pat lang sexp size attempt env in-hole pat) - (define recur (curry generate-pat lang sexp size attempt)) + (define (generate-pat lang sexp retries size attempt env in-hole pat) + (define recur (curry generate-pat lang sexp retries size attempt)) (define recur/pat (recur env in-hole)) (define ((recur/pat/size-attempt pat) size attempt) - (generate-pat lang sexp size attempt env in-hole pat)) + (generate-pat lang sexp retries size attempt env in-hole pat)) (define clang (rg-lang-clang lang)) (define gen-nt (generate-nt clang (rg-lang-base-cases lang) - (curry generate-pat lang sexp))) + (curry generate-pat lang sexp retries) + retries)) (match pat [`number (values ((next-number-decision) attempt) env)] @@ -276,7 +277,7 @@ (generate/pred 'variable (recur/pat/size-attempt 'variable) (λ (var _) (not (memq var vars))) - size attempt)] + size attempt retries)] [`variable (values ((next-variable-decision) (rg-lang-lits lang) attempt) env)] @@ -284,7 +285,7 @@ (generate/pred 'variable (recur/pat/size-attempt 'variable) (λ (var _) (not (memq var (compiled-lang-literals clang)))) - size attempt)] + size attempt retries)] [`(variable-prefix ,prefix) (define (symbol-append prefix suffix) (string->symbol (string-append (symbol->string prefix) (symbol->string suffix)))) @@ -297,7 +298,7 @@ (generate/pred `(side-condition ,(unparse-pattern pat) ,guard-src-loc) (recur/pat/size-attempt pat) (λ (_ env) (condition (bindings env))) - size attempt)] + size attempt retries)] [`(name ,(? symbol? id) ,p) (let-values ([(term env) (recur/pat p)]) (values term (hash-set env (make-binder id) term)))] @@ -310,6 +311,7 @@ (let*-values ([(new-lang nt) ((next-any-decision) lang sexp)] [(term _) (generate-pat new-lang sexp + retries size attempt empty-env @@ -354,7 +356,7 @@ [rg-sexp (prepare-lang sexp)]) (λ (pat) (let ([parsed (reassign-classes (parse-pattern pat lang 'top-level))]) - (λ (size attempt) + (λ (size attempt retries) (let-values ([(term env) (generate/pred pat @@ -362,13 +364,14 @@ (generate-pat rg-lang rg-sexp + retries size attempt empty-env the-hole parsed)) (λ (_ env) (mismatches-satisfied? env)) - size attempt)]) + size attempt retries)]) (values term (bindings env)))))))) (define-struct base-cases (cross non-cross)) @@ -640,34 +643,35 @@ x (raise-type-error 'redex-check "reduction-relation" x))) -(define (defer-all pat size in-hole acc env att recur defer) - (defer acc)) - -(define-for-syntax (term-generator lang pat decisions@ retries what) +(define-for-syntax (term-generator lang pat decisions@ what) (with-syntax ([pattern (rewrite-side-conditions/check-errs (language-id-nts lang what) what #t pat)]) - #`((generate #,lang #,decisions@ #,retries '#,what) `pattern))) + #`((generate #,lang #,decisions@ '#,what) `pattern))) (define-syntax (generate-term stx) (syntax-case stx () - [(_ lang pat size . kw-args) + [(name lang pat size . kw-args) (with-syntax ([(attempt retries) - (parse-kw-args `((#:attempt . 1) + (parse-kw-args `((#:attempt-num . 1) (#:retries . ,#'default-retries)) (syntax kw-args) stx)]) - (with-syntax ([generate (term-generator #'lang - #'pat - #'(generation-decisions) - #'retries - 'generate-term)]) - (syntax/loc stx - (let-values ([(term _) (generate size attempt)]) - term))))] - [(_ lang pat size) - (syntax/loc stx (generate-term lang pat size #:attempt 1))])) + (syntax/loc stx + ((generate-term lang pat) size #:attempt-num attempt #:retries retries)))] + [(name lang pat) + (with-syntax ([make-gen (term-generator #'lang + #'pat + #'(generation-decisions) + #'name)]) + (syntax/loc stx + (let ([generate make-gen]) + (λ (size #:attempt-num [attempt-num 1] #:retries [retries default-retries]) + (let ([att (assert-nat 'name attempt-num)] + [ret (assert-nat 'name retries)]) + (let-values ([(term _) (generate size att ret)]) + term))))))])) (define-for-syntax (show-message stx) (syntax-case stx () @@ -728,19 +732,19 @@ (test-match lang pat) (λ (generated) (redex-error 'redex-check "~s does not match ~s" generated 'pat)))) #`(check-prop - #,(term-generator #'lang #'pat #'random-decisions@ #'ret 'redex-check) - property att show))) + #,(term-generator #'lang #'pat #'random-decisions@ 'redex-check) + property att ret show))) (void))))))])) (define (format-attempts a) (format "~a attempt~a" a (if (= 1 a) "" "s"))) -(define (check-prop generator property attempts show) - (when (check generator property attempts show) +(define (check-prop generator property attempts retries show) + (when (check generator property attempts retries show) (show (format "no counterexamples in ~a\n" (format-attempts attempts))))) -(define (check generator property attempts show +(define (check generator property attempts retries show #:source [source #f] #:match [match #f] #:match-fail [match-fail #f]) @@ -748,7 +752,7 @@ (if (zero? remaining) #t (let ([attempt (add1 (- attempts remaining))]) - (let-values ([(term bindings) (generator (attempt->size attempt) attempt)]) + (let-values ([(term bindings) (generator (attempt->size attempt) attempt retries)]) (if (andmap (λ (bindings) (with-handlers ([exn:fail? @@ -787,18 +791,19 @@ [decisions@ (generation-decisions)] [att (assert-nat 'check-metafunction-contract attempts)]) (check-prop - ((generate lang decisions@ retries 'check-metafunction-contract) + ((generate lang decisions@ 'check-metafunction-contract) (if dom dom '(any (... ...)))) (λ (t _) (with-handlers ([exn:fail:redex? (λ (_) #f)]) (begin (term (name ,@t)) #t))) att + retries show))))])) (define (check-lhs-pats lang mf/rr prop decisions@ attempts retries what show [match #f] [match-fail #f]) - (let ([lang-gen (generate lang decisions@ retries what)]) + (let ([lang-gen (generate lang decisions@ what)]) (let-values ([(pats srcs) (cond [(metafunc-proc? mf/rr) (values (map metafunc-case-lhs-pat (metafunc-proc-cases mf/rr)) @@ -815,6 +820,7 @@ (lang-gen pat) prop attempts + retries show #:source src #:match match diff --git a/collects/redex/redex.scrbl b/collects/redex/redex.scrbl index a66ca1287a..9eb594b227 100644 --- a/collects/redex/redex.scrbl +++ b/collects/redex/redex.scrbl @@ -1127,30 +1127,37 @@ metafunctions or unnamed reduction-relation cases) to application counts.} (values (covered-cases equals-coverage) (covered-cases plus-coverage))))] -@defform/subs[(generate-term language @#,ttpattern size-exp kw-args ...) - ([kw-args (code:line #:attempts attempts-expr) +@defform*/subs[[(generate-term language @#,ttpattern size-expr kw-args ...) + (generate-term language @#,ttpattern)] + ([kw-args (code:line #:attempt-num attempts-expr) (code:line #:retries retries-expr)]) #:contracts ([size-expr natural-number/c] [attempt-num-expr natural-number/c] [retries-expr natural-number/c])]{ -Generates a random term matching @scheme[pattern] (in the given language). + +In its first form, @scheme[generate-term] produces a random term matching +the given pattern (according to the given language). In its second, +@scheme[generate-term] produces a procedure for constructing the same. +This procedure expects @scheme[size-expr] (below) as its sole positional +argument and allows the same optional keyword arguments as the first form. +The second form may be more efficient when generating many terms. The argument @scheme[size-expr] bounds the height of the generated term -(measured as the height of the derivation tree used to produce -the term). +(measured as the height of its parse tree). The optional keyword argument @scheme[attempt-num-expr] (default @scheme[1]) provides coarse grained control over the random -decisions made during generation. For example, the expected length of -@pattech[pattern-sequence]s increases with @scheme[attempt-num-expr]. +decisions made during generation; increasing @scheme[attempt-num-expr] +tends to increase the complexity of the result. For example, the expected +length of @pattech[pattern-sequence]s increases with @scheme[attempt-num-expr]. The random generation process does not actively consider the constraints -imposed by @pattech[side-condition] or @tt{_!_} @|pattern|s when -constructing a term; instead, it tests the satisfaction of -such constraints after it freely generates the relevant portion of the -sub-term---regenerating the sub-term if necessary. The optional keyword -argument @scheme[retries-expr] (default @scheme[100]) bounds the number of times that -@scheme[generate-term] retries the generation of any sub-term. If +imposed by @pattech[side-condition] or @tt{_!_} @|pattern|s; instead, +it uses a ``guess and check'' strategy in which it freely generates +candidate terms then tests whether they happen to satisfy the constraints, +repeating as necessary. The optional keyword argument @scheme[retries-expr] +(default @scheme[100]) bounds the number of times that +@scheme[generate-term] retries the generation of any pattern. If @scheme[generate-term] is unable to produce a satisfying term after @scheme[retries-expr] attempts, it raises an exception recognized by @scheme[exn:fail:redex:generation-failure?].} diff --git a/collects/redex/tests/rg-test.ss b/collects/redex/tests/rg-test.ss index af11812cef..881d82bb74 100644 --- a/collects/redex/tests/rg-test.ss +++ b/collects/redex/tests/rg-test.ss @@ -167,7 +167,7 @@ (syntax-rules () [(_ lang pat size attempt decisions) (parameterize ([generation-decisions decisions]) - (generate-term lang pat size #:attempt attempt))])) + (generate-term lang pat size #:attempt-num attempt))])) (let () (define-language lc @@ -197,6 +197,13 @@ #:var (list (λ _ 'x) (λ _ 'y)))) '(x y))) +(let () + (define-language L + (n 1)) + (test ((generate-term L n) 0) 1) + (test ((generate-term L n) 0 #:retries 0) 1) + (test ((generate-term L n) 0 #:attempt-num 0) 1)) + ;; variable-except pattern (let () (define-language var @@ -212,17 +219,17 @@ (n natural) (i integer) (r real)) - (test (let ([n (generate-term L n 0 #:attempt 10000)]) + (test (let ([n (generate-term L n 0 #:attempt-num 10000)]) (and (integer? n) (exact? n) (not (negative? n)))) #t) (test (generate-term/decisions L n 0 1 (decisions #:nat (λ (_) 42))) 42) - (test (let ([i (generate-term L i 0 #:attempt 10000)]) + (test (let ([i (generate-term L i 0 #:attempt-num 10000)]) (and (integer? i) (exact? i))) #t) (test (generate-term/decisions L i 0 1 (decisions #:int (λ (_) -42))) -42) - (test (real? (generate-term L r 0 #:attempt 10000)) #t) + (test (real? (generate-term L r 0 #:attempt-num 10000)) #t) (test (generate-term/decisions L r 0 1 (decisions #:real (λ (_) 4.2))) 4.2)) (let () diff --git a/doc/release-notes/redex/HISTORY.txt b/doc/release-notes/redex/HISTORY.txt index df047febe0..8ade9006d4 100644 --- a/doc/release-notes/redex/HISTORY.txt +++ b/doc/release-notes/redex/HISTORY.txt @@ -1,3 +1,5 @@ + * Renamed the #:attempts keyword #:attempt-num in the `generate-term' form + v4.2.4 * minor bug fixes From 97a04321fc9a626df33e14fccf0a54674b28a66e Mon Sep 17 00:00:00 2001 From: Robby Findler Date: Wed, 27 Jan 2010 18:33:36 +0000 Subject: [PATCH 084/113] escape in the splash screen quits drscheme svn: r17854 --- collects/drscheme/private/drscheme-normal.ss | 1 + 1 file changed, 1 insertion(+) diff --git a/collects/drscheme/private/drscheme-normal.ss b/collects/drscheme/private/drscheme-normal.ss index 00f436a6af..fb30bed566 100644 --- a/collects/drscheme/private/drscheme-normal.ss +++ b/collects/drscheme/private/drscheme-normal.ss @@ -78,6 +78,7 @@ (set-splash-char-observer (λ (evt) (let ([ch (send evt get-key-code)]) + (when (equal? ch 'escape) (exit)) (when (char? ch) ;; as soon as something is typed, load the bitmaps (load-magic-images) From d6c94df6702138dbe52291497cfa8562bd26190b Mon Sep 17 00:00:00 2001 From: Robby Findler Date: Wed, 27 Jan 2010 19:23:37 +0000 Subject: [PATCH 085/113] changed the fonts used under linux for the bitmap test cases svn: r17855 --- collects/redex/tests/bitmap-test-util.ss | 34 ++++++++++++++++-- .../tests/bmps-unix/extended-language.png | Bin 2575 -> 2553 bytes .../redex/tests/bmps-unix/language-nox.png | Bin 3686 -> 3733 bytes collects/redex/tests/bmps-unix/language.png | Bin 6924 -> 6898 bytes collects/redex/tests/bmps-unix/lw.png | Bin 1417 -> 1428 bytes .../bmps-unix/metafunction-Name-vertical.png | Bin 4974 -> 5085 bytes .../tests/bmps-unix/metafunction-Name.png | Bin 4326 -> 4692 bytes .../redex/tests/bmps-unix/metafunction-T.png | Bin 5777 -> 5793 bytes .../redex/tests/bmps-unix/metafunction-TL.png | Bin 5082 -> 4932 bytes .../bmps-unix/metafunction-multi-arg.png | Bin 7945 -> 7648 bytes .../tests/bmps-unix/metafunction-subst.png | Bin 5646 -> 5529 bytes .../redex/tests/bmps-unix/metafunction.png | Bin 1257 -> 1183 bytes .../bmps-unix/metafunctions-multiple.png | Bin 13348 -> 13163 bytes .../tests/bmps-unix/reduction-relation.png | Bin 2174 -> 2261 bytes 14 files changed, 31 insertions(+), 3 deletions(-) diff --git a/collects/redex/tests/bitmap-test-util.ss b/collects/redex/tests/bitmap-test-util.ss index 393f50f3a8..468149ea02 100644 --- a/collects/redex/tests/bitmap-test-util.ss +++ b/collects/redex/tests/bitmap-test-util.ss @@ -20,12 +20,13 @@ [(_ test-exp bitmap-filename) #`(test/proc #,(syntax-line stx) - test-exp + (λ () test-exp) bitmap-filename)])) -(define (test/proc line-number pict raw-bitmap-filename) +(define (test/proc line-number pict-thunk raw-bitmap-filename) (set! tests (+ tests 1)) - (let* ([bitmap-filename + (let* ([pict (set-fonts/call pict-thunk)] + [bitmap-filename (build-path (format "bmps-~a" (system-type)) raw-bitmap-filename)] [old-bitmap (if (file-exists? bitmap-filename) @@ -48,6 +49,33 @@ (let ([failed-panel (make-failed-panel line-number bitmap-filename old-bitmap new-bitmap diff-bitmap)]) (set! failed (append failed (list failed-panel)))))))) +(define (set-fonts/call thunk) + (case (system-type) + [(unix) + (let ([rewrite-style + (λ (s) + (let loop ([s s]) + (cond + [(pair? s) (cons (loop (car s)) (loop (cdr s)))] + [(eq? s 'roman) (verify-face " DejaVu Serif")] + [(eq? s 'swiss) (verify-face " DejaVu Sans")] + [else s])))]) + (parameterize ([label-style (rewrite-style (label-style))] + [literal-style (rewrite-style (literal-style))] + [metafunction-style (rewrite-style (metafunction-style))] + [non-terminal-style (rewrite-style (non-terminal-style))] + [non-terminal-subscript-style (rewrite-style (non-terminal-subscript-style))] + [non-terminal-superscript-style (rewrite-style (non-terminal-superscript-style))] + [default-style (rewrite-style (default-style))]) + (thunk)))] + [else + (thunk)])) + +(define (verify-face face) + (unless (member face (get-face-list)) + (error 'verify-face "unknown face: ~s" face)) + face) + (define (compute-diffs old-bitmap new-bitmap) (let* ([w (max (send old-bitmap get-width) (send new-bitmap get-width))] diff --git a/collects/redex/tests/bmps-unix/extended-language.png b/collects/redex/tests/bmps-unix/extended-language.png index 00fd289dd05e7c05dc89b43df62cd0d6d406061c..26cbf6fb00677d876ad0c1b9733c52688008aa33 100644 GIT binary patch literal 2553 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 P00000NkvXXu0mjf&pX+< literal 2575 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 diff --git a/collects/redex/tests/bmps-unix/language-nox.png b/collects/redex/tests/bmps-unix/language-nox.png index 0cf0d7d32f55201086410799fd954073b97ddd6a..67452ef86a58d2c6d948baca8d48a489f0236ac6 100644 GIT binary patch literal 3733 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 literal 3686 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 diff --git a/collects/redex/tests/bmps-unix/language.png b/collects/redex/tests/bmps-unix/language.png index 75241bf28ef9c6c70dc3380810dffeb766503ad5..add73ae87ab578d89dfa2f524157f0e0e2bb3bd6 100644 GIT binary patch literal 6898 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 diff --git a/collects/redex/tests/bmps-unix/lw.png b/collects/redex/tests/bmps-unix/lw.png index 173a4ed6d42036a7d02e26763b80b68b3af9d97e..39ff4046138071bfbbb3abbec5fd4419415c233c 100644 GIT binary patch literal 1428 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 XUbjcAr?_;R00000NkvXXu0mjfVM?{K diff --git a/collects/redex/tests/bmps-unix/metafunction-Name-vertical.png b/collects/redex/tests/bmps-unix/metafunction-Name-vertical.png index b64e4b5bfe218d5856bd351b3b31a71ca554ea62..3698cfbc26224d3d3350882053720a208b9749e0 100644 GIT binary patch literal 5085 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 literal 4974 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 diff --git a/collects/redex/tests/bmps-unix/metafunction-Name.png b/collects/redex/tests/bmps-unix/metafunction-Name.png index 0e4d877c44bcb9270f4790940fcd5e31e7a607f2..0271369025207cd6b05896a93ff1decd2816df6b 100644 GIT binary patch literal 4692 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 UKr*e&;Q#;t07*qoM6N<$g0Sv-=Kufz diff --git a/collects/redex/tests/bmps-unix/metafunction-T.png b/collects/redex/tests/bmps-unix/metafunction-T.png index 61fb1280bab4a696272fac4955c9eb3f9930cb8b..9cf60cd64f48408124656a3f95f5fa18fd6c4dcf 100644 GIT binary patch literal 5793 zcmV;S7GCLzP)h&pi000(fNkl zXFyX)7lzLbA%qgTNEPXV6p<=Qv14xtDC+7bmQ_(#T~=i+sMuD;?uyv3V_ggADj@0# z3ZfJ#(nLU%-ja|y-w%oql0aer+0FASOwOG%=jLQ)?#!D3LkNKwG2FoQbOXfvxbRI5 zdS=i743pP08)#{(gJJS|X66pQk(DCrYN$zDMp>DgsAHI{xs8Rni8_YKdq>xcs`?fX zHSgA1Cwa_dTRL6jmH&&uIbz&Vm=#kG0D$Q%zM1qke3~q#v-oCG+N;oU%9yB}OAiiw zlAIE|#{rWt|06CXc8`O|s{RJ!d7>%5Sj6x`$eSiN?BMgq{{2DLX7wr?dDQ_X0~gC&{7ywm&iX{sdg&6+eg}#z# zxgx;%z@n|kZsnw1(c6D@VlY?1&WA(4a%P#F7E91QIcc&w}Vpd;rSHhq^ z+FNV%rz6EL=Bc;qlcWt?jNsgbnAu6e2A!X5G$9^VdH^AY6-vTJH`9ThXRNsw*=bJf+O7V3FD*R>zQ5l)X3cmu7XWAz90D!f5xYEugiZ4e0vTIPwJ~izUFOX?R8&Lm3+^n5U$vEY;1qBZenf zS8v&)iod3rc*gY^Xf`U~!hspu0?#(Y^cY>99AbJe;ynj3Jo%0l(rzF&v8P+my|~(P zFBkMah^QWM&mo284;IqL6d`EwCwitP}?FxPGG=HkecMOB9@;i1T$N6Q@y3;SS;^mI* z|I>B1!`$rT=dKBSQ^gXpCQ*UYc3U!|@_fLnYIaBEy<%8FWeI05(4AKfR_NZG6oFq# zesrAl$bEY*CZE{5S~+3sragbx_w?f-(RArpxrmETKCwC|Z!S^B8WI>rGXE(ouUWT?C>dePhFe(J z+FP3%+xrB^Rk5KVd4nE?VVIQrx$7H-Yf4}khB=2SCynJYp&S*Q#%|UJPmgCuEHUOjeqPd$L-XkcHRetp6 zVVIj8<~A?1ydw=77ry}Ps@N+V2Tyav-0Wn$m#uqN(%2CpTK<{cb5z{yFn7;c=Z{#9 z7`xGFze2n#Mf_A{{FdQi@VR2Vo9rA`8AOfiS&OC zMHn7Ptt+{|z?i_xm|Ley`*=T#ZfL6~+oqIV|N0?y>dCKBPhWe&xdVq|$Nh%TR!$G z*~339=W6%^Ptv7rD}!?B01XMDs}??2UcWy)`{+`QXO~mkB_6vramUG5(nGu_s_^s6 zRbtmcJGsDJde`zcQPb8!BJXZCnIlg*%G)*+uQ|%gq&(tA1{I+G-K_#U7uAB>_w(t1 zs$bo#7%@(_d3_UsuIDcvrV29ZPIEkT$*GB-=>W`vYk}d^G5+2L1OSliKYgVuJu>)i z5v%DE9q$eEtW{*x-48~cA1C*TpK)v0l%mX9f{r?gbC=(IfxoSaBqlp(aFXC7#pbT4WGJZtA5e> z$N3GktW%Fm2FzZ&%0|!7a73V=y9!5DwXfIutvs!|B4*QgosPr`M9UQc&a``5kKNk0 zG*oYY@H7pfnlEcSOb=y0%cTN9ll1P}n*>!81?H!Z6%3Ax+Lm)nv?TkDo1wq{(qB2d z%qX`r?bmOzN*x>iu+U#K|7MYspJB^}8b;6>&_@ygK!T)3!f0eV0%*v4k%Q`UmN=Tr z;s5{;tx8&1C9jkYx&VL?`kD7_yhL7G8|tHY8gp#gA_kQPco{s$xQ~(4)Z{P#031P% z2(%hHLX^+%s|hBiY6NKXV`!ty_&cwH;i5ng_~vr)OD|7Psc*;(93v6<%}h?ChEAz? zUqdi9R&DemqiL>-d)cZcM(VYoLk*sB+h<#MW+pF~#EutSq<4_~rs+)#FDnTR6b5Gp z*S4H<7A|Etd9v1yn-Q54YTg=6-{!y`t#JBkbk3lpZ0mUgh~Fx~N#L;NR~QD+@|zIN z`PbeYw&#q9(fX2aa5v@vM^uu>(JHANeG1m@HX{I0?geo7i>a;p^VUI=Hv7(~DuSL%=PBrVopCQk6W(*>c2G4SpetYUfNV4g4i;nbGMEzlg@HI8Jt~ny|o4rf6KCk8) zVCRi7X>I#H?1H@V4u7qNNo$%Z(6cg18!cJ2xo;}*y86nEgCU0DalmG>JA1#|`z5HF zT1c11B$qNcEj7&)=pQ~bSyDcy6}0(E5^a9kAF;$ru2XKmN$hY@+fSwo^5ET;M(JJB z#jU?4c?3;wvsI2LMQOFN=7!1~$-zOikJ0#WW%uq^ zx%q`j#||Bhmv!^AYI+dG$!HkMR7Sr@EuzpG=Px(nV0t;PWqUa8?*K3qlz{aHKa$J+V&v5rW0w|B(V!!JJxgaLe1xzle_m}C6A0|C!;h7E}Wx4p38Z__3lmF?xKDErud$Q@uogsya zR;qXaY5PToLY*siu9<1D{KRLM*_LhYE2|0SM+hY2`G zui^3-|MDMu%f4l!h*ff8)tpl<=U#d0bgLjlD8KB=`%W{DSRMZBM5j=`6<8MK+Ew=eG%E2IDt8bAHA(7fPHK{xMl^pxN4 zfl79W0^T$pOF+EBz8CJyf z1mffn!;}9^a?s0iKGk>iSs>j3qb%za=Z0Aq@t-&oj9nS~yZe+QS;DV2{y?z4++H+t z(Y1o^INi*FN4dOrbR8{YhY6;$_6@b=1rj~1l5-9i$t$X^<%NhHFbXeB(staJ(IDb_ zdkp56>oar)Z%gTlPooY0{xiWSNq+=9w?2H!|hjm)!GE>&kgS z_nZkPu)XM@rd_!H*=UNb(zm5z#>Z>xra0L;IyqVyXq!&n^|Fc$fGTc|lEg3!Gyd&T zu#c4@hGA;McO=v!VGlIxN-xqT6C6=Y$TQK6@Z4$cLKyjnt$;8-qNY{1!gpAqCi(XV z*-1CPvY4e2E5|Ik^_j`HkK$$DxnYI+=GXo_B2bz4w4SF|X2Ef5P?#Ovs!~SoA(x?n zuWQ)|p@#Hb0|}-(GieAR#ICqCh5*WLtHKgXYD*q1)dJ;tvGoWcRQZ=X0dqY2nS~HS zi2mWwSocHObiUzstruG6&H^Xzmh9h zIE+pHl+j@7qfG<=R>ixQU)86~86*n;Kr2oz#`-VTl>*>(pc$goNer}>Q({;swi|&( z=LLYCdtp;(xsg6A`9Zo(@X7gll7LAN@W7%{yLQW``_2Rt+`cu!o(YB{$VmZ{#%y-T zEI2#eZq7rK9Z!^hYG$!C>+9|n2OShc~Ch!?z zZ4vfNFiACIHK_Yi+aw}kviXtHOh@B zSy9<|vkeAKA3Ki&%~0+81l$lGSq`Tn_9CI!UkjLDpPYC&_+X%&Gynjz?n^E7aZnRN z8Y=)o_8hzfOZCy-3KC9XUpVL2-z{*$i0UR5mRvE_mgOCVgsP3RHYF#g>4#=)8kr8X zvZ5L$0K4ktf%Vs``@5OSVF0Ku{b_-$)evn0006xx?j2dz)l{xUD8yA&Ma}uAa)7Nm z=e$6~UV#4j>FHw+2tNMf)tW46h3`sa28}QfaMxE*T4vXsep(^F-r#De0JwfrLi1`< z_l(t(0st9fkF)s=EkvMKDU@Iz5GPH_F(JVHV%^vsb}OsSg}7 za{9tq1^}3*?c(qoKRX&I0f2((jL;AHSA48>qyR7tn?;co?4~HpYoJDWo*=?0KYc{ zTp?waM)>M#c!YQGOv^!+uaGiJu6y(wygh~TJ(bkITJP)~ULsIrUFC&YbYY^-kUzS9 z$(L_((6bM@^i|e2GBdMuH1DIVZDcmkeqlrfk9=jj-kFv?nFL*Cn2n)OB)$R#SOCOZ71ii8$GjwxUP6PSvj**j2ix~#re!sw#Lw1RJP{F`9b7L||%?S|Rqcc!Qi)CO3)t+-LxRjDDM7e-}4SvPGH ziIretc=DgobBGZfadL>^i8wjL@T9k#3HBqws)!F+J=xxJ@Q|U7Rz@byi%!0+?X3bt z{;>!#iLHs8C{1j;T=t)$CSp8E(>J1&i4bB}zwkE#(&VdMy#&%l@Qp=0tO$;T(x4f? ztr^ir0st@t`$bF4>mG#sQ`6JU5(>Vt^nx?Nx<|Mr0J4rjXIGjw?;B!xDLi1f&V9>z zSuAZj8OF!sHh8tg|Bw+vsOFKUJV5{T?-~$7?9%H~UH4|u5kjaYav~8(_RB7(SCdPk z*60JtBeEJHgjiqic=eGVc`}EF5TfUw8B3BMcd>}se2Ltk`JqYW| zOE(C&gq4{ggb=&@_9PN%!nH4*S$*wgv2e^e=pXhD#A*MMNI|GBc8SAC7gfw;M+ObC zEAM$b2c|Zz%+*9rlmhd8jZLH``Rn3Lwx`n&V&omR#^gL6HBUyWA50{I&GC=Srb|qB zHzpUerm(QKfwwV7i>akWmCbjf{Kjyi#N%yc~%t7FPAU zE1M^qjt(nfak>y)EI<62U?P)LanVz?L?fikj8*nA2TVhM;2q9MS83%&)sssu`2-QV-D-uWDC}$&t5VJ7E7O%DP zbyIDOyu(%?JL6GFVt}jH)y7?7W>tPsJsY8#$3Ho)if`kV`ev;Tk9(##=P8d}Vpi3Q z--npZzFg4RJr@zif)GNqw7_9A?^khp5oIjxlwd^D8RJwBUHCIZNoS@%i3GD;rKg`d z5rQ{e+_^KsZl>neA^XOo(a3N1uDLg4&lYDzfs9-Ih(LsrDlU4eW(1d+q57mhrY}sL zfA{LFev&}X4G+z9S~P+0e;Vo@5t?XYX`e>5Q9eolGUIQRvk_vKT^}O_pg8kkb&CP7 zo&&MI-u6<#n{Rqm!$ycrNju=uZ+uwugp_k>gtzfG8d5eHfTZi`PYi@umH%w9k$?d~ z88n0tyZq)TqJrm>+Qx5D`gRk%$&U1v(UMhs#sL6~1CqXV5wzl%(1WLA3%_RP)d;+I z-v&zh(XoB|&kl)-i;s_wkB^T&;%>eAb&IFEC@*>3knuy)7VY5KJ! z2Uj_q2xH+dLK9^y|580i_XxMRA)FkJA3Yb#ziWk*&wrxqCV2ddOd;s`ScKYJ`C;iE f;a2zXBgFE5ne*kxz!3Qv00000NkvXXu0mjfS?EiM literal 5777 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 P00000NkvXXu0mjfnR-fT diff --git a/collects/redex/tests/bmps-unix/metafunction-TL.png b/collects/redex/tests/bmps-unix/metafunction-TL.png index 3b29ef9410064a9656b55b4aab02e87dd7bd83cf..a2f6291b00a66f21a476c0d35fab2f8008553321 100644 GIT binary patch literal 4932 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 AoB#j- literal 5082 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 diff --git a/collects/redex/tests/bmps-unix/metafunction-multi-arg.png b/collects/redex/tests/bmps-unix/metafunction-multi-arg.png index 70a4c28ad35dc47ece5ec1b79cf2213222659947..f83b42b9c771421a5762d1b03acfa24043a0443f 100644 GIT binary patch literal 7648 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 literal 7945 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 A>i_@% diff --git a/collects/redex/tests/bmps-unix/metafunction-subst.png b/collects/redex/tests/bmps-unix/metafunction-subst.png index c2e7a3c58a29f50a494a5b1dc727452f0f965a64..8eb9e665c7e64c8da527f95266e1987211a0d02b 100644 GIT binary patch literal 5529 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 MrFS6IE7PF=0xF6V3;+NC literal 5646 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 fJ@j8AyP9H54l3%s>7I`)mIN diff --git a/collects/redex/tests/bmps-unix/metafunction.png b/collects/redex/tests/bmps-unix/metafunction.png index 1e238ef2711e72513ab1525eb9948e290deffae8..4c607c9c5a41e00a11c033d6180b864b07feb56b 100644 GIT binary patch delta 1176 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 S$w3d%06_YkXtl6Gz<&c_Me^JL literal 13348 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 B65ap+ diff --git a/collects/redex/tests/bmps-unix/reduction-relation.png b/collects/redex/tests/bmps-unix/reduction-relation.png index ec11b4b4fd2192ddfa166dcbd86122e296ece0ea..09f92469fb614c475e7abbe954c34ccde7b40d3e 100644 GIT binary patch literal 2261 zcmV;`2rBo9P){sH?f5=}LDb~ir6l>#QiuE9X5He(#Db|C7A>r;5Yq{`YLyuaQ zX$X2H3SnJ?_|0-m<4ArT2IkG$SgSj(?wA*Kq)s-#RMcloK?vEs``NWlsxT5fkfUlX zTs3Re>8EmoF2RVBUk%1s|D%mD#)`&Mk&c1;YhPkK&{Rn~8Y>QmaggVM2Xd?ff(P9w zTk{q=`J~*D>KkZm$)KQ(r>E1KoM@hSW=!ahA}m}NxLk9sX;Bw4>NY6`@AZB*008zg zk}EoDGUhrUuyPMgt`K94ad&B~rFmGMko3mL8jE+w1o`?0c)L4}e{a*dCIyA$<^BC( zd;nlMc|~W{%dx0*jW3S|)}G71Z||a-WoUW5VG!D}^661;u#CIht!W^b+Qx>g8FT<} z+Hg}c&Zi;sGwnBqKZ%wg=13|MAO${j0Ox4jlYo%&T4o*NzLqhe8Fx zjk@jZ$7_qm?K!e+{0IPG@VtFTci+C=Ak!@Y;EW4!#*fOL$N)gyc7Eq+&poR=m=v>+ zMqv=?>z^Bk;>CZEf|u~X8%u1ud6%I&}K0TKY9JI3sa z+d4ZXvF`78vIXXSdJvt-0F_j#B!s&4!r|f`g?0KouRkLI04(d2@W%4lG@TLvU^z~8 zXQo!wiq!tfvb2NDEros@s#%5>gb>9a4FhP*kt|Tkl-eN#6F}8m_<6p3{;6e?CWt@s z*|y`W9}b1iwe0I-fCK;l)G{fP1JKscq3GX%l`vk)0PJxA&Ty>kaaX{N-Sx|}(rsy!vkW2Bfd&8?nDIP#(B1k%rD-6TAgj&Zd(CF~ z_HZ7J;k;l?prq*7wT}KCi4p+7;_8g}EcdU!nMW(#lUdU*=~i~PzJSplJZAruV3k4z z=2q<9y+-lmyA2z2o+>CL001lpKMz)W<;Be83n8gXU0#KjLNXNS4Kx4%#*)e;M}}`^ zgZAas&s2*_e{ak1$hFG2drqyjSpL2(yqikKP1?L)sm8qKIy=V ze@0ud=NAwYL{)3<`yAwzR`U{LtP+)f5jt^EjwTJ!CBYbDEW4lL0YGzJeMQu_n@Td+ z^hQ$OFpRO}<|a4G`T4!+Q6E#;d}5}#MN~n1Z*0}VGvRDz=*eeTD8DtCzG}go#D_ioSoqhJ)(dKgm(+~`nD4R}2I8EE9{{z$55+k6! zA?mL3z3&IDF48{01k(@08Ww=WtNsNL4Z%-40gsE0wJWR1R9+a_`|M>Ytge=_Nne6H3gph^XJA#1tl8#~9 zbfi_gW_t-H@Dbt&e5VK|@DZ|zz1%Zg%Xwok#)`Hp=}Q9~HD?w~n{oaNl8aiD7-Ly& z>ICHU$t~%tAH(}1#~5R*YB?T&xQk1>U;P;F6&VTxy6yiO3vUl)r<98lCvT{82IYQ6%q^Y(DA>YQxUA;DoG}QY5zfDf$$q4OuFGrv?C8kGYsGn??jokVsU&65 zbiaT=9}g$@nVY|FHtLz(5P(G`AC834aXAkq1HNY|_YjI|02w+D^>v`LZt(W*AvCa@ znUNLGFIY03ZRzSWdvQYQiR(==173d=)c`Vd9_o`qQ8##dp#d;mVza76E!7vZK3(W( zb~kf*u#124jV`_6raQ*$inFt+#qYSuU#CDv>167ykCG|y7RRc)Tb*NA3oT6^<_CmwY3u8l~ zHy_TuRB^ZF-pz~0w=UgS30^Uwe5&nN*_@xWxp{5&Cvz9={Db|2BY(Qmi2(q5F2`EZ zgHE=R-6!_gKo|H=$}#?DiGmT@HXY;HlcJ_`nl4>>ECT>_SH=Dnsn7gF9LxseiiZyd z8aX*~8a?x9!r}EoIRJ27gBGNhrf-ElFi^c-+yek1V4CdnEV1-CguEbmlA! zRDAi5oZmssPcO$tcw3R}4@?JN4-VHOZD+7$??IsQIr(^+-3QruTbCuyob)$Wdyd)Y zkffp$A37MXbT~v%B`I(C-KcCYj&~UoolBkk{qpe|-rk&#@>xL)t{qQ&I@Y(u+``OO zd^*g4Yij|Y%e?TTD+rn$R)l(p*9X`Vgeb}M@y j)*BqK4=<+kYvb`>IbVK3I%f!J00000NkvXXu0mjf*6>_@ literal 2174 zcmV-^2!Z#BP)oxir=k#bbCGs4TbKqdeogj9{E z7kfr#*Y+VqVCuy%y;@Yb)GI9WN4bHc8tr9Vpr@ffjno>1khC(*+jjBA#~SS=9TO?< zWQWiles{G?Lp+48o)p>5Ek3r33fpi4=Wn!^ae$1mW;M|Wx_Zgio5LLd0NiKoywO>6aG?hVcK&mB-jE_m`3f7W*g`Sck|-KW zGL}UNW<-Sgdro^{+odKILWs<(?{;>qD*&*(LXvXtD^XYZ27xmT?1NwZti4-Lpz(qt z-GJ1Oj)sCw%I6a81sxM1gpj5!e=Z#Y|5~dUIRKGfUj4cca2B6y!`1C2X$w-%w`iA0 z@t?iVgX@M0DbY-nk3M?I#U=6hT{%KX^)M%z$xXcUSVQI2aUs?Mi#jdRuCemo2k{FI z)hVb0nQlWK4h@vzyJFxvbLm=%jtKyOx0HQ&9fz93?+bfJ3`w8|%ixW>ViZMxIdVRG zeV*@uLrdJWcNtt4E{N}mRU>DnX}kD`*NXl29DZe*B>*s-Lj_Kf@4snKPppcTpA#yR0(t@qrV!|F#$kXcYNP>0o!)Z>iXxt z%k8=a+(6Bokg^Z9&! zc*;4MvzIHIM&-rwobJyQRo8ZDkfdV&A?EAb!Z~^ZjV~C6k^RvyfX1|Dfm)&NzprBg z^n82ZXv^I9w{Er*9a*&RlLx;}^RpN-zz9760B96)CI_Icp;I;F22v~3z~HhOBc>t0 z|3$6FarK4okImxf-qVnJ0oyOa8~$GLpgZDv#{E}w-*Ker3p8G6KU*laCK^~c^PE8< z>cO=abWBZa(cZII@{V{{`XF0@tm0>rh#x34pw&TfelFY@XQ~#D5iA6TD`= zYw-7`(O$*{GMdpO8X--0<=ZbttuJoJiA=rd*UPFi=Fd(qYE>CFpz&VD1sZ>blq0yL zSxk3#Wn+YO(6F~z2B)?m@ zJ%R7Uz%UGBxrQcX6gNI|4T?z*(sW)~rNgPAEb!TUU4oFJHtRV6 zu1`SVF9n_eT%UlT8NV;-F!d?#AhN36^MiwUE&%MHFn$ov1%R7eF46D!3;?L-@)8a` z`c%tc39N3+i?Xm=c};>8wOP+$UR$f=gFhy6s{P=tCnGR!a=B#i$3)M_AQ+%gE7W+m zs7nQI+TxS$wlw#uuRPFlg8$b3x1a$xGVNuLTib(!7N%zA76}`Aak_2boOuE#sx!vk zZ_=kbVi<;b#OxA2sXY|uNyF@UFYFS^2<3{J0}I?R472q9)v~;L6?A|8TDS`xa|l^g zBqsll24z!e=JM$9h{!OWm;by!eb#L1)Uyc9lE2~2xQ>Gh7H)j6 zpzMpUu9cj5dv(H=fBUUVpJ7eqNZPL=gRJdDI5s+H(mnyBqWqNnO?P12Vk0{}4VfRyawlxzc+Mkd_3DCOvv z^)`u-y|P;;GKxFkN&eDE)sf5jFGJ0pzF#DS+7WFFOb-E%!{zPY9b+?aX03iqtf#pw z$t&FP%BFb%AN#m-ESzSi7oYl#hv|CS;{nwwjPlD+-CnY0s$0@o>N?MOy_QM*M3aIs zxGv7pf)#>Nt0@+a(t;I&GP{}YmgdIW6SYy0yt#2|*1z6MqOS9d)&t0^-&(xt(`HG# ztv$YdW^k{x-OfFXWoQd%Vlj7EOvL0ZOeY!t1=8z>PL&0G@c;k-07*qoM6N<$f(e!= AssI20 From 3b5d13f229eaefb7ac1356465f901b2d1ee26795 Mon Sep 17 00:00:00 2001 From: Casey Klein Date: Wed, 27 Jan 2010 20:03:57 +0000 Subject: [PATCH 086/113] Fixed bug in generate-term's error handling. svn: r17856 --- collects/redex/private/rg.ss | 2 +- collects/redex/tests/rg-test.ss | 9 ++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/collects/redex/private/rg.ss b/collects/redex/private/rg.ss index 0a29eccc60..c2502d28ab 100644 --- a/collects/redex/private/rg.ss +++ b/collects/redex/private/rg.ss @@ -664,7 +664,7 @@ (with-syntax ([make-gen (term-generator #'lang #'pat #'(generation-decisions) - #'name)]) + (syntax-e #'name))]) (syntax/loc stx (let ([generate make-gen]) (λ (size #:attempt-num [attempt-num 1] #:retries [retries default-retries]) diff --git a/collects/redex/tests/rg-test.ss b/collects/redex/tests/rg-test.ss index 881d82bb74..abd12b2ae5 100644 --- a/collects/redex/tests/rg-test.ss +++ b/collects/redex/tests/rg-test.ss @@ -8,6 +8,9 @@ "../private/keyword-macros.ss" "../private/error.ss") +(define-namespace-anchor nsa) +(define ns (namespace-anchor->namespace nsa)) + (reset-count) ;; to-table : hash-table -> assoc @@ -202,7 +205,11 @@ (n 1)) (test ((generate-term L n) 0) 1) (test ((generate-term L n) 0 #:retries 0) 1) - (test ((generate-term L n) 0 #:attempt-num 0) 1)) + (test ((generate-term L n) 0 #:attempt-num 0) 1) + (test (with-handlers ([exn:fail:syntax? exn-message]) + (parameterize ([current-namespace ns]) + (expand #'(generate-term M n)))) + #rx"generate-term: expected a identifier defined by define-language( in: M)?$")) ;; variable-except pattern (let () From 8733e7f233a5e067631e23c8bc920f6af6025a79 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Wed, 27 Jan 2010 23:22:23 +0000 Subject: [PATCH 087/113] fix JIT bug related to locally bound flonums; merge to 4.2.4 svn: r17857 --- src/mzscheme/src/jit.c | 41 ++++++++++++++++++++++++++++------------- 1 file changed, 28 insertions(+), 13 deletions(-) diff --git a/src/mzscheme/src/jit.c b/src/mzscheme/src/jit.c index 54d941fb42..609c87d0d9 100644 --- a/src/mzscheme/src/jit.c +++ b/src/mzscheme/src/jit.c @@ -1968,10 +1968,14 @@ static int no_sync_change(Scheme_Object *obj, int fuel) fuel = no_sync_change(branch->tbranch, fuel); return no_sync_change(branch->fbranch, fuel); } - case scheme_toplevel_type: case scheme_local_type: + if (SCHEME_GET_LOCAL_FLAGS(obj) == SCHEME_LOCAL_FLONUM) + return 0; + else + return fuel - 1; + case scheme_toplevel_type: case scheme_local_unbox_type: - return fuel - 1; + return fuel - 1; default: if (t > _scheme_values_types_) return fuel - 1; @@ -2274,8 +2278,13 @@ static int is_non_gc(Scheme_Object *obj, int depth) case scheme_unclosed_procedure_type: break; - case scheme_quote_syntax_type: case scheme_local_type: + if (SCHEME_GET_LOCAL_FLAGS(obj) == SCHEME_LOCAL_FLONUM) + return 0; + return 1; + break; + + case scheme_quote_syntax_type: case scheme_local_unbox_type: return 1; break; @@ -2316,12 +2325,16 @@ static int is_relatively_constant_and_avoids_r1(Scheme_Object *obj, Scheme_Objec t = SCHEME_TYPE(obj); if (SAME_TYPE(t, scheme_local_type)) { - /* Must have clearing or other-clears flag set */ - Scheme_Type t2 = SCHEME_TYPE(wrt); - if (t2 == scheme_local_type) { - /* If different local vars, then order doesn't matter */ - if (SCHEME_LOCAL_POS(wrt) != SCHEME_LOCAL_POS(obj)) - return 1; + /* Must have clearing, other-clears, or flonum flag set */ + if (SCHEME_GET_LOCAL_FLAGS(obj) == SCHEME_LOCAL_FLONUM) + return 0; + else { + Scheme_Type t2 = SCHEME_TYPE(wrt); + if (t2 == scheme_local_type) { + /* If different local vars, then order doesn't matter */ + if (SCHEME_LOCAL_POS(wrt) != SCHEME_LOCAL_POS(obj)) + return 1; + } } } @@ -3905,10 +3918,12 @@ static int generate_app(Scheme_App_Rec *app, Scheme_Object **alt_rands, int num_ if (num_rands) { /* Save rator where GC can see it */ Scheme_Type t; - t = SCHEME_TYPE((alt_rands - ? alt_rands[1+args_already_in_place] - : app->args[1+args_already_in_place])); - if ((num_rands == 1) && (SAME_TYPE(scheme_local_type, t) + arg = (alt_rands + ? alt_rands[1+args_already_in_place] + : app->args[1+args_already_in_place]); + t = SCHEME_TYPE(arg); + if ((num_rands == 1) && ((SAME_TYPE(scheme_local_type, t) + && ((SCHEME_GET_LOCAL_FLAGS(arg) != SCHEME_LOCAL_FLONUM))) || (t >= _scheme_values_types_))) { /* App of something complex to a local variable. We can move the proc directly to V1. */ From 1b22ce82cda5ac1f24713ec82b6229949a274ef8 Mon Sep 17 00:00:00 2001 From: Casey Klein Date: Thu, 28 Jan 2010 01:12:54 +0000 Subject: [PATCH 088/113] A flag to make the random testing forms return results instead of printing on stdout. svn: r17858 --- collects/redex/private/rg.ss | 142 +++++++++++++++----------- collects/redex/redex.scrbl | 30 +++++- collects/redex/reduction-semantics.ss | 4 +- collects/redex/tests/rg-test.ss | 59 +++++++++-- 4 files changed, 165 insertions(+), 70 deletions(-) diff --git a/collects/redex/private/rg.ss b/collects/redex/private/rg.ss index c2502d28ab..04df780210 100644 --- a/collects/redex/private/rg.ss +++ b/collects/redex/private/rg.ss @@ -695,11 +695,12 @@ (let-values ([(names names/ellipses) (extract-names (language-id-nts #'lang 'redex-check) 'redex-check #t #'pat)] - [(attempts-stx source-stx retries-stx) + [(attempts-stx source-stx retries-stx print?-stx) (apply values (parse-kw-args `((#:attempts . ,#'default-check-attempts) (#:source . #f) - (#:retries . ,#'default-retries)) + (#:retries . ,#'default-retries) + (#:print? . #t)) (syntax kw-args) stx))]) (with-syntax ([(name ...) names] @@ -711,7 +712,8 @@ property)))]) (quasisyntax/loc stx (let ([att (assert-nat 'redex-check #,attempts-stx)] - [ret (assert-nat 'redex-check #,retries-stx)]) + [ret (assert-nat 'redex-check #,retries-stx)] + [print? #,print?-stx]) (unsyntax (if source-stx #`(let-values ([(metafunc/red-rel num-cases) @@ -728,21 +730,27 @@ (max 1 (floor (/ att num-cases))) ret 'redex-check - show + (and print? show) (test-match lang pat) (λ (generated) (redex-error 'redex-check "~s does not match ~s" generated 'pat)))) #`(check-prop #,(term-generator #'lang #'pat #'random-decisions@ 'redex-check) - property att ret show))) - (void))))))])) + property att ret (and print? show)))))))))])) (define (format-attempts a) (format "~a attempt~a" a (if (= 1 a) "" "s"))) -(define (check-prop generator property attempts retries show) - (when (check generator property attempts retries show) - (show (format "no counterexamples in ~a\n" - (format-attempts attempts))))) +(define (check-prop generator property attempts retries show) + (let ([c (check generator property attempts retries show)]) + (if (counterexample? c) + (unless show c) ; check printed it + (if show + (show (format "no counterexamples in ~a\n" + (format-attempts attempts))) + #t)))) + +(define-struct (exn:fail:redex:test exn:fail:redex) (source term)) +(define-struct counterexample (term)) (define (check generator property attempts retries show #:source [source #f] @@ -757,9 +765,16 @@ (with-handlers ([exn:fail? (λ (exn) - (show - (format "checking ~s raises an exception\n" term)) - (raise exn))]) + (when show + (show (format "checking ~s raises an exception\n" term))) + (raise + (if show + exn + (make-exn:fail:redex:test + (format "checking ~s raises an exception:\n~a" term (exn-message exn)) + (current-continuation-marks) + exn + term))))]) (property term bindings))) (cond [(and match match-fail (match term)) => (curry map (compose make-bindings match-bindings))] @@ -767,12 +782,13 @@ [else (list bindings)])) (loop (sub1 remaining)) (begin - (show - (format "counterexample found after ~a~a:\n" - (format-attempts attempt) - (if source (format " with ~a" source) ""))) - (pretty-print term (current-output-port)) - #f))))))) + (when show + (show + (format "counterexample found after ~a~a:\n" + (format-attempts attempt) + (if source (format " with ~a" source) ""))) + (pretty-print term (current-output-port))) + (make-counterexample term)))))))) (define-syntax (check-metafunction-contract stx) (syntax-case stx () @@ -801,8 +817,8 @@ show))))])) (define (check-lhs-pats lang mf/rr prop decisions@ attempts retries what show - [match #f] - [match-fail #f]) + [match #f] + [match-fail #f]) (let ([lang-gen (generate lang decisions@ what)]) (let-values ([(pats srcs) (cond [(metafunc-proc? mf/rr) @@ -811,46 +827,53 @@ [(reduction-relation? mf/rr) (values (map (λ (rwp) ((rewrite-proc-lhs rwp) lang)) (reduction-relation-make-procs mf/rr)) (reduction-relation-srcs mf/rr))])]) - (when (for/and ([pat pats] [src srcs]) - (with-handlers ([exn:fail:redex:generation-failure? - ; Produce an error message that blames the LHS as a whole. - (λ (_) - (raise-gen-fail what (format "LHS of ~a" src) retries))]) - (check - (lang-gen pat) - prop - attempts - retries - show - #:source src - #:match match - #:match-fail match-fail))) - (show - (format "no counterexamples in ~a (with each clause)\n" - (format-attempts attempts))))))) + (let loop ([pats pats] [srcs srcs]) + (if (and (null? pats) (null? srcs)) + (if show + (show + (format "no counterexamples in ~a (with each clause)\n" + (format-attempts attempts))) + #t) + (let ([c (with-handlers ([exn:fail:redex:generation-failure? + ; Produce an error message that blames the LHS as a whole. + (λ (_) + (raise-gen-fail what (format "LHS of ~a" (car srcs)) retries))]) + (check + (lang-gen (car pats)) + prop + attempts + retries + show + #:source (car srcs) + #:match match + #:match-fail match-fail))]) + (if (counterexample? c) + (unless show c) + (loop (cdr pats) (cdr srcs))))))))) (define-syntax (check-metafunction stx) (syntax-case stx () [(_ name property . kw-args) (with-syntax ([m (metafunc/err #'name stx)] - [(attempts retries) + [(attempts retries print?) (parse-kw-args `((#:attempts . , #'default-check-attempts) - (#:retries . ,#'default-retries)) + (#:retries . ,#'default-retries) + (#:print? . #t)) (syntax kw-args) - stx)] - [show (show-message stx)]) - (syntax/loc stx - (let ([att (assert-nat 'check-metafunction attempts)] - [ret (assert-nat 'check-metafunction retries)]) - (check-lhs-pats - (metafunc-proc-lang m) - m - (λ (term _) (property term)) - (generation-decisions) - att - ret - 'check-metafunction - show))))])) + stx)]) + (with-syntax ([show (show-message stx)]) + (syntax/loc stx + (let ([att (assert-nat 'check-metafunction attempts)] + [ret (assert-nat 'check-metafunction retries)]) + (check-lhs-pats + (metafunc-proc-lang m) + m + (λ (term _) (property term)) + (generation-decisions) + att + ret + 'check-metafunction + (and print? show))))))])) (define (reduction-relation-srcs r) (map (λ (proc) (or (rewrite-proc-name proc) @@ -864,10 +887,11 @@ (define-syntax (check-reduction-relation stx) (syntax-case stx () [(_ relation property . kw-args) - (with-syntax ([(attempts retries decisions@) + (with-syntax ([(attempts retries decisions@ print?) (parse-kw-args `((#:attempts . , #'default-check-attempts) (#:retries . ,#'default-retries) - (#:decisions . ,#'random-decisions@)) + (#:decisions . ,#'random-decisions@) + (#:print? . #t)) (syntax kw-args) stx)] [show (show-message stx)]) @@ -883,7 +907,7 @@ attempts retries 'check-reduction-relation - show))))])) + (and print? show)))))])) (define-signature decisions^ (next-variable-decision @@ -921,7 +945,9 @@ (struct-out mismatch) (struct-out class) (struct-out binder) - (struct-out base-cases)) + (struct-out base-cases) + (struct-out counterexample) + (struct-out exn:fail:redex:test)) (provide pick-from-list pick-sequence-length pick-nts pick-char pick-var pick-string pick-any diff --git a/collects/redex/redex.scrbl b/collects/redex/redex.scrbl index 9eb594b227..9d062200fb 100644 --- a/collects/redex/redex.scrbl +++ b/collects/redex/redex.scrbl @@ -1166,11 +1166,13 @@ repeating as necessary. The optional keyword argument @scheme[retries-expr] ([kw-arg (code:line #:attempts attempts-expr) (code:line #:source metafunction) (code:line #:source relation-expr) - (code:line #:retries retries-expr)]) + (code:line #:retries retries-expr) + (code:line #:print? print?-expr)]) #:contracts ([property-expr any/c] [attempts-expr natural-number/c] [relation-expr reduction-relation?] - [retries-expr natural-number/c])]{ + [retries-expr natural-number/c] + [print?-expr any/c])]{ Searches for a counterexample to @scheme[property-expr], interpreted as a predicate universally quantified over the pattern variables bound by @scheme[pattern]. @scheme[redex-check] constructs and tests @@ -1180,8 +1182,18 @@ using the @scheme[match-bindings] produced by @scheme[match]ing @math{t} against @scheme[pattern]. @scheme[redex-check] generates at most @scheme[attempts-expr] (default @scheme[1000]) -random terms in its search. The size and complexity of terms it generates -gradually increases with each failed attempt. +random terms in its search. The size and complexity of these terms increase with +each failed attempt. + +When @scheme[print?-expr] produces any non-@scheme[#f] value (the default), +@scheme[redex-check] prints the test outcome on @scheme[current-output-port]. +When @scheme[print?-expr] produces @scheme[#f], @scheme[redex-check] prints +nothing, instead +@itemlist[ + @item{returning a @scheme[counterexample] structure when the test reveals a counterexample,} + @item{returning @scheme[#t] when all tests pass, or} + @item{raising a @scheme[exn:fail:redex:test] when checking the property raises an exception.} +] When passed a metafunction or reduction relation via the optional @scheme[#:source] argument, @scheme[redex-check] distributes its attempts across the left-hand sides @@ -1228,6 +1240,16 @@ term that does not match @scheme[pattern].} #:attempts 3 #:source R))] +@defstruct[counterexample ([term any/c])]{ +Produced by @scheme[redex-check], @scheme[check-reduction-relation], and +@scheme[check-metafunction] when testing falsifies a property.} + +@defstruct[(exn:fail:redex:test exn:fail:redex) ([source exn:fail?] [term any/c])]{ +Raised by @scheme[redex-check], @scheme[check-reduction-relation], and +@scheme[check-metafunction] when testing a property raises an exception. +The @scheme[exn:fail:redex:test-source] component contains the exception raised by the property, +and the @scheme[exn:fail:redex:test-term] component contains the term that induced the exception.} + @defform/subs[(check-reduction-relation relation property kw-args ...) ([kw-arg (code:line #:attempts attempts-expr) (code:line #:retries retries-expr)]) diff --git a/collects/redex/reduction-semantics.ss b/collects/redex/reduction-semantics.ss index fc8a9ff9d0..ad0c601b0e 100644 --- a/collects/redex/reduction-semantics.ss +++ b/collects/redex/reduction-semantics.ss @@ -50,7 +50,9 @@ check-metafunction check-metafunction-contract check-reduction-relation - exn:fail:redex:generation-failure?) + exn:fail:redex:generation-failure? + (struct-out exn:fail:redex:test) + (struct-out counterexample)) (provide/contract [current-traced-metafunctions (parameter/c (or/c 'all (listof symbol?)))] diff --git a/collects/redex/tests/rg-test.ss b/collects/redex/tests/rg-test.ss index abd12b2ae5..12c8571c1b 100644 --- a/collects/redex/tests/rg-test.ss +++ b/collects/redex/tests/rg-test.ss @@ -540,6 +540,16 @@ (d 5) (e e 4) (n number)) + + (test (redex-check lang d #t #:attempts 1 #:print? (not #t)) #t) + (test (counterexample-term (redex-check lang d #f #:print? #f)) 5) + (let ([exn (with-handlers ([exn:fail:redex:test? values]) + (redex-check lang d (error 'boom ":(") #:print? #f) + 'not-an-exn)]) + (test (exn-message exn) "checking 5 raises an exception:\nboom: :(") + (test (exn-message (exn:fail:redex:test-source exn)) "boom: :(") + (test (exn:fail:redex:test-term exn) 5)) + (test (output (λ () (redex-check lang d #f))) #rx"redex-check: .*:.*\ncounterexample found after 1 attempt:\n5\n") (test (output (λ () (redex-check lang d #t))) @@ -574,17 +584,29 @@ (--> 0 dontcare z))))) #rx"counterexample found after 1 attempt with z:\n0\n") - (let ([generated null]) + (let ([generated null] + [R (reduction-relation + lang + (--> 1 dontcare) + (--> 2 dontcare))]) (test (output (λ () (redex-check lang n (set! generated (cons (term n) generated)) #:attempts 5 - #:source (reduction-relation - lang - (--> 1 dontcare) - (--> 2 dontcare))))) + #:source R))) #rx"no counterexamples.*with each clause") - (test generated '(2 2 1 1))) + (test generated '(2 2 1 1)) + + (test (redex-check lang any #t + #:attempts 1 + #:source R + #:print? (not #t)) + #t) + (test (counterexample-term + (redex-check lang any (= (term any) 1) + #:source R + #:print? #f)) + 2)) (let () (define-metafunction lang @@ -595,7 +617,17 @@ (redex-check lang (n) (eq? 42 (term n)) #:attempts 1 #:source mf))) - #px"counterexample found after 1 attempt with clause at .*:\\d+:\\d+:\n\\(0\\)\n")) + #px"counterexample found after 1 attempt with clause at .*:\\d+:\\d+:\n\\(0\\)\n") + (test (redex-check lang any #t + #:attempts 1 + #:source mf + #:print? (not #t)) + #t) + (test (counterexample-term + (redex-check lang any (= (car (term any)) 42) + #:source mf + #:print? #f)) + '(0))) (let () (define-metafunction lang @@ -720,6 +752,14 @@ (E* hole E*) (n 4)) + (let ([R (reduction-relation + L + (--> 1 2) + (--> 2 3))]) + (test (check-reduction-relation R (λ (_) #t) #:print? #f) #t) + (test (counterexample-term (check-reduction-relation R (curry = 1) #:print? #f)) + 2)) + (let ([generated null] [R (reduction-relation L @@ -787,6 +827,11 @@ (define-metafunction empty [(n (side-condition any #f)) any]) + (test (check-metafunction m (λ (_) #t) #:print? #f) #t) + (test (counterexample-term + (check-metafunction m (compose (curry = 1) car) #:print? #f)) + '(2)) + (let ([generated null]) (test (begin (output From f8c78cb7520656532523aa3a2b86a252bea0787e Mon Sep 17 00:00:00 2001 From: Eli Barzilay Date: Thu, 28 Jan 2010 01:30:55 +0000 Subject: [PATCH 089/113] typo (PR10722) svn: r17859 --- collects/scribblings/gui/editor-overview.scrbl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/collects/scribblings/gui/editor-overview.scrbl b/collects/scribblings/gui/editor-overview.scrbl index b19728ba53..b6b6e253ad 100644 --- a/collects/scribblings/gui/editor-overview.scrbl +++ b/collects/scribblings/gui/editor-overview.scrbl @@ -530,7 +530,7 @@ When an editor is loaded and a header/footer record is encountered, be loaded. See also @method[editor<%> write-headers-to-file] and - @method[editor<%> write-headers-to-file]. + @method[editor<%> read-header-from-file]. @section[#:tag "editoreol"]{End of Line Ambiguity} From 2c192f5297061380bb3bff56f5d297850c936ddd Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Thu, 28 Jan 2010 01:31:37 +0000 Subject: [PATCH 090/113] support inlining of procedures with rest args svn: r17860 --- collects/tests/mzscheme/optimize.ss | 18 +++++- src/mzscheme/src/eval.c | 87 ++++++++++++++++++++--------- src/mzscheme/src/fun.c | 4 -- 3 files changed, 77 insertions(+), 32 deletions(-) diff --git a/collects/tests/mzscheme/optimize.ss b/collects/tests/mzscheme/optimize.ss index 7bc16202c1..4647044eb2 100644 --- a/collects/tests/mzscheme/optimize.ss +++ b/collects/tests/mzscheme/optimize.ss @@ -4,7 +4,8 @@ (Section 'optimization) (require scheme/flonum - scheme/fixnum) + scheme/fixnum + compiler/zo-parse) ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -564,7 +565,9 @@ [t2 (get-output-bytes s2)]) (or (bytes=? t1 t2) (begin - (printf "~s\n~s\n" t1 t2) + (printf "~s\n~s\n" + (zo-parse (open-input-bytes t1)) + (zo-parse (open-input-bytes t2))) #f ))))) @@ -656,6 +659,17 @@ '((lambda (x) x) 3)) (test-comp '(let ([x 3][y 4]) (+ x y)) '((lambda (x y) (+ x y)) 3 4)) +(test-comp '5 + '((lambda ignored 5) 3 4)) +(test-comp '5 + '(let ([f (lambda ignored 5)]) + (f 3 4))) +(test-comp '5 + '(let ([f (lambda (a . ignored) a)]) + (f 5 3 4))) +(test-comp '(let ([x (list 3 4)]) x) + '(let ([f (lambda (a . b) b)]) + (f 5 3 4))) (test-comp '(let ([x 1][y 2]) x) '1) diff --git a/src/mzscheme/src/eval.c b/src/mzscheme/src/eval.c index 6c88404a6f..3da262e03c 100644 --- a/src/mzscheme/src/eval.c +++ b/src/mzscheme/src/eval.c @@ -2435,10 +2435,12 @@ static Scheme_Object *apply_inlined(Scheme_Object *p, Scheme_Closure_Data *data, { Scheme_Let_Header *lh; Scheme_Compiled_Let_Value *lv, *prev = NULL; - int i; + int i, expected; int *flags, flag; - if (!argc) { + expected = data->num_params; + + if (!expected) { info = scheme_optimize_info_add_frame(info, 0, 0, 0); info->inline_fuel >>= 1; p = scheme_optimize_expr(p, info, context); @@ -2450,16 +2452,37 @@ static Scheme_Object *apply_inlined(Scheme_Object *p, Scheme_Closure_Data *data, lh = MALLOC_ONE_TAGGED(Scheme_Let_Header); lh->iso.so.type = scheme_compiled_let_void_type; - lh->count = argc; - lh->num_clauses = argc; + lh->count = expected; + lh->num_clauses = expected; - for (i = 0; i < argc; i++) { + for (i = 0; i < expected; i++) { lv = MALLOC_ONE_TAGGED(Scheme_Compiled_Let_Value); lv->so.type = scheme_compiled_let_value_type; lv->count = 1; lv->position = i; - if (app) + if ((i == expected - 1) + && (SCHEME_CLOSURE_DATA_FLAGS(data) & CLOS_HAS_REST)) { + int j; + Scheme_Object *l = scheme_null, *val; + + for (j = argc; j-- > i; ) { + if (app) + val = app->args[j + 1]; + else if (app3) + val = (j ? app3->rand2 : app3->rand1); + else if (app2) + val = app2->rand; + else + val = scheme_false; + + l = cons(val, l); + } + l = cons(scheme_list_proc, l); + val = make_application(l); + + lv->value = val; + } else if (app) lv->value = app->args[i + 1]; else if (app3) lv->value = (i ? app3->rand2 : app3->rand1); @@ -2536,20 +2559,22 @@ Scheme_Object *optimize_for_inline(Optimize_Info *info, Scheme_Object *le, int a Scheme_Closure_Data *data = (Scheme_Closure_Data *)le; int sz; - if (!app && !app2 && !app3) { + if (!app && !app2 && !app3) return le; - } *_flags = SCHEME_CLOSURE_DATA_FLAGS(data); - - if ((data->num_params == argc) || (!app && !app2 && !app3)) { + + if ((data->num_params == argc) + || ((SCHEME_CLOSURE_DATA_FLAGS(data) & CLOS_HAS_REST) + && (argc + 1 >= data->num_params)) + || (!app && !app2 && !app3)) { int threshold; sz = scheme_closure_body_size(data, 1, info); threshold = info->inline_fuel * (2 + argc); if ((sz >= 0) && (single_use || (sz <= threshold))) { - le = scheme_optimize_clone(0, data->code, info, offset, argc); + le = scheme_optimize_clone(0, data->code, info, offset, data->num_params); if (le) { LOG_INLINE(fprintf(stderr, "Inline %d %d %s\n", sz, single_use, data->name ? scheme_write_to_string(data->name, NULL) : "???")); return apply_inlined(le, data, info, argc, app, app2, app3, context); @@ -2562,11 +2587,8 @@ Scheme_Object *optimize_for_inline(Optimize_Info *info, Scheme_Object *le, int a info->inline_fuel, info->use_psize)); } } else { - if (!(SCHEME_CLOSURE_DATA_FLAGS(data) & CLOS_HAS_REST) - || (argc + 1 < data->num_params)) { - /* Issue warning below */ - bad_app = (Scheme_Object *)data; - } + /* Issue warning below */ + bad_app = (Scheme_Object *)data; } } @@ -3725,6 +3747,8 @@ static Scheme_Object *optimize_branch(Scheme_Object *o, Optimize_Info *info, int } } + t = scheme_optimize_expr(t, info, OPT_CONTEXT_BOOLEAN); + /* Try optimize: (if (not x) y z) => (if x z y) */ while (1) { if (SAME_TYPE(SCHEME_TYPE(t), scheme_application2_type)) { @@ -3742,8 +3766,6 @@ static Scheme_Object *optimize_branch(Scheme_Object *o, Optimize_Info *info, int break; } - t = scheme_optimize_expr(t, info, OPT_CONTEXT_BOOLEAN); - info->vclock += 1; /* model branch as clock increment */ if (SCHEME_TYPE(t) > _scheme_compiled_values_types_) { @@ -6726,7 +6748,7 @@ compile_expand_app(Scheme_Object *forms, Scheme_Comp_Env *env, name = scheme_check_immediate_macro(name, env, rec, drec, 0, &gval, NULL, NULL); - /* look for ((lambda (x) ...) ...); */ + /* look for ((lambda (x ...) ....) ....) or ((lambda x ....) ....) */ if (SAME_OBJ(gval, scheme_lambda_syntax)) { Scheme_Object *argsnbody; @@ -6740,15 +6762,15 @@ compile_expand_app(Scheme_Object *forms, Scheme_Comp_Env *env, if (SCHEME_STX_PAIRP(body)) { int pl; pl = scheme_stx_proper_list_length(args); - if (pl >= 0) { + if ((pl >= 0) || SCHEME_STX_SYMBOLP(args)) { Scheme_Object *bindings = scheme_null, *last = NULL; Scheme_Object *rest; int al; - + rest = SCHEME_STX_CDR(form); al = scheme_stx_proper_list_length(rest); - if (al == pl) { + if ((pl < 0) || (al == pl)) { DupCheckRecord r; scheme_begin_dup_symbol_check(&r, env); @@ -6756,7 +6778,10 @@ compile_expand_app(Scheme_Object *forms, Scheme_Comp_Env *env, while (!SCHEME_STX_NULLP(args)) { Scheme_Object *v, *n; - n = SCHEME_STX_CAR(args); + if (pl < 0) + n = args; + else + n = SCHEME_STX_CAR(args); scheme_check_identifier("lambda", n, NULL, env, name); /* If we don't check here, the error is in terms of `let': */ @@ -6765,7 +6790,12 @@ compile_expand_app(Scheme_Object *forms, Scheme_Comp_Env *env, /* Propagate certifications to bound id: */ n = scheme_stx_cert(n, NULL, NULL, name, NULL, 1); - v = SCHEME_STX_CAR(rest); + if (pl < 0) { + v = scheme_intern_symbol("list"); + v = scheme_datum_to_syntax(v, scheme_false, scheme_sys_wraps(env), 0, 0); + v = cons(v, rest); + } else + v = SCHEME_STX_CAR(rest); v = cons(cons(cons(n, scheme_null), cons(v, scheme_null)), scheme_null); if (last) SCHEME_CDR(last) = v; @@ -6773,8 +6803,13 @@ compile_expand_app(Scheme_Object *forms, Scheme_Comp_Env *env, bindings = v; last = v; - args = SCHEME_STX_CDR(args); - rest = SCHEME_STX_CDR(rest); + if (pl < 0) { + /* rator is (lambda rest-x ....) */ + break; + } else { + args = SCHEME_STX_CDR(args); + rest = SCHEME_STX_CDR(rest); + } } body = scheme_datum_to_syntax(icons(begin_symbol, body), form, diff --git a/src/mzscheme/src/fun.c b/src/mzscheme/src/fun.c index e3fbcbeb6d..86e35a220a 100644 --- a/src/mzscheme/src/fun.c +++ b/src/mzscheme/src/fun.c @@ -1242,10 +1242,6 @@ int scheme_closure_body_size(Scheme_Closure_Data *data, int check_assign, Optimi cl = (Closure_Info *)data->closure_map; if (check_assign) { - /* Don't try to inline if there's a rest arg: */ - if (SCHEME_CLOSURE_DATA_FLAGS(data) & CLOS_HAS_REST) - return -1; - /* Don't try to inline if any arguments are mutated: */ for (i = data->num_params; i--; ) { if (cl->local_flags[i] & SCHEME_WAS_SET_BANGED) From 6bf7c9287fff199fa69aedecb2336a6d78499434 Mon Sep 17 00:00:00 2001 From: Eli Barzilay Date: Thu, 28 Jan 2010 08:50:24 +0000 Subject: [PATCH 091/113] Welcome to a new PLT day. svn: r17863 --- collects/repos-time-stamp/stamp.ss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/collects/repos-time-stamp/stamp.ss b/collects/repos-time-stamp/stamp.ss index 246e091138..7c85c06189 100644 --- a/collects/repos-time-stamp/stamp.ss +++ b/collects/repos-time-stamp/stamp.ss @@ -1 +1 @@ -#lang scheme/base (provide stamp) (define stamp "27jan2010") +#lang scheme/base (provide stamp) (define stamp "28jan2010") From e1f931038d82f9b8fedb8a08ab810aea7ca6c7ca Mon Sep 17 00:00:00 2001 From: Matthias Felleisen Date: Thu, 28 Jan 2010 17:04:19 +0000 Subject: [PATCH 092/113] history updated, please propagate to release branch svn: r17864 --- doc/release-notes/teachpack/HISTORY.txt | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/doc/release-notes/teachpack/HISTORY.txt b/doc/release-notes/teachpack/HISTORY.txt index ae902a89c9..438c8629c4 100644 --- a/doc/release-notes/teachpack/HISTORY.txt +++ b/doc/release-notes/teachpack/HISTORY.txt @@ -1,3 +1,13 @@ +------------------------------------------------------------------------ +Version 4.2.4 [Thu Jan 28 12:02:01 EST 2010] + +* separated 2htdp/universe from htdp/image +* 2htdp/universe contains some stupid hacks to improve performance + -- to be changed with Matthew's advice +* error modified +* added a bunch of primitives for JPR +* fixed some other bugs + ------------------------------------------------------------------------ Version 4.2.3 [Sun Nov 22 19:25:01 EST 2009] From a09e671f347d4f1d2b5f8937df5ab26f135f7f5f Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Thu, 28 Jan 2010 17:51:30 +0000 Subject: [PATCH 093/113] allow radio-box% to have no selected buttons svn: r17865 --- collects/mred/private/check.ss | 2 +- collects/mred/private/mritem.ss | 33 +++++++++++-------- collects/scribblings/gui/blurbs.ss | 2 +- .../scribblings/gui/radio-box-class.scrbl | 18 +++++----- collects/tests/mred/item.ss | 5 ++- doc/release-notes/mred/HISTORY.txt | 7 ++++ src/mred/wxs/range.xci | 3 ++ src/mred/wxs/wxs_chce.cxx | 1 + src/mred/wxs/wxs_lbox.cxx | 1 + src/mred/wxs/wxs_rado.cxx | 3 +- src/mred/wxs/wxs_rado.xc | 2 +- src/mred/wxs/wxs_tabc.cxx | 1 + src/wxmac/src/mac/wx_rbox.cc | 10 +++--- src/wxwindow/src/msw/wx_rbox.cxx | 5 +-- src/wxxt/src/Windows/RadioBox.cc | 8 ++--- 15 files changed, 64 insertions(+), 37 deletions(-) diff --git a/collects/mred/private/check.ss b/collects/mred/private/check.ss index 9872d3550e..d46c1996d1 100644 --- a/collects/mred/private/check.ss +++ b/collects/mred/private/check.ss @@ -117,7 +117,7 @@ (unless (and (integer? i) (exact? i) (not (negative? i))) (raise-type-error (who->name who) (if false-ok? - "non-negative exact integeror #f" + "non-negative exact integer or #f" "non-negative exact integer" ) i)))) diff --git a/collects/mred/private/mritem.ss b/collects/mred/private/mritem.ss index 226d144d1a..31231d5c1e 100644 --- a/collects/mred/private/mritem.ss +++ b/collects/mred/private/mritem.ss @@ -264,40 +264,47 @@ (check-container-parent cwho parent) (check-callback cwho callback) (check-orientation cwho style) - (check-non-negative-integer cwho selection))) + (check-non-negative-integer/false cwho selection))) (private-field [wx #f]) (private [check-button - (lambda (method n) - (check-non-negative-integer `(method radio-box% ,method) n) - (unless (< n (length chcs)) - (raise-mismatch-error (who->name `(method radio-box% ,method)) "no such button: " n)))]) + (lambda (method n false-ok?) + ((if false-ok? + check-non-negative-integer/false + check-non-negative-integer) + `(method radio-box% ,method) n) + (when n + (unless (< n (length chcs)) + (raise-mismatch-error (who->name `(method radio-box% ,method)) "no such button: " n))))]) (override [enable (entry-point (case-lambda [(on?) (send wx enable on?)] - [(which on?) (check-button 'enable which) + [(which on?) (check-button 'enable which #f) (send wx enable which on?)]))] [is-enabled? (entry-point (case-lambda [() (send wx is-enabled?)] - [(which) (check-button 'is-enabled? which) + [(which) (check-button 'is-enabled? which #f) (send wx is-enabled? which)]))]) (public [get-number (lambda () (length chcs))] [get-item-label (lambda (n) - (check-button 'get-item-label n) + (check-button 'get-item-label n #f) (list-ref chcs n))] [get-item-plain-label (lambda (n) - (check-button 'get-item-plain-label n) + (check-button 'get-item-plain-label n #f) (wx:label->plain-label (list-ref chcs n)))] - [get-selection (entry-point (lambda () (send wx get-selection)))] + [get-selection (entry-point (lambda () (let ([v (send wx get-selection)]) + (if (equal? v -1) + #f + v))))] [set-selection (entry-point (lambda (v) - (check-button 'set-selection v) - (send wx set-selection v)))]) + (check-button 'set-selection v #t) + (send wx set-selection (or v -1))))]) (sequence (as-entry (lambda () @@ -317,7 +324,7 @@ (length choices)) selection)))) label parent callback #f))) - (when (positive? selection) + (when (or (not selection) (positive? selection)) (set-selection selection))))) (define slider% diff --git a/collects/scribblings/gui/blurbs.ss b/collects/scribblings/gui/blurbs.ss index 72800aaa37..a9210b9460 100644 --- a/collects/scribblings/gui/blurbs.ss +++ b/collects/scribblings/gui/blurbs.ss @@ -203,7 +203,7 @@ information@|details|, even if the editor currently has delayed refreshing (see monitor @|whatsit| changes.}) (define (MonitorCallbackX a b c d) - (MonitorMethod a b @elem{the @|d|callback procedure (provided as an initialization argument)} c)) + (MonitorMethod a b @elem{the @|d| callback procedure (provided as an initialization argument)} c)) (define (MonitorCallback a b c) (MonitorCallbackX a b c "control")) diff --git a/collects/scribblings/gui/radio-box-class.scrbl b/collects/scribblings/gui/radio-box-class.scrbl index a9bc3275b7..17958e7aa7 100644 --- a/collects/scribblings/gui/radio-box-class.scrbl +++ b/collects/scribblings/gui/radio-box-class.scrbl @@ -28,7 +28,7 @@ Whenever the user changes the selected radio button, the radio box's 'vertical-label 'horizontal-label 'deleted)) '(vertical)] - [selection exact-nonnegative-integer? 0] + [selection (or/c exact-nonnegative-integer? #f) 0] [font (is-a?/c font%) normal-control-font] [enabled any/c #t] [vert-margin (integer-in 0 1000) 2] @@ -64,8 +64,9 @@ The @scheme[style] argument must include either @scheme['vertical] for a @HVLabelNote[@scheme[style]]{radio box} @DeletedStyleNote[@scheme[style] @scheme[parent]]{radio box} By default, the first radio button is initially selected. If - @scheme[selection] is positive, it is passed to @method[radio-box% - set-selection] to set the initial radio button selection. + @scheme[selection] is positive or @scheme[#f], it is passed to + @method[radio-box% set-selection] to set the initial radio button + selection. @FontKWs[@scheme[font]] @WindowKWs[@scheme[enabled]] @SubareaKWs[] @AreaKWs[] @@ -115,10 +116,10 @@ Returns the number of radio buttons in the radio box. } @defmethod[(get-selection) - exact-nonnegative-integer?]{ + (or/c exact-nonnegative-integer? #f)]{ -Gets the position of the selected radio button. Radio buttons are -numbered from @scheme[0]. +Gets the position of the selected radio button, returning @scheme[#f] +if no button is selected. Radio buttons are numbered from @scheme[0]. } @@ -139,10 +140,11 @@ box, @|MismatchExn|. } -@defmethod[(set-selection [n exact-nonnegative-integer?]) +@defmethod[(set-selection [n (or/c exact-nonnegative-integer? #f)]) void?]{ -Sets the selected radio button by position. (The control's callback +Sets the selected radio button by position, or deselects all radio + buttons if @scheme[n] is @scheme[#f]. (The control's callback procedure is @italic{not} invoked.) Radio buttons are numbered from @scheme[0]. If @scheme[n] is equal to or larger than the number of radio buttons in the radio box, @|MismatchExn|. diff --git a/collects/tests/mred/item.ss b/collects/tests/mred/item.ss index 4dd6fd1bfb..f9ff3383b2 100644 --- a/collects/tests/mred/item.ss +++ b/collects/tests/mred/item.ss @@ -1299,6 +1299,7 @@ (define mismatch-err (mk-err exn:fail:contract?)) (define do-sel (lambda (sel n) (for-each (lambda (rb) (sel rb (n rb))) rbs))) + (define sel-false (lambda (sel) (do-sel sel (lambda (rb) #f)))) (define sel-minus (lambda (sel) (do-sel (type-err sel) (lambda (rb) -1)))) (define sel-first (lambda (sel) (do-sel sel (lambda (rb) 0)))) (define sel-middle (lambda (sel) (do-sel sel (lambda (rb) (floor (/ (send rb get-number) 2)))))) @@ -1311,7 +1312,9 @@ (make-object button% (format "Select First~a" title) hp2 (lambda (b e) (sel-first sel))) (make-object button% (format "Select Middle ~a" title) hp2 (lambda (b e) (sel-middle sel))) (make-object button% (format "Select Last~a" title) hp2 (lambda (b e) (sel-last sel))) - (make-object button% (format "Select N~a" title) hp2 (lambda (b e) (sel-N sel)))) + (make-object button% (format "Select N~a" title) hp2 (lambda (b e) (sel-N sel))) + (when (equal? title "") + (make-object button% (format "Select #f~a" title) hp2 (lambda (b e) (sel-false sel))))) (make-selectors "" normal-sel) (make-selectors " by Simulate" simulate-sel) (make-object button% "Check" p diff --git a/doc/release-notes/mred/HISTORY.txt b/doc/release-notes/mred/HISTORY.txt index cd20d38c70..0a1e5ca65f 100644 --- a/doc/release-notes/mred/HISTORY.txt +++ b/doc/release-notes/mred/HISTORY.txt @@ -1,3 +1,10 @@ +Version 4.2.4.1 + +Changed radio-box% to allow #f as a selection so that no buttons are + selected + +---------------------------------------------------------------------- + Version 4.2.4, January 2010 Minor bug fixes diff --git a/src/mred/wxs/range.xci b/src/mred/wxs/range.xci index d9d0807da0..7b8b2d70d7 100644 --- a/src/mred/wxs/range.xci +++ b/src/mred/wxs/range.xci @@ -3,3 +3,6 @@ @MACRO RANGERET[p.rv] = if ((x

            < 0) || (x

            >= THISOBJECT->Number())) { READY_TO_RETURN; return ; } @MACRO RANGE[p] = $$RANGERET[

            .scheme_void] + +@MACRO RANGEXRET[p.rv] = if ((x

            < -1) || (x

            >= THISOBJECT->Number())) { READY_TO_RETURN; return ; } +@MACRO RANGEX[p] = $$RANGEXRET[

            .scheme_void] diff --git a/src/mred/wxs/wxs_chce.cxx b/src/mred/wxs/wxs_chce.cxx index 227a37a41c..519baf1cc6 100644 --- a/src/mred/wxs/wxs_chce.cxx +++ b/src/mred/wxs/wxs_chce.cxx @@ -251,6 +251,7 @@ static l_TYPE l_POINT *l_MAKE_ARRAY(Scheme_Object *l, l_INTTYPE *c, char *who) + class os_wxChoice : public wxChoice { public: Scheme_Object *callback_closure; diff --git a/src/mred/wxs/wxs_lbox.cxx b/src/mred/wxs/wxs_lbox.cxx index 9b407808c6..915aae2844 100644 --- a/src/mred/wxs/wxs_lbox.cxx +++ b/src/mred/wxs/wxs_lbox.cxx @@ -289,6 +289,7 @@ static l_TYPE l_POINT *l_MAKE_ARRAY(Scheme_Object *l, l_INTTYPE *c, char *who) + class os_wxListBox : public wxListBox { public: Scheme_Object *callback_closure; diff --git a/src/mred/wxs/wxs_rado.cxx b/src/mred/wxs/wxs_rado.cxx index 10816ea348..50d6ceb8cc 100644 --- a/src/mred/wxs/wxs_rado.cxx +++ b/src/mred/wxs/wxs_rado.cxx @@ -345,6 +345,7 @@ static l_TYPE l_POINT *l_MAKE_ARRAY(Scheme_Object *l, l_INTTYPE *c, char *who) + class os_wxRadioBox : public wxRadioBox { public: Scheme_Object *callback_closure; @@ -706,7 +707,7 @@ static Scheme_Object *os_wxRadioBoxSetSelection(int n, Scheme_Object *p[]) x0 = WITH_VAR_STACK(objscheme_unbundle_integer(p[POFFSET+0], "set-selection in radio-box%")); - if ((x0 < 0) || (x0 >= THISOBJECT->Number())) { READY_TO_RETURN; return scheme_void; } + if ((x0 < -1) || (x0 >= THISOBJECT->Number())) { READY_TO_RETURN; return scheme_void; } WITH_VAR_STACK(((wxRadioBox *)((Scheme_Class_Object *)p[0])->primdata)->SetSelection(x0)); diff --git a/src/mred/wxs/wxs_rado.xc b/src/mred/wxs/wxs_rado.xc index 3208c8691e..04f1bc90ab 100644 --- a/src/mred/wxs/wxs_rado.xc +++ b/src/mred/wxs/wxs_rado.xc @@ -48,7 +48,7 @@ @ "get-selection" : int GetSelection(); @ "number" : int Number() -@ "set-selection" : void SetSelection(int); : : /RANGE[0] +@ "set-selection" : void SetSelection(int); : : /RANGEX[0] @ "enable" : void Enable(int,bool); : : /RANGE[0] <> single-button @ "enable" : void Enable(bool); <> all-buttons diff --git a/src/mred/wxs/wxs_tabc.cxx b/src/mred/wxs/wxs_tabc.cxx index 497bf18388..7fc3ba40cb 100644 --- a/src/mred/wxs/wxs_tabc.cxx +++ b/src/mred/wxs/wxs_tabc.cxx @@ -274,6 +274,7 @@ static int unbundle_symset_tabStyle(Scheme_Object *v, const char *where) { + class os_wxTabChoice : public wxTabChoice { public: Scheme_Object *callback_closure; diff --git a/src/wxmac/src/mac/wx_rbox.cc b/src/wxmac/src/mac/wx_rbox.cc index e85a1f3795..49cd26a2da 100644 --- a/src/wxmac/src/mac/wx_rbox.cc +++ b/src/wxmac/src/mac/wx_rbox.cc @@ -282,7 +282,7 @@ void wxRadioBox::SetSelection(int N) numberItems = cRadioButtons->Number(); - if (0 <= N && N < numberItems) { + if (-1 <= N && N < numberItems) { if (selected != N) { if (0 <= selected && selected < numberItems) { selectedNode = cRadioButtons->Nth(selected); @@ -290,9 +290,11 @@ void wxRadioBox::SetSelection(int N) selectedRadioButton->SetValue(FALSE); } - node = cRadioButtons->Nth(N); - radioButton = (wxRadioButton*)node->Data(); - radioButton->SetValue(TRUE); + if (N != -1) { + node = cRadioButtons->Nth(N); + radioButton = (wxRadioButton*)node->Data(); + radioButton->SetValue(TRUE); + } selected = N; } diff --git a/src/wxwindow/src/msw/wx_rbox.cxx b/src/wxwindow/src/msw/wx_rbox.cxx index 1db07f443b..aa312f6f07 100644 --- a/src/wxwindow/src/msw/wx_rbox.cxx +++ b/src/wxwindow/src/msw/wx_rbox.cxx @@ -424,7 +424,7 @@ void wxRadioBox::SetButton(int which, int value) void wxRadioBox::SetSelection(int N) { - if ((N < 0) || (N >= no_items)) + if ((N < -1) || (N >= no_items)) return; if (N == selected) @@ -433,7 +433,8 @@ void wxRadioBox::SetSelection(int N) if (selected >= 0 && selected < no_items) SetButton(selected, 0); - SetButton(N, 1); + if (N != -1) + SetButton(N, 1); selected = N; } diff --git a/src/wxxt/src/Windows/RadioBox.cc b/src/wxxt/src/Windows/RadioBox.cc index ff64a1ef26..cdd6285129 100644 --- a/src/wxxt/src/Windows/RadioBox.cc +++ b/src/wxxt/src/Windows/RadioBox.cc @@ -134,8 +134,7 @@ Bool wxRadioBox::Create(wxPanel *panel, wxFunction func, char *label, X->frame = wgt; // create group widget, which holds the toggles wgt = XtVaCreateManagedWidget("radiobox", xfwfGroupWidgetClass, X->frame, - XtNselectionStyle, (style & wxAT_MOST_ONE) ? - XfwfSingleSelection : XfwfOneSelection, + XtNselectionStyle, XfwfSingleSelection, XtNstoreByRow, FALSE, XtNlabel, NULL, XtNframeWidth, 0, @@ -265,8 +264,7 @@ Bool wxRadioBox::Create(wxPanel *panel, wxFunction func, char *label, // create group widget, which holds the toggles wgt = XtVaCreateManagedWidget("radiobox", xfwfGroupWidgetClass, X->frame, - XtNselectionStyle, (style & wxAT_MOST_ONE) ? - XfwfSingleSelection : XfwfOneSelection, + XtNselectionStyle, XfwfSingleSelection, XtNstoreByRow, FALSE, XtNlabel, NULL, XtNframeWidth, 0, @@ -518,7 +516,7 @@ void wxRadioBox::SetLabel(int item, wxBitmap *bitmap) void wxRadioBox::SetSelection(int item) { - if (0 <= item && item < num_toggles) + if (-1 <= item && item < num_toggles) XtVaSetValues(X->handle, XtNselection, (long)item, NULL); } From 11c87c75e130a75d6433ff847171682be4043d6a Mon Sep 17 00:00:00 2001 From: John Clements Date: Thu, 28 Jan 2010 18:09:52 +0000 Subject: [PATCH 094/113] minor typo fix an/and svn: r17866 --- collects/scribblings/reference/sandbox.scrbl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/collects/scribblings/reference/sandbox.scrbl b/collects/scribblings/reference/sandbox.scrbl index e36db71e3b..7148aea2e2 100644 --- a/collects/scribblings/reference/sandbox.scrbl +++ b/collects/scribblings/reference/sandbox.scrbl @@ -811,7 +811,7 @@ in a way that depends on the setting of @scheme[(sandbox-output)] or Retrieves uncovered expression from an evaluator, as longs as the @scheme[sandbox-coverage-enabled] parameter had a true value when the -evaluator was created. Otherwise, and exception is raised to indicate +evaluator was created. Otherwise, an exception is raised to indicate that no coverage information is available. The @scheme[prog?] argument specifies whether to obtain expressions that From 43bf186d533bd8cb79ac445b9ec74768acdda778 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Thu, 28 Jan 2010 18:49:08 +0000 Subject: [PATCH 095/113] byte zo reader to allow syntax objects within literal hash tables svn: r17867 --- src/mzscheme/src/read.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/mzscheme/src/read.c b/src/mzscheme/src/read.c index e28db07262..e7b2fff578 100644 --- a/src/mzscheme/src/read.c +++ b/src/mzscheme/src/read.c @@ -4705,6 +4705,8 @@ static Scheme_Object *read_compact(CPort *port, int use_stack) break; case CPT_STX: { + Scheme_Hash_Table *save_ht; + if (!port->ut) { Scheme_Unmarshal_Tables *ut; Scheme_Hash_Table *rht; @@ -4725,8 +4727,8 @@ static Scheme_Object *read_compact(CPort *port, int use_stack) port->ut->rns = rht; } - if (*port->ht) - scheme_ill_formed_code(port); + save_ht = *port->ht; + *port->ht = NULL; v = read_compact(port, 1); @@ -4738,6 +4740,8 @@ static Scheme_Object *read_compact(CPort *port, int use_stack) 0, 0); } + *port->ht = save_ht; + v = scheme_unmarshal_datum_to_syntax(v, port->ut, 0); scheme_num_read_syntax_objects++; if (!v) From b5cada4811891cc58a72211606f50f3932687761 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Thu, 28 Jan 2010 18:56:21 +0000 Subject: [PATCH 096/113] suppress setup-plt scribble 'using' messages, unless in verbose mode svn: r17868 --- collects/setup/scribble.ss | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/collects/setup/scribble.ss b/collects/setup/scribble.ss index 1cb1e5ebe2..6f2baa92b3 100644 --- a/collects/setup/scribble.ss +++ b/collects/setup/scribble.ss @@ -427,10 +427,11 @@ (memq 'depends-all-main (doc-flags doc))) (and auto-user? (memq 'depends-all (doc-flags doc)))))]) - (setup-printf - (cond [up-to-date? "using"] [can-run? "running"] [else "skipping"]) - "~a" - (path->name (doc-src-file doc))) + (when (or (not up-to-date?) (verbose)) + (setup-printf + (cond [up-to-date? "using"] [can-run? "running"] [else "skipping"]) + "~a" + (path->name (doc-src-file doc)))) (if up-to-date? ;; Load previously calculated info: (render-time From 076d680faab918465e05a6d8d3a94526cbfb17b9 Mon Sep 17 00:00:00 2001 From: Robby Findler Date: Thu, 28 Jan 2010 20:34:07 +0000 Subject: [PATCH 097/113] escape no longer quits during splash screen, not control-q does svn: r17869 --- collects/drscheme/private/drscheme-normal.ss | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/collects/drscheme/private/drscheme-normal.ss b/collects/drscheme/private/drscheme-normal.ss index fb30bed566..b1a9386fb9 100644 --- a/collects/drscheme/private/drscheme-normal.ss +++ b/collects/drscheme/private/drscheme-normal.ss @@ -78,7 +78,9 @@ (set-splash-char-observer (λ (evt) (let ([ch (send evt get-key-code)]) - (when (equal? ch 'escape) (exit)) + (when (and (eq? ch #\q) + (send evt get-control-down)) + (exit)) (when (char? ch) ;; as soon as something is typed, load the bitmaps (load-magic-images) From f14118c0759d6a80f167620e03550c566be98972 Mon Sep 17 00:00:00 2001 From: Ryan Culpepper Date: Thu, 28 Jan 2010 21:08:02 +0000 Subject: [PATCH 098/113] syntax/parse: added syntax/parse/experimental svn: r17873 --- collects/syntax/parse/experimental.ss | 94 +++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 collects/syntax/parse/experimental.ss diff --git a/collects/syntax/parse/experimental.ss b/collects/syntax/parse/experimental.ss new file mode 100644 index 0000000000..90ca5cdf76 --- /dev/null +++ b/collects/syntax/parse/experimental.ss @@ -0,0 +1,94 @@ +#lang scheme/base +(require (for-syntax scheme/base + syntax/parse + syntax/private/stxparse/rep-data)) +(provide define-primitive-splicing-syntax-class) + +(define-syntax (define-primitive-splicing-syntax-class stx) + + (define-syntax-class attr + (pattern name:id + #:with depth #'0) + (pattern [name:id depth:nat])) + + (syntax-parse stx + [(dssp (name:id param:id ...) + (~or (~once (~seq #:attrs (a:attr ...)) + #:name "attributes declaration") + (~once (~seq #:description description) + #:name "description declaration")) ... + proc:expr) + #'(begin + (define (get-description param ...) + description) + (define parser + (lambda (stx param ...) + (let/ec escape + ((mk-check-result 'name '(a.name ...) stx) + (proc stx + (lambda ([msg #f]) + (escape + (if msg + `#s(expect:message ,msg) + `#s(expect:thing + ,(get-description param ...) #f #f))))))))) + (define-syntax name + (make-stxclass 'name '(param ...) + '(#s(attr a.name a.depth #f) ...) + (quote-syntax parser) + (quote-syntax get-description) + #t)))])) + + +(define (mk-check-result name attr-names stx) + (lambda (result) + (unless (list? result) + (error name "parser returned non-list")) + (let ([rlength (length result)]) + (unless (= rlength (+ 2 (length attr-names))) + (error name "parser returned list of wrong length; expected length ~s, got ~e" + (+ 2 (length attr-names)) + result)) + (unless (exact-nonnegative-integer? (cadr result)) + (error name "expected exact nonnegative integer for second element of result list, got ~e" + (cadr result))) + (list* (car result) + (nat->dfc (cadr result) stx) + (cddr result))))) + +(define (nat->dfc nat stx) + (if (zero? nat) + `#s(dfc:empty ,stx) + `#s(dfc:cdr #s(dfc:empty ,stx) ,nat))) + + +#| + +(define-primitive-splicing-syntax-class (name param ...) + #:attrs (attr-decl ...) + #:description description-expr + proc) + +'proc' must take two arguments, 'stx' and 'fail', where 'fail' is an +escaping procedure that indicates failure. 'fail' takes an optional +argument, an error message to attach to the failure. If no message is +given, the syntax class description is used. + +'proc' must return a list of 2+|attrs| elements. The first element is +the rest of the input syntax. The second element is the number of +elements consumed from the input. The rest are the attribute values, +in the same order as given in the #:attrs directive. + +Example: + +(define-primitive-splicing-syntax-class (a-expr) + #:attrs (x) + #:description "a-expr" + (lambda (stx fail) + (syntax-case stx () + [(a b c . rest) + (list #'rest 3 #'(printf "got an A\n"))] + [_ + (fail)]))) + +|# From 6848b8f6febe6083a09708bfddc2c35847023b91 Mon Sep 17 00:00:00 2001 From: Robby Findler Date: Thu, 28 Jan 2010 21:41:04 +0000 Subject: [PATCH 099/113] first attempt at a new language dialog svn: r17874 --- .../private/language-configuration.ss | 223 +++++++++++++----- 1 file changed, 160 insertions(+), 63 deletions(-) diff --git a/collects/drscheme/private/language-configuration.ss b/collects/drscheme/private/language-configuration.ss index 0c4ffd5d82..d1ba66798e 100644 --- a/collects/drscheme/private/language-configuration.ss +++ b/collects/drscheme/private/language-configuration.ss @@ -19,6 +19,11 @@ (define original-output (current-output-port)) (define (printfo . args) (apply fprintf original-output args)) + (define sc-use-language-in-source "Use the language declared in the source") + (define sc-choose-a-language "Choose a language") + (define sc-lang-in-source-discussion + "Typically, a #lang line at the start of a program declares its language. This is the default and preferred mode for DrScheme.") + (provide language-configuration@) (define-unit language-configuration@ @@ -358,7 +363,42 @@ (send this on-click-always #t))) (define outermost-panel (make-object horizontal-pane% parent)) - (define languages-hier-list (make-object selectable-hierlist% outermost-panel)) + (define languages-choice-panel (new vertical-panel% + [parent outermost-panel] + [alignment '(left top)])) + + (define use-language-in-source-rb + (new radio-box% + [label #f] + [choices (list sc-use-language-in-source)] + [parent languages-choice-panel] + [callback + (λ (rb evt) + (module-language-selected) + (send use-chosen-language-rb set-selection #f))])) + (define in-source-discussion-panel (new horizontal-panel% + [parent languages-choice-panel] + [stretchable-height #f])) + (define in-source-discussion-spacer (new horizontal-panel% + [parent in-source-discussion-panel] + [stretchable-width #f] + [min-width 24])) + (define stupid-internal-definition-syntax1 (add-discussion in-source-discussion-panel)) + (define use-chosen-language-rb + (new radio-box% + [label #f] + [choices (list sc-choose-a-language)] + [parent languages-choice-panel] + [callback + (λ (this-rb evt) + (send use-language-in-source-rb set-selection #f))])) + (define languages-hier-list-panel (new horizontal-panel% [parent languages-choice-panel])) + (define languages-hier-list-spacer (new horizontal-panel% + [parent languages-hier-list-panel] + [stretchable-width #f] + [min-width 24])) + + (define languages-hier-list (make-object selectable-hierlist% languages-hier-list-panel)) (define details-outer-panel (make-object vertical-pane% outermost-panel)) (define details/manual-parent-panel (make-object vertical-panel% details-outer-panel)) (define details-panel (make-object panel:single% details/manual-parent-panel)) @@ -395,15 +435,31 @@ (init-rest args) (public selected) (define (selected) - (let ([ldp (get-language-details-panel)]) - (when ldp - (send details-panel active-child ldp))) - (send one-line-summary-message set-label (send language get-one-line-summary)) - (send revert-to-defaults-button enable #t) - (set! get/set-selected-language-settings get/set-settings) - (set! selected-language language)) + (send use-chosen-language-rb set-selection 0) + (send use-language-in-source-rb set-selection #f) + (update-gui-based-on-selected-language language get-language-details-panel get/set-settings)) (apply super-make-object args)))) + (define (update-gui-based-on-selected-language language get-language-details-panel get/set-settings) + (let ([ldp (get-language-details-panel)]) + (when ldp + (send details-panel active-child ldp))) + (send one-line-summary-message set-label (send language get-one-line-summary)) + (send revert-to-defaults-button enable #t) + (set! get/set-selected-language-settings get/set-settings) + (set! selected-language language)) + + (define (module-language-selected) + ;; need to deselect things in the languages-hier-list at this point. + ;(send languages-hier-list select #f) + (update-gui-based-on-selected-language module-language*language + module-language*get-language-details-panel + module-language*get/set-settings)) + + (define module-language*language 'module-language*-not-yet-set) + (define module-language*get-language-details-panel 'module-language*-not-yet-set) + (define module-language*get/set-settings 'module-language*-not-yet-set) + ;; nothing-selected : -> void ;; updates the GUI and selected-language and get/set-selected-language-settings ;; for when no language is selected. @@ -488,17 +544,7 @@ [get-language-details-panel (lambda () language-details-panel)] [get/set-settings (lambda x (apply real-get/set-settings x))] [position (car positions)] - [number (car numbers)] - [mixin (compose - number-mixin - (language-mixin language get-language-details-panel get/set-settings))] - [item - (send hier-list new-item - (if second-number - (compose second-number-mixin mixin) - mixin))] - [text (send item get-editor)] - [delta (send language get-style-delta)]) + [number (car numbers)]) (set! construct-details (let ([old construct-details]) @@ -529,24 +575,40 @@ [else (get/set-settings (send language default-settings))]))))) - (send item set-number number) - (when second-number - (send item set-second-number second-number)) - (send text insert position) - (when delta - (cond - [(list? delta) - (for-each (λ (x) - (send text change-style - (car x) - (cadr x) - (caddr x))) - delta)] - [(is-a? delta style-delta%) - (send text change-style - (send language get-style-delta) - 0 - (send text last-position))])))] + (cond + [(equal? positions '("Module")) + (set! module-language*language language) + (set! module-language*get-language-details-panel get-language-details-panel) + (set! module-language*get/set-settings get/set-settings)] + [else + (let* ([mixin (compose + number-mixin + (language-mixin language get-language-details-panel get/set-settings))] + [item + (send hier-list new-item + (if second-number + (compose second-number-mixin mixin) + mixin))] + [text (send item get-editor)] + [delta (send language get-style-delta)]) + (send item set-number number) + (when second-number + (send item set-second-number second-number)) + (send text insert position) + (when delta + (cond + [(list? delta) + (for-each (λ (x) + (send text change-style + (car x) + (cadr x) + (caddr x))) + delta)] + [(is-a? delta style-delta%) + (send text change-style + (send language get-style-delta) + 0 + (send text last-position))])))]))] [else (let* ([position (car positions)] [number (car numbers)] [sub-ht/sub-hier-list @@ -662,32 +724,39 @@ ;; and selects the current language (define (open-current-language) (when (and language-to-show settings-to-show) - (let ([language-position (send language-to-show get-language-position)]) - (cond - [(null? (cdr language-position)) - ;; nothing to open here - ;; this should only be the module language - (send (car (send languages-hier-list get-items)) select #t) - (void)] - [else - (let loop ([hi languages-hier-list] - - ;; skip the first position, since it is flattened into the dialog - [first-pos (cadr language-position)] - [position (cddr language-position)]) - (let ([child - ;; know that this `car' is okay by construction of the dialog - (car - (filter (λ (x) - (equal? (send (send x get-editor) get-text) - first-pos)) - (send hi get-items)))]) - (cond - [(null? position) - (send child select #t)] - [else - (send child open) - (loop child (car position) (cdr position))])))])))) + (cond + [(equal? language-to-show + module-language*language) + (send use-language-in-source-rb set-selection 0) + (send use-chosen-language-rb set-selection #f)] + [else + (send use-chosen-language-rb set-selection 0) + (send use-language-in-source-rb set-selection #f) + (let ([language-position (send language-to-show get-language-position)]) + (cond + [(null? (cdr language-position)) + ;; nothing to open here + (send (car (send languages-hier-list get-items)) select #t) + (void)] + [else + (let loop ([hi languages-hier-list] + + ;; skip the first position, since it is flattened into the dialog + [first-pos (cadr language-position)] + [position (cddr language-position)]) + (let ([child + ;; know that this `car' is okay by construction of the dialog + (car + (filter (λ (x) + (equal? (send (send x get-editor) get-text) + first-pos)) + (send hi get-items)))]) + (cond + [(null? position) + (send child select #t)] + [else + (send child open) + (loop child (car position) (cdr position))])))]))]))) ;; docs-callback : -> void (define (docs-callback) @@ -826,6 +895,34 @@ (and get/set-selected-language-settings (get/set-selected-language-settings)))))) + (define (add-discussion p) + (let* ([t (new text:standard-style-list%)] + [c (new editor-canvas% + [stretchable-width #t] + [horizontal-inset 0] + [vertical-inset 0] + [parent p] + [style '(no-border auto-vscroll no-hscroll transparent)] + [editor t])]) + (send c set-line-count 3) + + (send t set-styles-sticky #f) + (send t set-autowrap-bitmap #f) + (let ([do-insert + (λ (str style) + (let ([before (send t last-position)]) + (send t insert str before before) + (send t change-style style before (send t last-position))))]) + (let loop ([strs (regexp-split #rx"#lang" sc-lang-in-source-discussion)]) + (do-insert (car strs) (send (send t get-style-list) basic-style)) + (unless (null? (cdr strs)) + (do-insert "#lang" (send (send t get-style-list) find-named-style "standard")) + (loop (cdr strs))))) + (send t hide-caret #t) + + (send t auto-wrap #t) + (send t lock #t))) + (define panel-background-editor-canvas% (class editor-canvas% (inherit get-dc get-client-size) From a6d89438a7d345dc50aecd6edad17a5cc0bacde5 Mon Sep 17 00:00:00 2001 From: Robby Findler Date: Thu, 28 Jan 2010 21:48:07 +0000 Subject: [PATCH 100/113] fixed one of those 'the callbacks are the initial state arent being set up together properly' gui bugs svn: r17876 --- collects/drscheme/private/language-configuration.ss | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/collects/drscheme/private/language-configuration.ss b/collects/drscheme/private/language-configuration.ss index d1ba66798e..637dd15f9b 100644 --- a/collects/drscheme/private/language-configuration.ss +++ b/collects/drscheme/private/language-configuration.ss @@ -452,6 +452,8 @@ (define (module-language-selected) ;; need to deselect things in the languages-hier-list at this point. ;(send languages-hier-list select #f) + (send use-chosen-language-rb set-selection #f) + (send use-language-in-source-rb set-selection 0) (update-gui-based-on-selected-language module-language*language module-language*get-language-details-panel module-language*get/set-settings)) @@ -727,8 +729,7 @@ (cond [(equal? language-to-show module-language*language) - (send use-language-in-source-rb set-selection 0) - (send use-chosen-language-rb set-selection #f)] + (module-language-selected)] [else (send use-chosen-language-rb set-selection 0) (send use-language-in-source-rb set-selection #f) From 5270fcbc6c66c2ecb4454ac724d796dfe3eabcff Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Fri, 29 Jan 2010 00:14:06 +0000 Subject: [PATCH 101/113] fix name of Basic style in style-list<%> svn: r17878 --- collects/mred/private/wxme/style.ss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/collects/mred/private/wxme/style.ss b/collects/mred/private/wxme/style.ss index 3ac2ef9444..8bb830a326 100644 --- a/collects/mred/private/wxme/style.ss +++ b/collects/mred/private/wxme/style.ss @@ -621,7 +621,7 @@ (define/public (s-set-as-basic slist) (set! style-list slist) - (set! name "basic") + (set! name "Basic") (set! base-style #f) (set! nonjoin-delta (new style-delta%)) From ea87c95d95d891f22e8b2621a9b8029a57650704 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Fri, 29 Jan 2010 00:15:43 +0000 Subject: [PATCH 102/113] adjust futures impl to use mzrt; fix MrEd build to work with futures svn: r17879 --- collects/compiler/private/xform.ss | 34 +-- src/configure | 20 +- src/mred/mrmain.cxx | 2 + src/mzscheme/configure.ac | 18 +- src/mzscheme/gc/Makefile.in | 2 +- src/mzscheme/gc2/newgc.c | 3 + src/mzscheme/include/scheme.h | 19 -- src/mzscheme/include/schthread.h | 55 +++-- src/mzscheme/src/Makefile.in | 2 +- src/mzscheme/src/env.c | 2 +- src/mzscheme/src/eval.c | 2 +- src/mzscheme/src/future.c | 374 +++++++++++++---------------- src/mzscheme/src/future.h | 6 +- src/mzscheme/src/gmp/gmp.c | 1 + src/mzscheme/src/jit.c | 6 +- src/mzscheme/src/jit_ts.c | 2 +- src/mzscheme/src/mzmark.c | 2 +- src/mzscheme/src/mzmarksrc.c | 2 +- src/mzscheme/src/mzrt.c | 35 ++- src/mzscheme/src/mzrt.h | 3 +- src/mzscheme/src/schpriv.h | 9 +- src/mzscheme/src/string.c | 12 +- src/mzscheme/src/thread.c | 11 +- 23 files changed, 314 insertions(+), 308 deletions(-) diff --git a/collects/compiler/private/xform.ss b/collects/compiler/private/xform.ss index b602155fec..10a7b79eae 100644 --- a/collects/compiler/private/xform.ss +++ b/collects/compiler/private/xform.ss @@ -586,22 +586,24 @@ (define per-block-push? #t) (define gc-var-stack-mode - (ormap (lambda (e) - (cond - [(and (pragma? e) - (regexp-match #rx"GC_VARIABLE_STACK_THOUGH_TABLE" (pragma-s e))) - 'table] - [(and (tok? e) - (eq? (tok-n e) 'XFORM_GC_VARIABLE_STACK_THROUGH_THREAD_LOCAL)) - 'thread-local] - [(and (tok? e) - (eq? (tok-n e) 'XFORM_GC_VARIABLE_STACK_THROUGH_GETSPECIFIC)) - 'getspecific] - [(and (tok? e) - (eq? (tok-n e) 'XFORM_GC_VARIABLE_STACK_THROUGH_FUNCTION)) - 'function] - [else #f])) - e-raw)) + (let loop ([e-raw e-raw]) + (ormap (lambda (e) + (cond + [(and (pragma? e) + (regexp-match #rx"GC_VARIABLE_STACK_THOUGH_TABLE" (pragma-s e))) + 'table] + [(and (tok? e) + (eq? (tok-n e) 'XFORM_GC_VARIABLE_STACK_THROUGH_THREAD_LOCAL)) + 'thread-local] + [(and (tok? e) + (eq? (tok-n e) 'XFORM_GC_VARIABLE_STACK_THROUGH_GETSPECIFIC)) + 'getspecific] + [(and (tok? e) + (eq? (tok-n e) 'XFORM_GC_VARIABLE_STACK_THROUGH_FUNCTION)) + 'function] + [(braces? e) (loop (seq->list (seq-in e)))] + [else #f])) + e-raw))) ;; The code produced by xform uses a number of macros. These macros ;; make the transformation about a little easier to debug, and they diff --git a/src/configure b/src/configure index b0acdacae6..a1adb8948b 100755 --- a/src/configure +++ b/src/configure @@ -706,7 +706,7 @@ FRAMEWORK_REL_INSTALL FRAMEWORK_PREFIX INSTALL_ORIG_TREE EXE_SUFFIX -PLACE_CGC_FLAGS +MZRT_CGC_FLAGS LIBATOM MREDLINKER LIBSFX @@ -2316,7 +2316,7 @@ ZLIB_INC='$(ZLIB_INC)' PNG_A='$(PNG_A)' PREFLAGS="$CPPFLAGS" -PLACE_CGC_FLAGS="" +MZRT_CGC_FLAGS="" LIBATOM="LIBATOM_NONE" ar_libtool_no_undefined="" @@ -10712,16 +10712,24 @@ fi if test "${enable_places}" = "yes" ; then PREFLAGS="$PREFLAGS -DMZ_USE_PLACES" - PLACE_CGC_FLAGS="$GC_THREADS_FLAG -DTHREAD_LOCAL_ALLOC" LDFLAGS="$LDFLAGS -pthread" - LIBATOM="LIBATOM_USE" + enable_mzrt=yes fi ############### futures ################### if test "${enable_futures}" = "yes" ; then - PREFLAGS="$PREFLAGS -DFUTURES_ENABLED -DUSE_PTHREAD_INSTEAD_OF_ITIMER" + PREFLAGS="$PREFLAGS -DMZ_USE_FUTURES" + enable_mzrt=yes +fi + +############### OS threads ################### + +if test "${enable_mzrt}" = "yes" ; then + PREFLAGS="$PREFLAGS -DUSE_PTHREAD_INSTEAD_OF_ITIMER" LDFLAGS="$LDFLAGS -pthread" + MZRT_CGC_FLAGS="$GC_THREADS_FLAG -DTHREAD_LOCAL_ALLOC" + LIBATOM="LIBATOM_USE" fi ################ Xrender ################## @@ -12959,7 +12967,7 @@ FRAMEWORK_REL_INSTALL!$FRAMEWORK_REL_INSTALL$ac_delim FRAMEWORK_PREFIX!$FRAMEWORK_PREFIX$ac_delim INSTALL_ORIG_TREE!$INSTALL_ORIG_TREE$ac_delim EXE_SUFFIX!$EXE_SUFFIX$ac_delim -PLACE_CGC_FLAGS!$PLACE_CGC_FLAGS$ac_delim +MZRT_CGC_FLAGS!$MZRT_CGC_FLAGS$ac_delim LIBATOM!$LIBATOM$ac_delim MREDLINKER!$MREDLINKER$ac_delim LIBSFX!$LIBSFX$ac_delim diff --git a/src/mred/mrmain.cxx b/src/mred/mrmain.cxx index 5ee4d8a030..0b4f437157 100644 --- a/src/mred/mrmain.cxx +++ b/src/mred/mrmain.cxx @@ -292,12 +292,14 @@ static int call_main_after_stack(void *data) } int main(int argc, char *argv[]) + XFORM_SKIP_PROC { Main_Args ma; ma.argc = argc; ma.argv = argv; return scheme_main_stack_setup(1, call_main_after_stack, &ma); } + #endif /* **************************************************************** */ diff --git a/src/mzscheme/configure.ac b/src/mzscheme/configure.ac index 266010fb79..b2c75c1e32 100644 --- a/src/mzscheme/configure.ac +++ b/src/mzscheme/configure.ac @@ -354,7 +354,7 @@ ZLIB_INC='$(ZLIB_INC)' PNG_A='$(PNG_A)' PREFLAGS="$CPPFLAGS" -PLACE_CGC_FLAGS="" +MZRT_CGC_FLAGS="" LIBATOM="LIBATOM_NONE" ar_libtool_no_undefined="" @@ -1142,16 +1142,24 @@ fi if test "${enable_places}" = "yes" ; then PREFLAGS="$PREFLAGS -DMZ_USE_PLACES" - PLACE_CGC_FLAGS="$GC_THREADS_FLAG -DTHREAD_LOCAL_ALLOC" LDFLAGS="$LDFLAGS -pthread" - LIBATOM="LIBATOM_USE" + enable_mzrt=yes fi ############### futures ################### if test "${enable_futures}" = "yes" ; then - PREFLAGS="$PREFLAGS -DFUTURES_ENABLED -DUSE_PTHREAD_INSTEAD_OF_ITIMER" + PREFLAGS="$PREFLAGS -DMZ_USE_FUTURES" + enable_mzrt=yes +fi + +############### OS threads ################### + +if test "${enable_mzrt}" = "yes" ; then + PREFLAGS="$PREFLAGS -DUSE_PTHREAD_INSTEAD_OF_ITIMER" LDFLAGS="$LDFLAGS -pthread" + MZRT_CGC_FLAGS="$GC_THREADS_FLAG -DTHREAD_LOCAL_ALLOC" + LIBATOM="LIBATOM_USE" fi ################ Xrender ################## @@ -1432,7 +1440,7 @@ AC_SUBST(FRAMEWORK_REL_INSTALL) AC_SUBST(FRAMEWORK_PREFIX) AC_SUBST(INSTALL_ORIG_TREE) AC_SUBST(EXE_SUFFIX) -AC_SUBST(PLACE_CGC_FLAGS) +AC_SUBST(MZRT_CGC_FLAGS) AC_SUBST(LIBATOM) AC_SUBST(MREDLINKER) diff --git a/src/mzscheme/gc/Makefile.in b/src/mzscheme/gc/Makefile.in index 188c530451..f5db01a36b 100644 --- a/src/mzscheme/gc/Makefile.in +++ b/src/mzscheme/gc/Makefile.in @@ -47,7 +47,7 @@ mainsrcdir = @srcdir@/../.. # compiler options; mainly used to allow importing options OPTIONS=@OPTIONS@ @CGCOPTIONS@ -BASEFLAGS= -I$(srcdir)/include -I$(AO_INSTALL_DIR)/src @CFLAGS@ @COMPFLAGS@ @PREFLAGS@ @PLACE_CGC_FLAGS@ +BASEFLAGS= -I$(srcdir)/include -I$(AO_INSTALL_DIR)/src @CFLAGS@ @COMPFLAGS@ @PREFLAGS@ @MZRT_CGC_FLAGS@ CFLAGS= $(BASEFLAGS) @PROFFLAGS@ $(OPTIONS) -DNO_EXECUTE_PERMISSION -DSILENT -DNO_GETENV -DLARGE_CONFIG -DATOMIC_UNCOLLECTABLE -DINITIAL_MARK_STACK_SIZE=8192 # To build the parallel collector on Linux, add to the above: diff --git a/src/mzscheme/gc2/newgc.c b/src/mzscheme/gc2/newgc.c index 01566ce8a5..32640c0b10 100644 --- a/src/mzscheme/gc2/newgc.c +++ b/src/mzscheme/gc2/newgc.c @@ -3309,6 +3309,7 @@ static void clean_up_heap(NewGC *gc) cleanup_vacated_pages(gc); } +#ifdef MZ_USE_PLACES static void unprotect_old_pages(NewGC *gc) { Page_Range *protect_range = gc->protect_range; @@ -3337,6 +3338,8 @@ static void unprotect_old_pages(NewGC *gc) flush_protect_page_ranges(protect_range, 0); } +#endif + static void protect_old_pages(NewGC *gc) { Page_Range *protect_range = gc->protect_range; diff --git a/src/mzscheme/include/scheme.h b/src/mzscheme/include/scheme.h index f1b4e5469c..94b9f03ae3 100644 --- a/src/mzscheme/include/scheme.h +++ b/src/mzscheme/include/scheme.h @@ -147,25 +147,6 @@ typedef jmpbuf jmp_buf[1]; typedef struct FSSpec mzFSSpec; #endif -/* Set up MZ_EXTERN for DLL build */ -#if defined(WINDOWS_DYNAMIC_LOAD) \ - && !defined(LINK_EXTENSIONS_BY_TABLE) \ - && !defined(SCHEME_EMBEDDED_NO_DLL) -# define MZ_DLLIMPORT __declspec(dllimport) -# define MZ_DLLEXPORT __declspec(dllexport) -# ifdef __mzscheme_private__ -# define MZ_DLLSPEC __declspec(dllexport) -# else -# define MZ_DLLSPEC __declspec(dllimport) -# endif -#else -# define MZ_DLLSPEC -# define MZ_DLLIMPORT -# define MZ_DLLEXPORT -#endif - -#define MZ_EXTERN extern MZ_DLLSPEC - #ifndef MZ_DONT_USE_JIT # if defined(MZ_USE_JIT_PPC) || defined(MZ_USE_JIT_I386) || defined(MZ_USE_JIT_X86_64) # define MZ_USE_JIT diff --git a/src/mzscheme/include/schthread.h b/src/mzscheme/include/schthread.h index 1426d83959..b21438887c 100644 --- a/src/mzscheme/include/schthread.h +++ b/src/mzscheme/include/schthread.h @@ -19,8 +19,8 @@ #ifndef SCHEME_THREADLOCAL_H #define SCHEME_THREADLOCAL_H -#if defined(MZ_USE_PLACES) || defined(FUTURES_ENABLED) -# define USE_THREAD_LOCAL +#if defined(MZ_USE_PLACES) || defined(MZ_USE_FUTURES) +# define USE_THREAD_LOCAL # if _MSC_VER # define THREAD_LOCAL __declspec(thread) # elif defined(OS_X) || (defined(linux) && defined(MZ_USES_SHARED_LIB)) @@ -35,7 +35,26 @@ # define THREAD_LOCAL /* empty */ #endif -extern void scheme_init_os_thread(); +/* Set up MZ_EXTERN for DLL build */ +#if (defined(__WIN32__) || defined(WIN32) || defined(_WIN32)) \ + && !defined(LINK_EXTENSIONS_BY_TABLE) \ + && !defined(SCHEME_EMBEDDED_NO_DLL) +# define MZ_DLLIMPORT __declspec(dllimport) +# define MZ_DLLEXPORT __declspec(dllexport) +# ifdef __mzscheme_private__ +# define MZ_DLLSPEC __declspec(dllexport) +# else +# define MZ_DLLSPEC __declspec(dllimport) +# endif +#else +# define MZ_DLLSPEC +# define MZ_DLLIMPORT +# define MZ_DLLEXPORT +#endif + +#define MZ_EXTERN extern MZ_DLLSPEC + +MZ_EXTERN void scheme_init_os_thread(); /* **************************************************************** */ /* Declarations that we wish were elsewhere, but are needed here to */ @@ -77,7 +96,7 @@ typedef long objhead; /* **************************************** */ -#if FUTURES_ENABLED +#if MZ_USE_FUTURES # include #endif @@ -193,8 +212,8 @@ typedef struct Thread_Local_Variables { void *jit_future_storage_[2]; struct Scheme_Object **scheme_current_runstack_start_; struct Scheme_Object **scheme_current_runstack_; - MZ_MARK_STACK_TYPE scheme_current_cont_mark_stack_; - MZ_MARK_POS_TYPE scheme_current_cont_mark_pos_; + long scheme_current_cont_mark_stack_; + long scheme_current_cont_mark_pos_; struct Scheme_Custodian *main_custodian_; struct Scheme_Custodian *last_custodian_; struct Scheme_Hash_Table *limited_custodians_; @@ -215,7 +234,6 @@ typedef struct Thread_Local_Variables { struct Scheme_Object *recycle_cell_; struct Scheme_Object *maybe_recycle_cell_; int recycle_cc_count_; - mz_jmp_buf main_init_error_buf_; void *gmp_mem_pool_; unsigned long max_total_allocation_; unsigned long current_total_allocation_; @@ -226,14 +244,14 @@ typedef struct Thread_Local_Variables { int builtin_ref_counter_; int env_uid_counter_; int scheme_overflow_count_; - Scheme_Object *original_pwd_; + struct Scheme_Object *original_pwd_; long scheme_hash_request_count_; long scheme_hash_iteration_count_; - Scheme_Env *initial_modules_env_; + struct Scheme_Env *initial_modules_env_; int num_initial_modules_; - Scheme_Object **initial_modules_; - Scheme_Object *initial_renames_; - Scheme_Bucket_Table *initial_toplevel_; + struct Scheme_Object **initial_modules_; + struct Scheme_Object *initial_renames_; + struct Scheme_Bucket_Table *initial_toplevel_; int generate_lifts_count_; int special_is_ok_; int scheme_force_port_closed_; @@ -253,14 +271,14 @@ typedef struct Thread_Local_Variables { long start_this_gc_time_; long end_this_gc_time_; volatile short delayed_break_ready_; - Scheme_Thread *main_break_target_thread_; + struct Scheme_Thread *main_break_target_thread_; long scheme_code_page_total_; int locale_on_; - const mzchar *current_locale_name_; + void *current_locale_name_ptr_; int gensym_counter_; - Scheme_Object *dummy_input_port_; - Scheme_Object *dummy_output_port_; - Scheme_Bucket_Table *place_local_modpath_table_; + struct Scheme_Object *dummy_input_port_; + struct Scheme_Object *dummy_output_port_; + struct Scheme_Bucket_Table *place_local_modpath_table_; /*KPLAKE1*/ } Thread_Local_Variables; @@ -461,7 +479,6 @@ XFORM_GC_VARIABLE_STACK_THROUGH_THREAD_LOCAL; #define recycle_cell XOA (scheme_get_thread_local_variables()->recycle_cell_) #define maybe_recycle_cell XOA (scheme_get_thread_local_variables()->maybe_recycle_cell_) #define recycle_cc_count XOA (scheme_get_thread_local_variables()->recycle_cc_count_) -#define main_init_error_buf XOA (scheme_get_thread_local_variables()->main_init_error_buf_) #define gmp_mem_pool XOA (scheme_get_thread_local_variables()->gmp_mem_pool_) #define max_total_allocation XOA (scheme_get_thread_local_variables()->max_total_allocation_) #define current_total_allocation XOA (scheme_get_thread_local_variables()->current_total_allocation_) @@ -502,7 +519,7 @@ XFORM_GC_VARIABLE_STACK_THROUGH_THREAD_LOCAL; #define main_break_target_thread XOA (scheme_get_thread_local_variables()->main_break_target_thread_) #define scheme_code_page_total XOA (scheme_get_thread_local_variables()->scheme_code_page_total_) #define locale_on XOA (scheme_get_thread_local_variables()->locale_on_) -#define current_locale_name XOA (scheme_get_thread_local_variables()->current_locale_name_) +#define current_locale_name_ptr XOA (scheme_get_thread_local_variables()->current_locale_name_ptr_) #define gensym_counter XOA (scheme_get_thread_local_variables()->gensym_counter_) #define dummy_input_port XOA (scheme_get_thread_local_variables()->dummy_input_port_) #define dummy_output_port XOA (scheme_get_thread_local_variables()->dummy_output_port_) diff --git a/src/mzscheme/src/Makefile.in b/src/mzscheme/src/Makefile.in index 5b6dce72e8..f745e33c2c 100644 --- a/src/mzscheme/src/Makefile.in +++ b/src/mzscheme/src/Makefile.in @@ -272,7 +272,7 @@ fun.@LTO@: $(COMMON_HEADERS) \ $(srcdir)/../src/stypes.h $(srcdir)/mzmark.c $(srcdir)/schmap.inc \ $(srcdir)/future.h future.@LTO@: $(srcdir)/schpriv.h $(srcdir)/future.h $(SCONFIG) $(srcdir)/../include/scheme.h \ - $(srcdir)/../src/stypes.h $(srcdir)/mzmark.c \ + $(srcdir)/../src/stypes.h $(srcdir)/mzmark.c $(srcdir)/mzrt.c \ $(srcdir)/jit_ts_future_glue.c $(srcdir)/jit_ts_runtime_glue.c $(srcdir)/jit_ts_protos.h hash.@LTO@: $(COMMON_HEADERS) \ $(srcdir)/../src/stypes.h $(srcdir)/mzmark.c diff --git a/src/mzscheme/src/env.c b/src/mzscheme/src/env.c index 8bfe025c08..1a7f5de1fe 100644 --- a/src/mzscheme/src/env.c +++ b/src/mzscheme/src/env.c @@ -32,7 +32,7 @@ #include "schminc.h" #include "schmach.h" #include "schexpobs.h" -#ifdef FUTURES_ENABLED +#ifdef MZ_USE_FUTURES # include "future.h" #endif diff --git a/src/mzscheme/src/eval.c b/src/mzscheme/src/eval.c index 3da262e03c..798c101ede 100644 --- a/src/mzscheme/src/eval.c +++ b/src/mzscheme/src/eval.c @@ -143,7 +143,7 @@ #ifdef MACOS_STACK_LIMIT #include #endif -#ifdef FUTURES_ENABLED +#ifdef MZ_USE_FUTURES # include "future.h" #endif diff --git a/src/mzscheme/src/future.c b/src/mzscheme/src/future.c index 31ff13b92b..0b5930b6df 100644 --- a/src/mzscheme/src/future.c +++ b/src/mzscheme/src/future.c @@ -35,7 +35,7 @@ static Scheme_Object *future_p(int argc, Scheme_Object *argv[]) static void register_traversers(void); #endif -#ifndef FUTURES_ENABLED +#ifndef MZ_USE_FUTURES /* Futures not enabled, but make a stub module and implementation */ @@ -176,12 +176,12 @@ typedef struct Scheme_Future_State { future_t *future_waiting_atomic; int next_futureid; - pthread_mutex_t future_mutex; - pthread_cond_t future_pending_cv; - pthread_cond_t gc_ok_c; - pthread_cond_t gc_done_c; + mzrt_mutex *future_mutex; + mzrt_sema *future_pending_sema; + mzrt_sema *gc_ok_c; + mzrt_sema *gc_done_c; - int gc_not_ok, wait_for_gc; + int gc_not_ok, wait_for_gc, need_gc_ok_post, need_gc_done_post; int *gc_counter_ptr; @@ -190,9 +190,8 @@ typedef struct Scheme_Future_State { typedef struct Scheme_Future_Thread_State { int id; - pthread_t threadid; int worker_gc_counter; - pthread_cond_t worker_can_continue_cv; + mzrt_sema *worker_can_continue_sema; future_t *current_ft; long runstack_size; @@ -232,53 +231,12 @@ static void send_special_result(future_t *f, Scheme_Object *retval); # define scheme_future_longjmp(newbuf, v) scheme_longjmp(newbuf, v) #endif -/**********************************************************************/ -/* Semaphore helpers */ -/**********************************************************************/ - -typedef struct sema_t { - int ready; - pthread_mutex_t m; - pthread_cond_t c; -} sema_t; - -static void sema_wait(sema_t *s) -{ - pthread_mutex_lock(&s->m); - while (!s->ready) { - pthread_cond_wait(&s->c, &s->m); - } - --s->ready; - pthread_mutex_unlock(&s->m); -} - -static void sema_signal(sema_t *s) -{ - pthread_mutex_lock(&s->m); - s->ready++; - pthread_cond_signal(&s->c); - pthread_mutex_unlock(&s->m); -} - -static void sema_init(sema_t *s) -{ - pthread_mutex_init(&s->m, NULL); - pthread_cond_init(&s->c, NULL); - s->ready = 0; -} - -static void sema_destroy(sema_t *s) -{ - pthread_mutex_destroy(&s->m); - pthread_cond_destroy(&s->c); -} - /**********************************************************************/ /* Arguments for a newly created future thread */ /**********************************************************************/ typedef struct future_thread_params_t { - struct sema_t ready_sema; + mzrt_sema *ready_sema; struct NewGC *shared_GC; Scheme_Future_State *fs; Scheme_Future_Thread_State *fts; @@ -361,10 +319,10 @@ void futures_init(void) REGISTER_SO(fs->future_queue_end); REGISTER_SO(fs->future_waiting_atomic); - pthread_mutex_init(&fs->future_mutex, NULL); - pthread_cond_init(&fs->future_pending_cv, NULL); - pthread_cond_init(&fs->gc_ok_c, NULL); - pthread_cond_init(&fs->gc_done_c, NULL); + mzrt_mutex_create(&fs->future_mutex); + mzrt_sema_create(&fs->future_pending_sema, 0); + mzrt_sema_create(&fs->gc_ok_c, 0); + mzrt_sema_create(&fs->gc_done_c, 0); fs->gc_counter_ptr = &scheme_did_gc_count; @@ -380,13 +338,11 @@ static void init_future_thread(Scheme_Future_State *fs, int i) { Scheme_Future_Thread_State *fts; GC_CAN_IGNORE future_thread_params_t params; - pthread_t threadid; - GC_CAN_IGNORE pthread_attr_t attr; + Scheme_Thread *skeleton; + Scheme_Object **runstack_start; //Create the worker thread pool. These threads will //'queue up' and wait for futures to become available - pthread_attr_init(&attr); - pthread_attr_setstacksize(&attr, INITIAL_C_STACK_SIZE); fts = (Scheme_Future_Thread_State *)malloc(sizeof(Scheme_Future_Thread_State)); memset(fts, 0, sizeof(Scheme_Future_Thread_State)); @@ -397,24 +353,27 @@ static void init_future_thread(Scheme_Future_State *fs, int i) params.fs = fs; /* Make enough of a thread record to deal with multiple values. */ - params.thread_skeleton = MALLOC_ONE_TAGGED(Scheme_Thread); - params.thread_skeleton->so.type = scheme_thread_type; + skeleton = MALLOC_ONE_TAGGED(Scheme_Thread); + skeleton->so.type = scheme_thread_type; { Scheme_Object **rs_start, **rs; long init_runstack_size = FUTURE_RUNSTACK_SIZE; rs_start = scheme_alloc_runstack(init_runstack_size); rs = rs_start XFORM_OK_PLUS init_runstack_size; - params.runstack_start = rs_start; + runstack_start = rs_start; fts->runstack_size = init_runstack_size; } - sema_init(¶ms.ready_sema); - pthread_create(&threadid, &attr, worker_thread_future_loop, ¶ms); - sema_wait(¶ms.ready_sema); - sema_destroy(¶ms.ready_sema); + /* Fill in GCable values just before creating the thread, + because the GC ignores `params': */ + params.thread_skeleton = skeleton; + params.runstack_start = runstack_start; - fts->threadid = threadid; + mzrt_sema_create(¶ms.ready_sema, 0); + mz_proc_thread_create_w_stacksize(worker_thread_future_loop, ¶ms, INITIAL_C_STACK_SIZE); + mzrt_sema_wait(params.ready_sema); + mzrt_sema_destroy(params.ready_sema); fts->gen0_size = 1; @@ -428,9 +387,13 @@ static void init_future_thread(Scheme_Future_State *fs, int i) } static void start_gc_not_ok(Scheme_Future_State *fs) +/* must have mutex_lock */ { while (fs->wait_for_gc) { - pthread_cond_wait(&fs->gc_done_c, &fs->future_mutex); + fs->need_gc_done_post++; + mzrt_mutex_unlock(fs->future_mutex); + mzrt_sema_wait(fs->gc_done_c); + mzrt_mutex_lock(fs->future_mutex); } fs->gc_not_ok++; @@ -452,6 +415,7 @@ static void start_gc_not_ok(Scheme_Future_State *fs) static void end_gc_not_ok(Scheme_Future_Thread_State *fts, Scheme_Future_State *fs, Scheme_Object **current_rs) +/* must have mutex_lock */ { scheme_set_runstack_limits(MZ_RUNSTACK_START, fts->runstack_size, @@ -463,7 +427,10 @@ static void end_gc_not_ok(Scheme_Future_Thread_State *fts, /* FIXME: clear scheme_current_thread->ku.multiple.array ? */ --fs->gc_not_ok; - pthread_cond_signal(&fs->gc_ok_c); + if (fs->need_gc_ok_post) { + fs->need_gc_ok_post = 0; + mzrt_sema_post(fs->gc_ok_c); + } } void scheme_future_block_until_gc() @@ -473,9 +440,9 @@ void scheme_future_block_until_gc() if (!fs) return; - pthread_mutex_lock(&fs->future_mutex); + mzrt_mutex_lock(fs->future_mutex); fs->wait_for_gc = 1; - pthread_mutex_unlock(&fs->future_mutex); + mzrt_mutex_unlock(fs->future_mutex); for (i = 0; i < THREAD_POOL_SIZE; i++) { if (fs->pool_threads[i]) { @@ -486,11 +453,14 @@ void scheme_future_block_until_gc() } asm("mfence"); - pthread_mutex_lock(&fs->future_mutex); + mzrt_mutex_lock(fs->future_mutex); while (fs->gc_not_ok) { - pthread_cond_wait(&fs->gc_ok_c, &fs->future_mutex); + fs->need_gc_ok_post = 1; + mzrt_mutex_unlock(fs->future_mutex); + mzrt_sema_wait(fs->gc_ok_c); + mzrt_mutex_lock(fs->future_mutex); } - pthread_mutex_unlock(&fs->future_mutex); + mzrt_mutex_unlock(fs->future_mutex); } void scheme_future_continue_after_gc() @@ -508,10 +478,13 @@ void scheme_future_continue_after_gc() } } - pthread_mutex_lock(&fs->future_mutex); + mzrt_mutex_lock(fs->future_mutex); fs->wait_for_gc = 0; - pthread_cond_broadcast(&fs->gc_done_c); - pthread_mutex_unlock(&fs->future_mutex); + while (fs->need_gc_done_post) { + --fs->need_gc_done_post; + mzrt_sema_post(fs->gc_done_c); + } + mzrt_mutex_unlock(fs->future_mutex); } void scheme_future_gc_pause() @@ -520,10 +493,10 @@ void scheme_future_gc_pause() Scheme_Future_Thread_State *fts = scheme_future_thread_state; Scheme_Future_State *fs = scheme_future_state; - pthread_mutex_lock(&fs->future_mutex); + mzrt_mutex_lock(fs->future_mutex); end_gc_not_ok(fts, fs, MZ_RUNSTACK); start_gc_not_ok(fs); /* waits until wait_for_gc is 0 */ - pthread_mutex_unlock(&fs->future_mutex); + mzrt_mutex_unlock(fs->future_mutex); } /**********************************************************************/ @@ -544,9 +517,9 @@ Scheme_Object *future(int argc, Scheme_Object *argv[]) scheme_check_proc_arity("future", 0, 0, argc, argv); if (fs->future_threads_created < THREAD_POOL_SIZE) { - pthread_mutex_lock(&fs->future_mutex); + mzrt_mutex_lock(fs->future_mutex); count = fs->future_queue_count; - pthread_mutex_unlock(&fs->future_mutex); + mzrt_mutex_unlock(fs->future_mutex); if (count >= fs->future_threads_created) { init_future_thread(fs, fs->future_threads_created); fs->future_threads_created++; @@ -566,10 +539,6 @@ Scheme_Object *future(int argc, Scheme_Object *argv[]) ft->status = PENDING; //JIT compile the code if not already jitted - //Temporarily repoint MZ_RUNSTACK - //to the worker thread's runstack - - //in case the JIT compiler uses the stack address - //when generating code if (ncd->code == scheme_on_demand_jit_code) { scheme_on_demand_generate_lambda(nc, 0, NULL); @@ -582,11 +551,11 @@ Scheme_Object *future(int argc, Scheme_Object *argv[]) ft->code = (void*)ncd->code; - pthread_mutex_lock(&fs->future_mutex); + mzrt_mutex_lock(fs->future_mutex); enqueue_future(fs, ft); //Signal that a future is pending - pthread_cond_signal(&fs->future_pending_cv); - pthread_mutex_unlock(&fs->future_mutex); + mzrt_sema_post(fs->future_pending_sema); + mzrt_mutex_unlock(fs->future_mutex); return (Scheme_Object*)ft; } @@ -599,11 +568,11 @@ int future_ready(Scheme_Object *obj) int ret = 0; future_t *ft = (future_t*)obj; - pthread_mutex_lock(&fs->future_mutex); + mzrt_mutex_lock(fs->future_mutex); if (ft->work_completed || ft->rt_prim) { ret = 1; } - pthread_mutex_unlock(&fs->future_mutex); + mzrt_mutex_unlock(fs->future_mutex); return ret; } @@ -645,62 +614,61 @@ Scheme_Object *touch(int argc, Scheme_Object *argv[]) dump_state(); #endif - pthread_mutex_lock(&fs->future_mutex); + mzrt_mutex_lock(fs->future_mutex); if ((ft->status == PENDING) || (ft->status == PENDING_OVERSIZE)) { if (ft->status == PENDING_OVERSIZE) { scheme_log(scheme_main_logger, SCHEME_LOG_DEBUG, 0, "future: oversize procedure deferred to runtime thread"); } ft->status = RUNNING; - pthread_mutex_unlock(&fs->future_mutex); + mzrt_mutex_unlock(fs->future_mutex); retval = scheme_apply_multi(ft->orig_lambda, 0, NULL); send_special_result(ft, retval); - pthread_mutex_lock(&fs->future_mutex); + mzrt_mutex_lock(fs->future_mutex); ft->work_completed = 1; ft->retval = retval; ft->status = FINISHED; dequeue_future(fs, ft); - pthread_mutex_unlock(&fs->future_mutex); + mzrt_mutex_unlock(fs->future_mutex); receive_special_result(ft, retval, 0); return retval; } - pthread_mutex_unlock(&fs->future_mutex); + mzrt_mutex_unlock(fs->future_mutex); //Spin waiting for primitive calls or a return value from //the worker thread - wait_for_rtcall_or_completion: - scheme_block_until(future_ready, NULL, (Scheme_Object*)ft, 0); - pthread_mutex_lock(&fs->future_mutex); - if (ft->work_completed) - { - retval = ft->retval; + while (1) { + scheme_block_until(future_ready, NULL, (Scheme_Object*)ft, 0); + mzrt_mutex_lock(fs->future_mutex); + if (ft->work_completed) + { + retval = ft->retval; - LOG("Successfully touched future %d\n", ft->id); - // fflush(stdout); + LOG("Successfully touched future %d\n", ft->id); + // fflush(stdout); - pthread_mutex_unlock(&fs->future_mutex); - } - else if (ft->rt_prim) - { - //Invoke the primitive and stash the result - //Release the lock so other threads can manipulate the queue - //while the runtime call executes - pthread_mutex_unlock(&fs->future_mutex); - LOG("Invoking primitive %p on behalf of future %d...", ft->rt_prim, ft->id); - invoke_rtcall(fs, ft); - LOG("done.\n"); - - goto wait_for_rtcall_or_completion; - } - else - { - pthread_mutex_unlock(&fs->future_mutex); - goto wait_for_rtcall_or_completion; - } + mzrt_mutex_unlock(fs->future_mutex); + break; + } + else if (ft->rt_prim) + { + //Invoke the primitive and stash the result + //Release the lock so other threads can manipulate the queue + //while the runtime call executes + mzrt_mutex_unlock(fs->future_mutex); + LOG("Invoking primitive %p on behalf of future %d...", ft->rt_prim, ft->id); + invoke_rtcall(fs, ft); + LOG("done.\n"); + } + else + { + mzrt_mutex_unlock(fs->future_mutex); + } + } if (!retval) { scheme_signal_error("touch: future previously aborted"); @@ -762,8 +730,6 @@ void *worker_thread_future_loop(void *arg) future_t *ft; mz_jmp_buf newbuf; - scheme_init_os_thread(); - scheme_future_state = fs; scheme_future_thread_state = fts; @@ -771,7 +737,7 @@ void *worker_thread_future_loop(void *arg) scheme_current_thread = params->thread_skeleton; //Set processor affinity - /*pthread_mutex_lock(&fs->future_mutex); + /*mzrt_mutex_lock(fs->future_mutex); static unsigned long cur_cpu_mask = 1; if (pthread_setaffinity_np(pthread_self(), sizeof(g_cur_cpu_mask), &g_cur_cpu_mask)) { @@ -781,10 +747,10 @@ void *worker_thread_future_loop(void *arg) pthread_self()); } - pthread_mutex_unlock(&fs->future_mutex); + mzrt_mutex_unlock(fs->future_mutex); */ - pthread_cond_init(&fts->worker_can_continue_cv, NULL); + mzrt_sema_create(&fts->worker_can_continue_sema, 0); scheme_use_rtcall = 1; @@ -803,81 +769,77 @@ void *worker_thread_future_loop(void *arg) params->current_thread_ptr = &scheme_current_thread; params->jit_future_storage_ptr = &jit_future_storage[0]; - sema_signal(¶ms->ready_sema); + mzrt_sema_post(params->ready_sema); - wait_for_work: - pthread_mutex_lock(&fs->future_mutex); - start_gc_not_ok(fs); - while (!(ft = get_pending_future(fs))) { - end_gc_not_ok(fts, fs, NULL); - pthread_cond_wait(&fs->future_pending_cv, &fs->future_mutex); + while (1) { + mzrt_sema_wait(fs->future_pending_sema); + mzrt_mutex_lock(fs->future_mutex); start_gc_not_ok(fs); - } + ft = get_pending_future(fs); - LOG("Got a signal that a future is pending..."); + if (ft) { + LOG("Got a signal that a future is pending..."); - //Work is available for this thread - ft->status = RUNNING; - pthread_mutex_unlock(&fs->future_mutex); + //Work is available for this thread + ft->status = RUNNING; + mzrt_mutex_unlock(fs->future_mutex); - ft->threadid = fts->threadid; - ft->thread_short_id = fts->id; + ft->thread_short_id = fts->id; - //Set up the JIT compiler for this thread - scheme_jit_fill_threadlocal_table(); + //Set up the JIT compiler for this thread + scheme_jit_fill_threadlocal_table(); - jitcode = (Scheme_Object* (*)(Scheme_Object*, int, Scheme_Object**))(ft->code); + jitcode = (Scheme_Object* (*)(Scheme_Object*, int, Scheme_Object**))(ft->code); - fts->current_ft = ft; + fts->current_ft = ft; - //Run the code - //Passing no arguments for now. - //The lambda passed to a future will always be a parameterless - //function. - //From this thread's perspective, this call will never return - //until all the work to be done in the future has been completed, - //including runtime calls. - //If jitcode asks the runrtime thread to do work, then - //a GC can occur. - LOG("Running JIT code at %p...\n", ft->code); + //Run the code + //Passing no arguments for now. + //The lambda passed to a future will always be a parameterless + //function. + //From this thread's perspective, this call will never return + //until all the work to be done in the future has been completed, + //including runtime calls. + //If jitcode asks the runrtime thread to do work, then + //a GC can occur. + LOG("Running JIT code at %p...\n", ft->code); - MZ_RUNSTACK = MZ_RUNSTACK_START + fts->runstack_size; + MZ_RUNSTACK = MZ_RUNSTACK_START + fts->runstack_size; - scheme_current_thread->error_buf = &newbuf; - if (scheme_future_setjmp(newbuf)) { - /* failed */ - v = NULL; - } else { - v = jitcode(ft->orig_lambda, 0, NULL); - if (SAME_OBJ(v, SCHEME_TAIL_CALL_WAITING)) { - v = scheme_ts_scheme_force_value_same_mark(v); - } - } + scheme_current_thread->error_buf = &newbuf; + if (scheme_future_setjmp(newbuf)) { + /* failed */ + v = NULL; + } else { + v = jitcode(ft->orig_lambda, 0, NULL); + if (SAME_OBJ(v, SCHEME_TAIL_CALL_WAITING)) { + v = scheme_ts_scheme_force_value_same_mark(v); + } + } - LOG("Finished running JIT code at %p.\n", ft->code); + LOG("Finished running JIT code at %p.\n", ft->code); - // Get future again, since a GC may have occurred - ft = fts->current_ft; + // Get future again, since a GC may have occurred + ft = fts->current_ft; - //Set the return val in the descriptor - pthread_mutex_lock(&fs->future_mutex); - ft->work_completed = 1; - ft->retval = v; + //Set the return val in the descriptor + mzrt_mutex_lock(fs->future_mutex); + ft->work_completed = 1; + ft->retval = v; - /* In case of multiple values: */ - send_special_result(ft, v); + /* In case of multiple values: */ + send_special_result(ft, v); - //Update the status - ft->status = FINISHED; - dequeue_future(fs, ft); + //Update the status + ft->status = FINISHED; + dequeue_future(fs, ft); - scheme_signal_received_at(fs->signal_handle); + scheme_signal_received_at(fs->signal_handle); - end_gc_not_ok(fts, fs, NULL); - - pthread_mutex_unlock(&fs->future_mutex); - - goto wait_for_work; + } + end_gc_not_ok(fts, fs, NULL); + mzrt_mutex_unlock(fs->future_mutex); + } return NULL; } @@ -895,14 +857,14 @@ void scheme_check_future_work() while (1) { /* Try to get a future waiting on a atomic operation */ - pthread_mutex_lock(&fs->future_mutex); + mzrt_mutex_lock(fs->future_mutex); ft = fs->future_waiting_atomic; if (ft) { fs->future_waiting_atomic = ft->next_waiting_atomic; ft->next_waiting_atomic = NULL; ft->waiting_atomic = 0; } - pthread_mutex_unlock(&fs->future_mutex); + mzrt_mutex_unlock(fs->future_mutex); if (ft) { if (ft->rt_prim && ft->rt_prim_is_atomic) { @@ -931,7 +893,7 @@ static void future_do_runtimecall(Scheme_Future_Thread_State *fts, //set up the arguments for the runtime call //to be picked up by the main rt thread - pthread_mutex_lock(&fs->future_mutex); + mzrt_mutex_lock(fs->future_mutex); future->prim_func = func; future->rt_prim = 1; @@ -951,17 +913,19 @@ static void future_do_runtimecall(Scheme_Future_Thread_State *fts, scheme_signal_received_at(fs->signal_handle); //Wait for the signal that the RT call is finished - future->can_continue_cv = &fts->worker_can_continue_cv; - while (future->can_continue_cv) { - end_gc_not_ok(fts, fs, MZ_RUNSTACK); - pthread_cond_wait(&fts->worker_can_continue_cv, &fs->future_mutex); - start_gc_not_ok(fs); - //Fetch the future instance again, in case the GC has moved the pointer - future = fts->current_ft; - } + future->can_continue_sema = fts->worker_can_continue_sema; + end_gc_not_ok(fts, fs, MZ_RUNSTACK); + mzrt_mutex_unlock(fs->future_mutex); - pthread_mutex_unlock(&fs->future_mutex); + mzrt_sema_wait(fts->worker_can_continue_sema); + mzrt_mutex_lock(fs->future_mutex); + start_gc_not_ok(fs); + mzrt_mutex_unlock(fs->future_mutex); + + //Fetch the future instance again, in case the GC has moved the pointer + future = fts->current_ft; + if (future->no_retval) { future->no_retval = 0; scheme_future_longjmp(*scheme_current_thread->error_buf, 1); @@ -1158,14 +1122,14 @@ static void do_invoke_rtcall(Scheme_Future_State *fs, future_t *future) break; } - pthread_mutex_lock(&fs->future_mutex); + mzrt_mutex_lock(fs->future_mutex); //Signal the waiting worker thread that it //can continue running machine code - if (future->can_continue_cv) { - pthread_cond_signal(future->can_continue_cv); - future->can_continue_cv= NULL; + if (future->can_continue_sema) { + mzrt_sema_post(future->can_continue_sema); + future->can_continue_sema= NULL; } - pthread_mutex_unlock(&fs->future_mutex); + mzrt_mutex_unlock(fs->future_mutex); } static void *do_invoke_rtcall_k(void) @@ -1190,14 +1154,14 @@ static void invoke_rtcall(Scheme_Future_State * volatile fs, future_t * volatile savebuf = p->error_buf; p->error_buf = &newbuf; if (scheme_setjmp(newbuf)) { - pthread_mutex_lock(&fs->future_mutex); + mzrt_mutex_lock(fs->future_mutex); future->no_retval = 1; future->work_completed = 1; //Signal the waiting worker thread that it //can continue running machine code - pthread_cond_signal(future->can_continue_cv); - future->can_continue_cv = NULL; - pthread_mutex_unlock(&fs->future_mutex); + mzrt_sema_post(future->can_continue_sema); + future->can_continue_sema = NULL; + mzrt_mutex_unlock(fs->future_mutex); scheme_longjmp(*savebuf, 1); } else { if (future->rt_prim_is_atomic) { @@ -1262,7 +1226,7 @@ START_XFORM_SKIP; static void register_traversers(void) { -#ifdef FUTURES_ENABLED +#ifdef MZ_USE_FUTURES GC_REG_TRAV(scheme_future_type, future); #else GC_REG_TRAV(scheme_future_type, sequential_future); diff --git a/src/mzscheme/src/future.h b/src/mzscheme/src/future.h index 321177c60c..3652806522 100644 --- a/src/mzscheme/src/future.h +++ b/src/mzscheme/src/future.h @@ -20,7 +20,6 @@ void scheme_add_global(char *name, int arity, Scheme_Env *env); int scheme_make_prim_w_arity(prim_t func, char *name, int arg1, int arg2); #endif -#include "pthread.h" #include typedef void (*prim_void_void_3args_t)(Scheme_Object **); @@ -43,11 +42,10 @@ typedef struct future_t { Scheme_Object so; int id; - pthread_t threadid; int thread_short_id; int status; int work_completed; - pthread_cond_t *can_continue_cv; + mzrt_sema *can_continue_sema; Scheme_Object *orig_lambda; void *code; @@ -111,7 +109,7 @@ typedef struct future_t { extern Scheme_Object *scheme_ts_scheme_force_value_same_mark(Scheme_Object *v); //Helper macros for argument marshaling -#ifdef FUTURES_ENABLED +#ifdef MZ_USE_FUTURES #define IS_WORKER_THREAD (g_rt_threadid != 0 && pthread_self() != g_rt_threadid) #define ASSERT_CORRECT_THREAD if (g_rt_threadid != 0 && pthread_self() != g_rt_threadid) \ diff --git a/src/mzscheme/src/gmp/gmp.c b/src/mzscheme/src/gmp/gmp.c index 654f16c095..59d9ad25d3 100644 --- a/src/mzscheme/src/gmp/gmp.c +++ b/src/mzscheme/src/gmp/gmp.c @@ -5788,6 +5788,7 @@ void scheme_init_gmp_places() { gmp_tmp_xxx.alloc_point = &gmp_tmp_xxx; gmp_tmp_xxx.prev = 0; gmp_tmp_current = &gmp_tmp_xxx; + REGISTER_SO(gmp_mem_pool); } void scheme_gmp_tls_init(long *s) diff --git a/src/mzscheme/src/jit.c b/src/mzscheme/src/jit.c index 609c87d0d9..dcc2bb189e 100644 --- a/src/mzscheme/src/jit.c +++ b/src/mzscheme/src/jit.c @@ -42,7 +42,7 @@ #include "schpriv.h" #include "schmach.h" -#ifdef FUTURES_ENABLED +#ifdef MZ_USE_FUTURES # include "future.h" #endif #ifdef MZ_USE_DWARF_LIBUNWIND @@ -2570,7 +2570,7 @@ extern int g_print_prims; #include "jit_ts.c" /* Support for intercepting direct calls to primitives: */ -#ifdef FUTURES_ENABLED +#ifdef MZ_USE_FUTURES # define mz_prepare_direct_prim(n) mz_prepare(n) # define mz_finishr_direct_prim(reg, proc) (jit_pusharg_p(reg), (void)mz_finish(proc)) # define mz_direct_only(p) /* skip this arg, so that total count <= 3 args */ @@ -2689,7 +2689,7 @@ static int generate_pause_for_gc_and_retry(mz_jit_state *jitter, int gc_reg, /* must not be JIT_R1 */ GC_CAN_IGNORE jit_insn *refagain) { -#ifdef FUTURES_ENABLED +#ifdef MZ_USE_FUTURES GC_CAN_IGNORE jit_insn *refslow = 0, *refpause; int i; diff --git a/src/mzscheme/src/jit_ts.c b/src/mzscheme/src/jit_ts.c index 640e456944..63539556ca 100644 --- a/src/mzscheme/src/jit_ts.c +++ b/src/mzscheme/src/jit_ts.c @@ -1,4 +1,4 @@ -#ifdef FUTURES_ENABLED +#ifdef MZ_USE_FUTURES # include "jit_ts_def.c" diff --git a/src/mzscheme/src/mzmark.c b/src/mzscheme/src/mzmark.c index afe07e3be9..9a124b8c81 100644 --- a/src/mzscheme/src/mzmark.c +++ b/src/mzscheme/src/mzmark.c @@ -5503,7 +5503,7 @@ static int native_unclosed_proc_plus_case_FIXUP(void *p) { #ifdef MARKS_FOR_FUTURE_C -#ifdef FUTURES_ENABLED +#ifdef MZ_USE_FUTURES static int future_SIZE(void *p) { return diff --git a/src/mzscheme/src/mzmarksrc.c b/src/mzscheme/src/mzmarksrc.c index 8a0051a7ea..861a1367f2 100644 --- a/src/mzscheme/src/mzmarksrc.c +++ b/src/mzscheme/src/mzmarksrc.c @@ -2253,7 +2253,7 @@ END jit; START future; -#ifdef FUTURES_ENABLED +#ifdef MZ_USE_FUTURES future { mark: diff --git a/src/mzscheme/src/mzrt.c b/src/mzscheme/src/mzrt.c index f6232cd5b1..a7b9cef979 100644 --- a/src/mzscheme/src/mzrt.c +++ b/src/mzscheme/src/mzrt.c @@ -1,6 +1,6 @@ #include "schpriv.h" -#ifdef MZ_USE_PLACES +#ifdef MZ_USE_MZRT /************************************************************************/ /************************************************************************/ @@ -194,18 +194,19 @@ mz_proc_thread* mzrt_proc_first_thread_init() { return thread; } -mz_proc_thread* mz_proc_thread_create(mz_proc_thread_start start_proc, void* data) { +mz_proc_thread* mz_proc_thread_create_w_stacksize(mz_proc_thread_start start_proc, void* data, long stacksize) { mz_proc_thread *thread = (mz_proc_thread*)malloc(sizeof(mz_proc_thread)); +# ifndef WIN32 pthread_attr_t *attr; - -#ifdef OS_X pthread_attr_t attr_storage; - attr = &attr_storage; - pthread_attr_init(attr); - pthread_attr_setstacksize(attr, 8*1024*1024); /*8MB*/ -#else - attr = NULL; -#endif + + if (stacksize) { + attr = &attr_storage; + pthread_attr_init(attr); + pthread_attr_setstacksize(attr, stacksize); /*8MB*/ + } else + attr = NULL; +# endif mzrt_thread_stub_data *stub_data = (mzrt_thread_stub_data*)malloc(sizeof(mzrt_thread_stub_data)); thread->mbox = pt_mbox_create(); @@ -213,7 +214,7 @@ mz_proc_thread* mz_proc_thread_create(mz_proc_thread_start start_proc, void* dat stub_data->data = data; stub_data->thread = thread; # ifdef WIN32 - thread->threadid = CreateThread(NULL, 0, mzrt_thread_stub, stub_data, 0, NULL); + thread->threadid = CreateThread(NULL, stacksize, mzrt_thread_stub, stub_data, 0, NULL); # else pthread_create(&thread->threadid, attr, mzrt_thread_stub, stub_data); # endif @@ -221,6 +222,18 @@ mz_proc_thread* mz_proc_thread_create(mz_proc_thread_start start_proc, void* dat return thread; } +mz_proc_thread* mz_proc_thread_create(mz_proc_thread_start start_proc, void* data) { + long stacksize; + +#ifdef OS_X + stacksize = 8*1024*1024; +#else + stacksize = 0; +#endif + + return mz_proc_thread_create_w_stacksize(start_proc, data, stacksize); +} + void * mz_proc_thread_wait(mz_proc_thread *thread) { #ifdef WIN32 DWORD rc; diff --git a/src/mzscheme/src/mzrt.h b/src/mzscheme/src/mzrt.h index 162323672b..954d77dc60 100644 --- a/src/mzscheme/src/mzrt.h +++ b/src/mzscheme/src/mzrt.h @@ -1,7 +1,7 @@ #ifndef MZRT_H #define MZRT_H -#ifdef MZ_USE_PLACES +#ifdef MZ_USE_MZRT /****************** ATOMIC OPERATIONS ************************************/ /* mzrt_atomic_ops.c */ @@ -44,6 +44,7 @@ typedef void *(mz_proc_thread_start)(void*); mz_proc_thread* mzrt_proc_first_thread_init(); mz_proc_thread* mz_proc_thread_create(mz_proc_thread_start*, void* data); +mz_proc_thread* mz_proc_thread_create_w_stacksize(mz_proc_thread_start*, void* data, long stacksize); void *mz_proc_thread_wait(mz_proc_thread *thread); int mz_proc_thread_detach(mz_proc_thread *thread); void mz_proc_thread_exit(void *rc); diff --git a/src/mzscheme/src/schpriv.h b/src/mzscheme/src/schpriv.h index 7558bb6cba..6f1e2ab5a5 100644 --- a/src/mzscheme/src/schpriv.h +++ b/src/mzscheme/src/schpriv.h @@ -403,6 +403,14 @@ THREAD_LOCAL_DECL(extern volatile int scheme_fuel_counter); THREAD_LOCAL_DECL(extern Scheme_Thread *scheme_main_thread); +#if defined(MZ_USE_PLACES) || defined(MZ_USE_FUTURES) +# define MZ_USE_MZRT +#endif + +#ifdef MZ_USE_MZRT +#include "mzrt.h" +#endif + #ifdef MZ_USE_PLACES THREAD_LOCAL_DECL(extern Scheme_Thread *scheme_current_thread); THREAD_LOCAL_DECL(extern Scheme_Thread *scheme_first_thread); @@ -415,7 +423,6 @@ THREAD_LOCAL_DECL(extern Scheme_Thread *scheme_first_thread); #define scheme_jumping_to_continuation (scheme_current_thread->cjs.jumping_to_continuation) #define scheme_multiple_count (scheme_current_thread->ku.multiple.count) #define scheme_multiple_array (scheme_current_thread->ku.multiple.array) -#include "mzrt.h" extern mz_proc_thread *scheme_master_proc_thread; THREAD_LOCAL_DECL(extern mz_proc_thread *proc_thread_self); #endif diff --git a/src/mzscheme/src/string.c b/src/mzscheme/src/string.c index d3db745161..6f314d8bba 100644 --- a/src/mzscheme/src/string.c +++ b/src/mzscheme/src/string.c @@ -163,9 +163,11 @@ typedef struct Scheme_Converter { may have changed. Similarly, setlocale() is only up-to-date when reset_locale() has been called. */ THREAD_LOCAL_DECL(static int locale_on); -THREAD_LOCAL_DECL(static const mzchar *current_locale_name); +THREAD_LOCAL_DECL(static void *current_locale_name_ptr); static void reset_locale(void); +#define current_locale_name ((const mzchar *)current_locale_name_ptr) + #ifdef USE_ICONV_DLL static char *nl_langinfo(int which) { @@ -173,7 +175,7 @@ static char *nl_langinfo(int which) reset_locale(); if (!current_locale_name) - current_locale_name = (mzchar *)"\0\0\0\0"; + current_locale_name_ptr ="\0\0\0\0"; if ((current_locale_name[0] == 'C') && !current_locale_name[1]) @@ -853,8 +855,8 @@ scheme_init_string (Scheme_Env *env) } void scheme_init_string_places(void) { - REGISTER_SO(current_locale_name); - current_locale_name = (mzchar *)"xxxx\0\0\0\0"; + REGISTER_SO(current_locale_name_ptr); + current_locale_name_ptr = "xxxx\0\0\0\0"; } /**********************************************************************/ @@ -3418,7 +3420,7 @@ static void reset_locale(void) setlocale(LC_COLLATE, "C"); } #endif - current_locale_name = name; + current_locale_name_ptr = (void *)name; } } diff --git a/src/mzscheme/src/thread.c b/src/mzscheme/src/thread.c index a25ff5b945..f02f499e7b 100644 --- a/src/mzscheme/src/thread.c +++ b/src/mzscheme/src/thread.c @@ -41,7 +41,7 @@ #include "schpriv.h" #include "schmach.h" #include "schgc.h" -#ifdef FUTURES_ENABLED +#ifdef MZ_USE_FUTURES # include "future.h" #endif #ifndef PALMOS_STUFF @@ -232,7 +232,6 @@ THREAD_LOCAL_DECL(static Scheme_Object *thread_swap_out_callbacks); THREAD_LOCAL_DECL(static Scheme_Object *recycle_cell); THREAD_LOCAL_DECL(static Scheme_Object *maybe_recycle_cell); THREAD_LOCAL_DECL(static int recycle_cc_count); -THREAD_LOCAL_DECL(static mz_jmp_buf main_init_error_buf); #ifdef MZ_PRECISE_GC extern long GC_get_memory_use(void *c); @@ -2199,7 +2198,7 @@ static Scheme_Thread *make_thread(Scheme_Config *config, process->suspend_break = 1; /* until start-up finished */ - process->error_buf = &main_init_error_buf; + process->error_buf = NULL; thread_swap_callbacks = scheme_null; thread_swap_out_callbacks = scheme_null; @@ -4130,7 +4129,7 @@ void scheme_thread_block(float sleep_time) /* Check scheduled_kills early and often. */ check_scheduled_kills(); -#ifdef FUTURES_ENABLED +#ifdef MZ_USE_FUTURES scheme_check_future_work(); #endif @@ -7349,7 +7348,7 @@ static void get_ready_for_GC() { start_this_gc_time = scheme_get_process_milliseconds(); -#ifdef FUTURES_ENABLED +#ifdef MZ_USE_FUTURES scheme_future_block_until_gc(); #endif @@ -7421,7 +7420,7 @@ static void done_with_GC() end_this_gc_time = scheme_get_process_milliseconds(); scheme_total_gc_time += (end_this_gc_time - start_this_gc_time); -#ifdef FUTURES_ENABLED +#ifdef MZ_USE_FUTURES scheme_future_continue_after_gc(); #endif } From da79980114c0962019df343fb1825864766be0d3 Mon Sep 17 00:00:00 2001 From: Eli Barzilay Date: Fri, 29 Jan 2010 08:50:05 +0000 Subject: [PATCH 103/113] Welcome to a new PLT day. svn: r17881 --- collects/repos-time-stamp/stamp.ss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/collects/repos-time-stamp/stamp.ss b/collects/repos-time-stamp/stamp.ss index 7c85c06189..a076d01b21 100644 --- a/collects/repos-time-stamp/stamp.ss +++ b/collects/repos-time-stamp/stamp.ss @@ -1 +1 @@ -#lang scheme/base (provide stamp) (define stamp "28jan2010") +#lang scheme/base (provide stamp) (define stamp "29jan2010") From 2d2a95de1e3d27d2b50f6c0bf5cd45f1ce013775 Mon Sep 17 00:00:00 2001 From: Casey Klein Date: Fri, 29 Jan 2010 13:42:13 +0000 Subject: [PATCH 104/113] Made counterexample structure transparent svn: r17882 --- collects/redex/private/rg.ss | 2 +- collects/redex/redex.scrbl | 2 +- collects/redex/tests/rg-test.ss | 17 ++++++++--------- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/collects/redex/private/rg.ss b/collects/redex/private/rg.ss index 04df780210..b9817cf770 100644 --- a/collects/redex/private/rg.ss +++ b/collects/redex/private/rg.ss @@ -750,7 +750,7 @@ #t)))) (define-struct (exn:fail:redex:test exn:fail:redex) (source term)) -(define-struct counterexample (term)) +(define-struct counterexample (term) #:transparent) (define (check generator property attempts retries show #:source [source #f] diff --git a/collects/redex/redex.scrbl b/collects/redex/redex.scrbl index 9d062200fb..7fc37e9828 100644 --- a/collects/redex/redex.scrbl +++ b/collects/redex/redex.scrbl @@ -1240,7 +1240,7 @@ term that does not match @scheme[pattern].} #:attempts 3 #:source R))] -@defstruct[counterexample ([term any/c])]{ +@defstruct[counterexample ([term any/c]) #:inspector #f]{ Produced by @scheme[redex-check], @scheme[check-reduction-relation], and @scheme[check-metafunction] when testing falsifies a property.} diff --git a/collects/redex/tests/rg-test.ss b/collects/redex/tests/rg-test.ss index 12c8571c1b..b233998dae 100644 --- a/collects/redex/tests/rg-test.ss +++ b/collects/redex/tests/rg-test.ss @@ -542,7 +542,8 @@ (n number)) (test (redex-check lang d #t #:attempts 1 #:print? (not #t)) #t) - (test (counterexample-term (redex-check lang d #f #:print? #f)) 5) + (test (redex-check lang d #f #:print? #f) + (make-counterexample 5)) (let ([exn (with-handlers ([exn:fail:redex:test? values]) (redex-check lang d (error 'boom ":(") #:print? #f) 'not-an-exn)]) @@ -602,11 +603,10 @@ #:source R #:print? (not #t)) #t) - (test (counterexample-term - (redex-check lang any (= (term any) 1) + (test (redex-check lang any (= (term any) 1) #:source R - #:print? #f)) - 2)) + #:print? #f) + (make-counterexample 2))) (let () (define-metafunction lang @@ -623,11 +623,10 @@ #:source mf #:print? (not #t)) #t) - (test (counterexample-term - (redex-check lang any (= (car (term any)) 42) + (test (redex-check lang any (= (car (term any)) 42) #:source mf - #:print? #f)) - '(0))) + #:print? #f) + (make-counterexample '(0)))) (let () (define-metafunction lang From d634beb1eb19f13a347d3927dab5b196fb31d58a Mon Sep 17 00:00:00 2001 From: Kevin Tew Date: Fri, 29 Jan 2010 14:21:25 +0000 Subject: [PATCH 105/113] Fix double initialization of paramz key svn: r17883 --- src/mzscheme/src/env.c | 5 ++++- src/mzscheme/src/schpriv.h | 3 ++- src/mzscheme/src/thread.c | 11 +++++++---- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/mzscheme/src/env.c b/src/mzscheme/src/env.c index 1a7f5de1fe..60e7d2c208 100644 --- a/src/mzscheme/src/env.c +++ b/src/mzscheme/src/env.c @@ -508,13 +508,15 @@ static Scheme_Env *place_instance_init(void *stack_base, int initial_main_os_thr #endif scheme_init_error_config(); +/* BEGIN PRIMITIVE MODULES */ scheme_init_memtrace(env); #ifndef NO_TCP_SUPPORT scheme_init_network(env); #endif - scheme_init_parameterization(env); + scheme_init_paramz(env); scheme_init_expand_observe(env); scheme_init_place(env); +/* END PRIMITIVE MODULES */ #if defined(MZ_USE_PLACES) scheme_jit_fill_threadlocal_table(); #endif @@ -631,6 +633,7 @@ static void make_kernel_env(void) #ifndef NO_REGEXP_UTILS MZTIMEIT(regexp, scheme_regexp_initialize(env)); #endif + scheme_init_parameterization(); MARK_START_TIME(); diff --git a/src/mzscheme/src/schpriv.h b/src/mzscheme/src/schpriv.h index 6f1e2ab5a5..3bfa135d30 100644 --- a/src/mzscheme/src/schpriv.h +++ b/src/mzscheme/src/schpriv.h @@ -238,7 +238,8 @@ void scheme_init_salloc(void); void scheme_init_jit(void); #endif void scheme_init_memtrace(Scheme_Env *env); -void scheme_init_parameterization(Scheme_Env *env); +void scheme_init_paramz(Scheme_Env *env); +void scheme_init_parameterization(); void scheme_init_getenv(void); void scheme_init_inspector(void); diff --git a/src/mzscheme/src/thread.c b/src/mzscheme/src/thread.c index f02f499e7b..69ff301437 100644 --- a/src/mzscheme/src/thread.c +++ b/src/mzscheme/src/thread.c @@ -850,17 +850,20 @@ Scheme_Object *scheme_get_current_inspector() return scheme_get_param(c, MZCONFIG_INSPECTOR); } -void scheme_init_parameterization(Scheme_Env *env) +void scheme_init_parameterization() { - Scheme_Object *v; - Scheme_Env *newenv; - REGISTER_SO(scheme_exn_handler_key); REGISTER_SO(scheme_parameterization_key); REGISTER_SO(scheme_break_enabled_key); scheme_exn_handler_key = scheme_make_symbol("exnh"); scheme_parameterization_key = scheme_make_symbol("paramz"); scheme_break_enabled_key = scheme_make_symbol("break-on?"); +} + +void scheme_init_paramz(Scheme_Env *env) +{ + Scheme_Object *v; + Scheme_Env *newenv; v = scheme_intern_symbol("#%paramz"); newenv = scheme_primitive_module(v, env); From 42e68c8ff1f668fd54c4d1f975b4653ee6e3c08c Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Fri, 29 Jan 2010 16:33:15 +0000 Subject: [PATCH 106/113] even more benchmark scaffolding svn: r17884 --- .../tests/mzscheme/benchmarks/common/auto.ss | 114 +++++++++++++++- .../benchmarks/common/guile-prelude.sch | 29 ++++ .../benchmarks/common/index-template.html | 16 ++- .../benchmarks/common/mit-prelude.sch | 31 +++++ .../mzscheme/benchmarks/common/nucleic2.sch | 2 +- .../benchmarks/common/petite-prelude.sch | 4 + .../benchmarks/common/scheme48-prelude.sch | 22 +++ .../mzscheme/benchmarks/common/tabulate.ss | 126 ++++++++++++------ 8 files changed, 297 insertions(+), 47 deletions(-) create mode 100644 collects/tests/mzscheme/benchmarks/common/guile-prelude.sch create mode 100644 collects/tests/mzscheme/benchmarks/common/mit-prelude.sch create mode 100644 collects/tests/mzscheme/benchmarks/common/petite-prelude.sch create mode 100644 collects/tests/mzscheme/benchmarks/common/scheme48-prelude.sch diff --git a/collects/tests/mzscheme/benchmarks/common/auto.ss b/collects/tests/mzscheme/benchmarks/common/auto.ss index a532255f51..5c1c61b84e 100755 --- a/collects/tests/mzscheme/benchmarks/common/auto.ss +++ b/collects/tests/mzscheme/benchmarks/common/auto.ss @@ -157,6 +157,89 @@ exec mzscheme -qu "$0" ${1+"$@"} (clean-up-sps bm) (system "rm -rf ~/.ikarus")) + (define (run-scheme48 bm) + (parameterize ([current-input-port + (open-input-string + (format + ",bench on\n,open time bitwise\n,load \"scheme48-prelude.sch\"\n,load \"~a.sch\"\n,exit\n" + bm))]) + (system "scheme48 -h 20000000"))) + + (define (extract-scheme48-times bm str) + (let ([m (regexp-match #rx#"cpu time: ([0-9]+) real time: ([0-9]+)" str)] + ;; `time' result is 10s of milliseconds? OS ticks, maybe? + [msec/tick 10]) + (list (bytes->number (cadr m)) + (bytes->number (caddr m)) + 0))) + + (define (mk-mit bm) + (with-output-to-file (format "~a.scm" bm) + #:exists 'truncate + (lambda () + (printf "(declare (usual-integrations))\n") + (call-with-input-file "mit-prelude.sch" + (lambda (in) (copy-port in (current-output-port)))) + (call-with-input-file (format "~a.sch" bm) + (lambda (in) (copy-port in (current-output-port)))))) + (parameterize ([current-input-port + (open-input-string + (format "(cf \"~a\")\n" bm))] + [current-output-port (open-output-nowhere)]) + (system "mit-scheme"))) + + (define (run-mit bm) + (parameterize ([current-input-port + (open-input-string + (format "(load \"~a\")\n(exit)\ny\n" bm))]) + (system "mit-scheme --heap 12000"))) + + (define (clean-up-mit bm) + (delete-file (format "~a.com" bm)) + (delete-file (format "~a.ext" bm)) + (delete-file (format "~a.bci" bm)) + (delete-file (format "~a.bin" bm)) + (delete-file (format "~a.scm" bm))) + + (define (extract-mit-times bm str) + (let ([m (regexp-match #rx#"cpu: ([0-9]+) real: ([0-9]+) gc: ([0-9]+)" str)] + ;; `time' result is 10s of milliseconds? OS ticks, maybe? + [msec/tick 10]) + (list (bytes->number (cadr m)) + (bytes->number (caddr m)) + (bytes->number (cadddr m))))) + + (define (run-petite bm) + (parameterize ([current-input-port + (open-input-string + (format + "(load \"petite-prelude.sch\")\n(load \"~a.sch\")\n(exit)\n" + bm))]) + (system "petite"))) + + (define (extract-petite-times bm str) + (let ([m (regexp-match #rx#"([0-9]+) ms elapsed cpu time(?:, including ([0-9]+) ms collecting)?[ \n]* ([0-9]+) ms elapsed real time" str)]) + (list (bytes->number (cadr m)) + (bytes->number (cadddr m)) + (if (caddr m) (bytes->number (caddr m)) 0)))) + + (define (run-guile bm) + (parameterize ([current-input-port + (open-input-string + (format + "(load \"guile-prelude.sch\")\n(load \"~a.sch\")\n" + bm))]) + (system "guile"))) + + (define (extract-guile-times bm str) + (let ([m (regexp-match #rx#"user: ([0-9]+) system: ([0-9]+) real: ([0-9]+) gc: ([0-9]+)" str)] + ;; `time' result is 10s of milliseconds? OS ticks, maybe? + [msec/tick 10]) + (list (+ (bytes->number (cadr m)) + (bytes->number (caddr m))) + (bytes->number (cadddr m)) + (bytes->number (cadddr (cdr m)))))) + (define (extract-times bm str) str) @@ -345,7 +428,36 @@ exec mzscheme -qu "$0" ${1+"$@"} run-ikarus extract-ikarus-times clean-up-ikarus - '(takr)))) + '(takr)) + (make-impl 'mit + void + mk-mit + run-mit + extract-mit-times + clean-up-mit + '(nucleic2 puzzle takr2)) + (make-impl 'scheme48 + void + void + run-scheme48 + extract-scheme48-times + void + '()) + (make-impl 'petite + void + void + run-petite + extract-petite-times + void + '()) + (make-impl 'guile + void + void + run-guile + extract-guile-times + void + '(dynamic dynamic2)) +)) (define obsolte-impls '(mzscheme3m mzschemecgc mzscheme-j mzschemecgc-j mzschemecgc-tl mzc mz-old)) diff --git a/collects/tests/mzscheme/benchmarks/common/guile-prelude.sch b/collects/tests/mzscheme/benchmarks/common/guile-prelude.sch new file mode 100644 index 0000000000..f9e61fb5d1 --- /dev/null +++ b/collects/tests/mzscheme/benchmarks/common/guile-prelude.sch @@ -0,0 +1,29 @@ + +(use-syntax (ice-9 syncase)) + +(define (msecs v) + (quotient (* v 1000) internal-time-units-per-second)) + +(define (time* thunk) + (let ((start (times)) + (start-gc (gc-run-time))) + (let ((v (thunk))) + (let ((end (times)) + (end-gc (gc-run-time))) + (display "user: ") + (display (msecs (- (tms:utime end) (tms:utime start)))) + (display " system: ") + (display (msecs (- (tms:stime end) (tms:stime start)))) + (display " real: ") + (display (msecs (- (tms:stime end) (tms:stime start)))) + (display " gc: ") + (display (msecs (- end-gc start-gc))) + (newline))))) + +(define-syntax time + (syntax-rules () + ((_ expr) (time* (lambda () expr))))) + +(define bitwise-and logand) +(define bitwise-ior logior) +(define bitwise-not lognot) \ No newline at end of file diff --git a/collects/tests/mzscheme/benchmarks/common/index-template.html b/collects/tests/mzscheme/benchmarks/common/index-template.html index 65db9ac8d1..03d1126c69 100644 --- a/collects/tests/mzscheme/benchmarks/common/index-template.html +++ b/collects/tests/mzscheme/benchmarks/common/index-template.html @@ -1,11 +1,14 @@ -Some Scheme Benchmarks +Some Scheme Benchmarks: Compilers

            About the Benchmarks

            -

            The benchmark page shows some benchmark results on a collection of fairly standard - (mostly Gabriel) Scheme benchmarks.

            +

            The benchmark page shows some + benchmark results on a collection of fairly standard (mostly + Gabriel) Scheme benchmarks. (See also the + extended compilers and + interepreters results.)

            Tables show relative performance, with the actual time for the fastest run shown on the left. So, by @@ -22,7 +25,7 @@ time.

            Run times are averaged over three runs. All reported times are CPU time (system plus user). The times are based on the output of the implementation's time - syntactic form for function.

            + syntactic form or similar functions.

            Machine:

              @@ -31,12 +34,13 @@ time.

              Compiler configurations:

                -
              • Bigloo (3.3a): -06 -call/cc -copt -O3 -copt -fomit-frame-pointer -
              • Chicken (4.3.0): -no-trace -no-lambda-info -optimize-level 3 -block -lambda-lift +
              • Bigloo (3.3a): -06 -call/cc -copt -O3 -copt -fomit-frame-pointer
              • +
              • Chicken (4.3.0): -no-trace -no-lambda-info -optimize-level 3 -block -lambda-lift
              • Gambit (4.6.0): (declare (block) (standard-bindings) (extended-bindings) (safe) (interrupts-enabled)), compiled and run with -:m10000
              • Ikarus (0.0.4-rc1+ rev 1870): in R6RS library
              • Larceny (0.97): in R6RS library
              • +
              • MIT (7.7.90+): (declare (usual-integrations)); run with --heap 12000
              • PLT (4.2.4): in module; for benchmarks that use set-car! and set-cdr!, PLT's R5RS support is used
              diff --git a/collects/tests/mzscheme/benchmarks/common/mit-prelude.sch b/collects/tests/mzscheme/benchmarks/common/mit-prelude.sch new file mode 100644 index 0000000000..d5ea5a42cf --- /dev/null +++ b/collects/tests/mzscheme/benchmarks/common/mit-prelude.sch @@ -0,0 +1,31 @@ + +(declare (usual-integrations)) + +(define-syntax time + (syntax-rules () + ((_ expr) + (with-timings + (lambda () expr) + (lambda (run-time gc-time real-time) + (display "cpu: ") + (display run-time) + (display " real: ") + (display real-time) + (display " gc: ") + (display gc-time) + (newline)))))) + +(define-integrable (bitwise-and a b) + (if (and (fix:fixnum? a) + (fix:fixnum? b)) + (fix:and a b) + 0)) +(define-integrable (bitwise-ior a b) + (if (and (fix:fixnum? a) + (fix:fixnum? b)) + (fix:or a b) + 0)) +(define-integrable (bitwise-not a) + (if (fix:fixnum? a) + (fix:not a) + 0)) \ No newline at end of file diff --git a/collects/tests/mzscheme/benchmarks/common/nucleic2.sch b/collects/tests/mzscheme/benchmarks/common/nucleic2.sch index 2e99c4119b..4c3c347a87 100644 --- a/collects/tests/mzscheme/benchmarks/common/nucleic2.sch +++ b/collects/tests/mzscheme/benchmarks/common/nucleic2.sch @@ -3505,4 +3505,4 @@ ; To run program, evaluate: (run) -(time (let loop ([i 10]) (if (zero? i) 'done (begin (run) (loop (- i 1)))))) +(time (let loop ((i 10)) (if (zero? i) 'done (begin (run) (loop (- i 1)))))) diff --git a/collects/tests/mzscheme/benchmarks/common/petite-prelude.sch b/collects/tests/mzscheme/benchmarks/common/petite-prelude.sch new file mode 100644 index 0000000000..27dc6d694b --- /dev/null +++ b/collects/tests/mzscheme/benchmarks/common/petite-prelude.sch @@ -0,0 +1,4 @@ + +(define bitwise-and logand) +(define bitwise-ior logior) +(define bitwise-not lognot) \ No newline at end of file diff --git a/collects/tests/mzscheme/benchmarks/common/scheme48-prelude.sch b/collects/tests/mzscheme/benchmarks/common/scheme48-prelude.sch new file mode 100644 index 0000000000..1e6fcd4986 --- /dev/null +++ b/collects/tests/mzscheme/benchmarks/common/scheme48-prelude.sch @@ -0,0 +1,22 @@ +(define (time* thunk) + (let ((start-cpu (run-time)) + (start-real (real-time))) + (let ((result (thunk))) + (let ((end-cpu (run-time)) + (end-real (real-time))) + (let ((cpu (- end-cpu start-cpu)) + (real (- end-real start-real))) + (display "cpu time: ") + (display cpu) + (display " real time: ") + (display real) + (newline) + result))))) + +(define-syntax time + (syntax-rules () + ((_ expr) (time* (lambda () expr))))) + +(define (error . args) (+ 1 args)) + + diff --git a/collects/tests/mzscheme/benchmarks/common/tabulate.ss b/collects/tests/mzscheme/benchmarks/common/tabulate.ss index 4675cf0c59..019d7200b0 100755 --- a/collects/tests/mzscheme/benchmarks/common/tabulate.ss +++ b/collects/tests/mzscheme/benchmarks/common/tabulate.ss @@ -26,6 +26,7 @@ exec mzscheme -qu "$0" ${1+"$@"} (define nongc (make-parameter #f)) (define subtract-nothing (make-parameter #f)) (define generate-graph (make-parameter #f)) + (define no-compile-time (make-parameter #f)) (command-line "tabulate" @@ -37,6 +38,8 @@ exec mzscheme -qu "$0" ${1+"$@"} (include-links #t)] [("--multi") name "generate multiple pages for different views of data" (base-link-filename name)] + [("--no-compile-time") "do not show compile times" + (no-compile-time #t)] [("--nongc") "show times not including GC" (nongc #t)] [("--index") "generate full page with an index.html link" @@ -87,7 +90,7 @@ exec mzscheme -qu "$0" ${1+"$@"} (car runs) #f)]) (if a - (cadadr a) + (cadar a) 0)) 0)]) (max (- (or (cadadr runs) 0) @@ -266,6 +269,27 @@ exec mzscheme -qu "$0" ${1+"$@"} (proc fastest n-fastest c-fastest relative-to base n-base c-base)))) + (define (bar-group name content) + `(tr ((style "background-color: #eeeeee")) + (td ((valign "top")) ,(symbol->string name)) + (td + (table + ((style "border-spacing: 0px;")) + ,@(content))))) + + (define (bar-plot impl n ratio) + `(tr (td (span ((style "font-size: small;")) + ,(symbol->string impl)) + nbsp) + (td ((style "padding: 0em;")) + ,(if (and n ratio) + (let ([col (darken (lookup-color impl))]) + `(span ((style ,(format "background-color: ~a; color: ~a;" col col))) + ,(format (make-string (max (floor (* 60 (if (zero? n) 1 ratio))) + 1) + #\x)))) + "")))) + (define (generate-page relative-to grouping graph? has-other?) (empty-tag-shorthand html-empty-tags) (write-xml/content @@ -297,7 +321,7 @@ exec mzscheme -qu "$0" ${1+"$@"} 0] [else (add1 (loop (cdr impls)))]))]) (cons - `(td ((colspan ,(number->string (* 2 (+ 1 count)))) + `(td ((colspan ,(number->string (* (if (no-compile-time) 1 2) (+ 1 count)))) (align "center") (bgcolor "#DDDDFF")) (b ,(if (equal? s relative-to) @@ -315,7 +339,7 @@ exec mzscheme -qu "$0" ${1+"$@"} ,(if (eq? grouping 'mode) "impl" "mode"))))) - (td ((colspan "2") (align "right")) + (td ((colspan ,(if (no-compile-time) "1" "2")) (align "right")) ,(if (and (base-link-filename) relative-to) `(a ((href ,(fixup-filename @@ -325,7 +349,7 @@ exec mzscheme -qu "$0" ${1+"$@"} "fastest") "fastest")) ,@(map (lambda (impl) - `(td ((colspan "2") (align "right")) + `(td ((colspan ,(if (no-compile-time) "1" "2")) (align "right")) (b ,(let ([s (extract-column impl (opposite grouping))]) (if (and (base-link-filename) (not (eq? impl relative-to))) @@ -357,12 +381,14 @@ exec mzscheme -qu "$0" ${1+"$@"} (car bm-run)))) ,(symbol->string (car bm-run))) (symbol->string (car bm-run)))) - (td ((align "right")) - nbsp - ,(small (if (= c-fastest forever) - " " - (number->string c-fastest))) - nbsp) + ,@(if (no-compile-time) + null + `((td ((align "right")) + nbsp + ,(small (if (= c-fastest forever) + " " + (number->string c-fastest))) + nbsp))) (td ((align "right")) ,(format "~a ms" fastest) nbsp nbsp) @@ -372,14 +398,17 @@ exec mzscheme -qu "$0" ${1+"$@"} (let* ([a (assq impl (cdr bm-run))] [n (and a (caadr a))] [n2 (and a (ntime a))]) - `(,(if (= c-fastest forever) - `(td) - `(td ((align "right") - (bgcolor ,(lookup-color impl))) - ,(if (and a (caddr a) c-base (positive? c-base)) - (small (ratio->string (/ (caddr a) c-base))) - '"-") - nbsp)) + `(,@(if (no-compile-time) + null + (list + (if (= c-fastest forever) + `(td) + `(td ((align "right") + (bgcolor ,(lookup-color impl))) + ,(if (and a (caddr a) c-base (positive? c-base)) + (small (ratio->string (/ (caddr a) c-base))) + '"-") + nbsp)))) (td ((bgcolor ,(if (and n base (= n base) (or (not orig-relative-to) (and (string? orig-relative-to) @@ -421,6 +450,36 @@ exec mzscheme -qu "$0" ${1+"$@"} ,@(if has-other? `(nbsp nbsp (a ((href ,(output-name #f 'impl #f))) "Back to tables")) null))) + ,(let* ([bm-runs (filter (lambda (bm-run) + (andmap (lambda (impl) + (let ([a (assq impl (cdr bm-run))]) + (and a (caadr a)))) + sorted-impls)) + sorted-runs)] + [rel-vals (map (lambda (bm-run) + (call-with-bm-info + bm-run + relative-to + grouping + (lambda (fastest n-fastest c-fastest relative-to + base n-base c-base) + (map (lambda (impl) + (let* ([a (assq impl (cdr bm-run))] + [n (and a (caadr a))]) + (list impl (if (zero? n) 1 (/ base n))))) + sorted-impls)))) + bm-runs)] + [avgs (map (lambda (impl) + (let ([vals (map (lambda (rel-val) (cadr (assq impl rel-val))) + rel-vals)]) + (sqrt (apply + (map (lambda (x) (* x x)) vals))))) + sorted-impls)] + [max-avg (apply max avgs)]) + (bar-group 'geometric-mean + (lambda () + (map (lambda (impl avg) + (bar-plot impl 1 (inexact->exact (/ avg max-avg)))) + sorted-impls avgs)))) ,@(map (lambda (bm-run) (call-with-bm-info bm-run @@ -428,27 +487,16 @@ exec mzscheme -qu "$0" ${1+"$@"} grouping (lambda (fastest n-fastest c-fastest relative-to base n-base c-base) - `(tr ((style "background-color: #eeeeee")) - (td ((valign "top")) ,(symbol->string (car bm-run))) - (td - (table - ((style "border-spacing: 0px;")) - ,@(map (lambda (impl) - (let* ([a (assq impl (cdr bm-run))] - [n (and a (caadr a))] - [n2 (and a (ntime a))]) - `(tr (td (span ((style "font-size: small;")) - ,(symbol->string impl)) - nbsp) - (td ((style "padding: 0em;")) - ,(if (and n base) - (let ([col (darken (lookup-color impl))]) - `(span ((style ,(format "background-color: ~a; color: ~a;" col col))) - ,(format (make-string (max (floor (* 60 (if (zero? n) 1 (/ base n)))) - 1) - #\x)))) - ""))))) - sorted-impls))))))) + (bar-group + (car bm-run) + (lambda () + (map (lambda (impl) + (let* ([a (assq impl (cdr bm-run))] + [n (and a (caadr a))] + [n2 (and a (ntime a))]) + (bar-plot impl n (and n base (not (zero? n)) + (/ base n))))) + sorted-impls)))))) sorted-runs)))))) (newline)) From d6201776197829532338f063fb48b95740ed2579 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Fri, 29 Jan 2010 17:49:25 +0000 Subject: [PATCH 107/113] fix benchmark readme svn: r17885 --- .../mzscheme/benchmarks/common/README.txt | 10 ++--- .../benchmarks/common/index-template.html | 39 +++++++++++-------- 2 files changed, 27 insertions(+), 22 deletions(-) diff --git a/collects/tests/mzscheme/benchmarks/common/README.txt b/collects/tests/mzscheme/benchmarks/common/README.txt index cc79243730..ab3f7585a4 100644 --- a/collects/tests/mzscheme/benchmarks/common/README.txt +++ b/collects/tests/mzscheme/benchmarks/common/README.txt @@ -1,7 +1,7 @@ To run a benchmark, assuming you have `mzscheme' in your path: ./auto.ss ... where names an implementation as one of - mzscheme3m + mzscheme bigloo chicken gambit @@ -17,8 +17,8 @@ or any of the above prefixed by "no-" to skip the corresponding and benchmarks, run ./auto.ss --show -Naming no implementation/benchmark causes a standard of them to be run -(as reported by --show). Similarly, if the first named +Naming no implementation/benchmark causes a standard set of them to be +run (as reported by --show). Similarly, if the first named implementation/benchmak starts with "no-", the default set is used minus the "no-"-specified implementation/benchmark. @@ -36,7 +36,7 @@ All benchmarks must be run from the directory containing this file. Most bechmarks were obtained from http://www.cs.cmu.edu/afs/cs/project/ai-repository/ai/lang/scheme/code/bench/gabriel/ http://www.ccs.neu.edu/home/will/GC/sourcecode.html - Marc Feeley (who has all of them and more) + Marc Feeley Files that end in ".sch" are supposed to be standard Scheme plus `time'. Files that end in ".ss" are MzScheme wrapper modules or helper scripts. @@ -47,4 +47,4 @@ To build .sch directly with Gambit, Bigloo, or Chicken: mzscheme -qr mk-chicken.ss ; Unpack "dynamic-input.txt.gz" if you want to run the "dynamic" benchmark, -but the auto.ss script will do that for you. +but the "auto.ss" script will do that for you. diff --git a/collects/tests/mzscheme/benchmarks/common/index-template.html b/collects/tests/mzscheme/benchmarks/common/index-template.html index 03d1126c69..7f49f71c0c 100644 --- a/collects/tests/mzscheme/benchmarks/common/index-template.html +++ b/collects/tests/mzscheme/benchmarks/common/index-template.html @@ -1,14 +1,12 @@ -Some Scheme Benchmarks: Compilers +Some Scheme Benchmarks

              About the Benchmarks

              -

              The benchmark page shows some +

              The benchmark results page shows some benchmark results on a collection of fairly standard (mostly - Gabriel) Scheme benchmarks. (See also the - extended compilers and - interepreters results.)

              + Gabriel) Scheme benchmarks.

              Tables show relative performance, with the actual time for the fastest run shown on the left. So, by @@ -18,14 +16,18 @@ benchmark didn't run in an implementation for some reason (possibly not a good one).

              -

              Small gray numbers are (relative) -compile times, where the compile time for the nothing -benchmark is subtracted from every other benchmark's compile -time.

              +

              +The compilers-only page shows +just the compilers among the tested implementations. For those +results, the small gray numbers are (relative) compile times, where +the compile time for the nothing benchmark is subtracted from +every other benchmark's compile time.

              -

              Run times are averaged over three runs. All reported times are CPU time (system plus user). - The times are based on the output of the implementation's time - syntactic form or similar functions.

              +

              Run times are averaged over three runs for compilers or one run for + interpreters. All reported times are CPU time (system plus user). + The times are based on the output of the + implementation's time syntactic form or similar + functions.

              Machine:

                @@ -38,16 +40,19 @@ time.

              • Chicken (4.3.0): -no-trace -no-lambda-info -optimize-level 3 -block -lambda-lift
              • Gambit (4.6.0): (declare (block) (standard-bindings) (extended-bindings) (safe) (interrupts-enabled)), compiled and run with -:m10000
              • +
              • Guile (1.8.7): load
              • Ikarus (0.0.4-rc1+ rev 1870): in R6RS library
              • Larceny (0.97): in R6RS library
              • MIT (7.7.90+): (declare (usual-integrations)); run with --heap 12000
              • +
              • Petite Chez (7.4d): load
              • PLT (4.2.4): in module; for benchmarks that use set-car! and set-cdr!, PLT's R5RS support is used
              • +
              • Scheme48 (1.8): load after ,bench on
              -These configurations are all “safe mode,” but they allow the compiler -to assume that built-in Scheme functions are not redefined and that no top-level defintion is ever -changed. Such assumptions correspond to putting the benchmark in an -R6RS library.

              +These configurations are all “safe mode,” but they allow a +compiler to assume that built-in Scheme functions are not redefined +and that no top-level defintion is ever changed. Such assumptions +correspond to putting the benchmark in an R6RS library.

              In general, we attempt to use the various implementations in a compentent way, but not in a sophisticated way. For example, we do not tweak @@ -56,7 +61,7 @@ R6RS library.

              For more benchmarks and a more sophisticated use of a few compilers, including fixnum- and flonum-specific arithmetic as well as unsafe modes, - see this other page.

              + see Gambit benchmark results.

              For further details on the benchmarks here, see the benchmark source and infrastructure, which is available form the PLT SVN repository:

              From be5b6cd32e4a95c834d76ce487c95f4151307805 Mon Sep 17 00:00:00 2001 From: Robby Findler Date: Fri, 29 Jan 2010 18:29:03 +0000 Subject: [PATCH 108/113] some improvements to the new language dialog svn: r17886 --- collects/drscheme/private/drsig.ss | 5 +- .../private/language-configuration.ss | 63 ++++++++++++------- collects/drscheme/private/module-language.ss | 15 ++++- collects/drscheme/private/rep.ss | 17 +++-- collects/mrlib/hierlist/hierlist-unit.ss | 37 +++++++---- .../mrlib/scribblings/hierlist/list.scrbl | 10 ++- 6 files changed, 104 insertions(+), 43 deletions(-) diff --git a/collects/drscheme/private/drsig.ss b/collects/drscheme/private/drsig.ss index 88b8bf257e..4645b8a393 100644 --- a/collects/drscheme/private/drsig.ss +++ b/collects/drscheme/private/drsig.ss @@ -79,10 +79,11 @@ ;show-syntax-error-context )) -(define-signature drscheme:module-langauge-cm^ +(define-signature drscheme:module-language-cm^ (module-language<%>)) -(define-signature drscheme:module-language^ extends drscheme:module-langauge-cm^ +(define-signature drscheme:module-language^ extends drscheme:module-language-cm^ (add-module-language + module-language-name module-language-put-file-mixin)) (define-signature drscheme:module-langauge-tools-cm^ diff --git a/collects/drscheme/private/language-configuration.ss b/collects/drscheme/private/language-configuration.ss index 637dd15f9b..d37019deeb 100644 --- a/collects/drscheme/private/language-configuration.ss +++ b/collects/drscheme/private/language-configuration.ss @@ -22,7 +22,7 @@ (define sc-use-language-in-source "Use the language declared in the source") (define sc-choose-a-language "Choose a language") (define sc-lang-in-source-discussion - "Typically, a #lang line at the start of a program declares its language. This is the default and preferred mode for DrScheme.") + "The #lang line at the start of a program declares its language. This is the default and preferred mode for DrScheme.") (provide language-configuration@) @@ -33,7 +33,8 @@ [prefix drscheme:language: drscheme:language^] [prefix drscheme:app: drscheme:app^] [prefix drscheme:tools: drscheme:tools^] - [prefix drscheme:help-desk: drscheme:help-desk^]) + [prefix drscheme:help-desk: drscheme:help-desk^] + [prefix drscheme:module-language: drscheme:module-language^]) (export drscheme:language-configuration/internal^) ;; settings-preferences-symbol : symbol @@ -346,9 +347,11 @@ cached-fringe) (define/override (on-select i) - (if (and i (is-a? i hieritem-language<%>)) - (something-selected i) - (nothing-selected))) + (cond + [(and i (is-a? i hieritem-language<%>)) + (something-selected i)] + [else + (non-language-selected)])) ;; this is used only because we set `on-click-always' (define/override (on-click i) (when (and i (is-a? i hierarchical-list-compound-item<%>)) @@ -358,7 +361,7 @@ (when (and i (is-a? i hieritem-language<%>)) (something-selected i) (ok-handler 'execute))) - (super-instantiate (parent)) + (super-new [parent parent]) ;; do this so we can expand/collapse languages on a single click (send this on-click-always #t))) @@ -398,7 +401,9 @@ [stretchable-width #f] [min-width 24])) - (define languages-hier-list (make-object selectable-hierlist% languages-hier-list-panel)) + (define languages-hier-list (new selectable-hierlist% + [parent languages-hier-list-panel] + [style '(no-border no-hscroll hide-vscroll transparent)])) (define details-outer-panel (make-object vertical-pane% outermost-panel)) (define details/manual-parent-panel (make-object vertical-panel% details-outer-panel)) (define details-panel (make-object panel:single% details/manual-parent-panel)) @@ -435,8 +440,6 @@ (init-rest args) (public selected) (define (selected) - (send use-chosen-language-rb set-selection 0) - (send use-language-in-source-rb set-selection #f) (update-gui-based-on-selected-language language get-language-details-panel get/set-settings)) (apply super-make-object args)))) @@ -454,6 +457,8 @@ ;(send languages-hier-list select #f) (send use-chosen-language-rb set-selection #f) (send use-language-in-source-rb set-selection 0) + (ok-handler 'enable) + (send details-button enable #t) (update-gui-based-on-selected-language module-language*language module-language*get-language-details-panel module-language*get/set-settings)) @@ -462,10 +467,12 @@ (define module-language*get-language-details-panel 'module-language*-not-yet-set) (define module-language*get/set-settings 'module-language*-not-yet-set) - ;; nothing-selected : -> void + ;; non-language-selected : -> void ;; updates the GUI and selected-language and get/set-selected-language-settings - ;; for when no language is selected. - (define (nothing-selected) + ;; for when some non-language is selected in the hierlist + (define (non-language-selected) + (send use-chosen-language-rb set-selection 0) + (send use-language-in-source-rb set-selection #f) (send revert-to-defaults-button enable #f) (send details-panel active-child no-details-panel) (send one-line-summary-message set-label "") @@ -476,7 +483,9 @@ ;; something-selected : item -> void (define (something-selected item) - (ok-handler 'enable) + (send use-chosen-language-rb set-selection 0) + (send use-language-in-source-rb set-selection #f) + (ok-handler 'enable) (send details-button enable #t) (send item selected)) @@ -507,7 +516,7 @@ positions numbers)) (when (null? (cdr positions)) - (unless (equal? positions (list "Module")) + (unless (equal? positions (list drscheme:module-language:module-language-name)) (error 'drscheme:language "Only the module language may be at the top level. Other languages must have at least two levels"))) @@ -578,7 +587,7 @@ (get/set-settings (send language default-settings))]))))) (cond - [(equal? positions '("Module")) + [(equal? positions (list drscheme:module-language:module-language-name)) (set! module-language*language language) (set! module-language*get-language-details-panel get-language-details-panel) (set! module-language*get/set-settings get/set-settings)] @@ -909,15 +918,25 @@ (send t set-styles-sticky #f) (send t set-autowrap-bitmap #f) - (let ([do-insert - (λ (str style) - (let ([before (send t last-position)]) - (send t insert str before before) - (send t change-style style before (send t last-position))))]) + (let* ([size-sd (make-object style-delta% 'change-size (send small-control-font get-point-size))] + [do-insert + (λ (str tt-style?) + (let ([before (send t last-position)]) + (send t insert str before before) + (cond + [tt-style? + (send t change-style + (send (send t get-style-list) find-named-style "Standard") + before (send t last-position))] + [else + (send t change-style + (send (send t get-style-list) basic-style) + before (send t last-position))]) + (send t change-style size-sd before (send t last-position))))]) (let loop ([strs (regexp-split #rx"#lang" sc-lang-in-source-discussion)]) - (do-insert (car strs) (send (send t get-style-list) basic-style)) + (do-insert (car strs) #f) (unless (null? (cdr strs)) - (do-insert "#lang" (send (send t get-style-list) find-named-style "standard")) + (do-insert "#lang" #t) (loop (cdr strs))))) (send t hide-caret #t) diff --git a/collects/drscheme/private/module-language.ss b/collects/drscheme/private/module-language.ss index 1c56cc64f2..04c1c80799 100644 --- a/collects/drscheme/private/module-language.ss +++ b/collects/drscheme/private/module-language.ss @@ -29,7 +29,7 @@ (define module-language<%> (interface () - )) + get-users-language-name)) ;; add-module-language : -> void ;; adds the special module-only language to drscheme @@ -53,10 +53,21 @@ (define default-full-trace? #t) (define default-auto-text "#lang scheme\n") + (define module-language-name "Determine langauge from source") + ;; module-mixin : (implements drscheme:language:language<%>) ;; -> (implements drscheme:language:language<%>) (define (module-mixin %) (class* % (drscheme:language:language<%> module-language<%>) + + (inherit get-language-name) + (define/public (get-users-language-name defs-text) + (let ([m (regexp-match "#lang (.*)$" + (send defs-text get-text 0 (send defs-text paragraph-end-position 1)))]) + (if m + (list-ref m 1) + (get-language-name)))) + (define/override (use-namespace-require/copy?) #f) (define/augment (capability-value key) @@ -328,7 +339,7 @@ (super-new [module #f] - [language-position (list "Module")] + [language-position (list module-language-name)] [language-numbers (list -32768)]))) ;; can be called with #f to just kill the repl (in case we want to kill it diff --git a/collects/drscheme/private/rep.ss b/collects/drscheme/private/rep.ss index 9e4d84d01d..4c272b9644 100644 --- a/collects/drscheme/private/rep.ss +++ b/collects/drscheme/private/rep.ss @@ -89,7 +89,8 @@ TODO (prefix drscheme:text: drscheme:text^) (prefix drscheme:help-desk: drscheme:help-desk^) (prefix drscheme:debug: drscheme:debug^) - [prefix drscheme:eval: drscheme:eval^]) + [prefix drscheme:eval: drscheme:eval^] + [prefix drscheme:module-language: drscheme:module-language^]) (export (rename drscheme:rep^ [-text% text%] [-text<%> text<%>])) @@ -402,9 +403,15 @@ TODO default-settings? (drscheme:language-configuration:language-settings-settings language-settings))) - (define (extract-language-name language-settings) - (send (drscheme:language-configuration:language-settings-language language-settings) - get-language-name)) + (define (extract-language-name language-settings defs-text) + (cond + [(is-a? (drscheme:language-configuration:language-settings-language language-settings) + drscheme:module-language:module-language<%>) + (send (drscheme:language-configuration:language-settings-language language-settings) + get-users-language-name defs-text)] + [else + (send (drscheme:language-configuration:language-settings-language language-settings) + get-language-name)])) (define (extract-language-style-delta language-settings) (send (drscheme:language-configuration:language-settings-language language-settings) get-style-delta)) @@ -1587,7 +1594,7 @@ TODO (let-values (((before after) (insert/delta this - (extract-language-name user-language-settings) + (extract-language-name user-language-settings definitions-text) dark-green-delta (extract-language-style-delta user-language-settings))) ((url) (extract-language-url user-language-settings))) diff --git a/collects/mrlib/hierlist/hierlist-unit.ss b/collects/mrlib/hierlist/hierlist-unit.ss index 6a0b026aff..27b1cb6016 100644 --- a/collects/mrlib/hierlist/hierlist-unit.ss +++ b/collects/mrlib/hierlist/hierlist-unit.ss @@ -10,10 +10,10 @@ (require (rename mzlib/list sort* sort) mzlib/etc) - (define turn-up (include-bitmap "../../icons/turn-up.png" 'png)) - (define turn-down (include-bitmap "../../icons/turn-down.png" 'png)) - (define turn-up-click (include-bitmap "../../icons/turn-up-click.png" 'png)) - (define turn-down-click (include-bitmap "../../icons/turn-down-click.png" 'png)) + (define turn-up (include-bitmap "../../icons/turn-up.png" 'png/mask)) + (define turn-down (include-bitmap "../../icons/turn-down.png" 'png/mask)) + (define turn-up-click (include-bitmap "../../icons/turn-up-click.png" 'png/mask)) + (define turn-down-click (include-bitmap "../../icons/turn-down-click.png" 'png/mask)) (provide hierlist@) (define-unit hierlist@ @@ -93,7 +93,10 @@ (send dc draw-bitmap-section bitmap (+ x (max 0 (- (/ size 2) (/ bw 2)))) (+ y (max 0 (- (/ size 2) (/ bh 2)))) - 0 0 (min bw (+ size 2)) (min bh (+ size 2)))))] + 0 0 (min bw (+ size 2)) (min bh (+ size 2)) + 'solid + (send the-color-database find-color "black") + (send bitmap get-loaded-mask))))] [size-cache-invalid (lambda () (set! size-calculated? #f))] [on-event (lambda (dc x y mediax mediay event) @@ -340,7 +343,8 @@ [parent-snip parent-snp] [children null] [new-children null] - [no-sublists? #f]) + [no-sublists? #f] + [transparent? #f]) (private [append-children! (lambda () (unless (null? new-children) @@ -350,17 +354,19 @@ [insert-item (lambda (mixin snip% whitespace?) (let ([s (make-object snip% this top top-select (add1 depth) mixin)]) + (send s use-style-background transparent?) (begin-edit-sequence) (unless (and (null? children) (null? new-children)) (insert #\newline (last-position))) (when whitespace? - (insert (make-whitespace) (last-position))) + (insert (make-whitespace) (last-position))) (insert s (last-position)) (end-edit-sequence) (set! new-children (cons s new-children)) (send s get-item)))]) (public + [set-transparent (λ (t?) (set! transparent? (and t? #t)))] [get-parent-snip (lambda () parent-snip)] [deselect-all (lambda () @@ -479,7 +485,7 @@ ;; Snip for a compound list item (define hierarchical-list-snip% - (class100 editor-snip% (prnt tp top-select depth mixin [title #f][content #f]) + (class100 editor-snip% (prnt tp top-select depth mixin [title #f][content #f]) (private-field [parent prnt] [top tp]) @@ -583,11 +589,19 @@ [content-snip (make-object editor-snip% content-buffer #f 4 0 0 0 0 0 0 0)] [arrow (make-object (get-arrow-snip%) (lambda (a) (on-arrow a)))] [whitespace (make-object whitespace-snip%)]) + (override + [use-style-background + (λ (x) + (super use-style-background x) + (send title-snip use-style-background x) + (send content-snip use-style-background x) + (send content-buffer set-transparent x))]) (public [get-arrow-snip (lambda () arrow)]) - (sequence + (inherit style-background-used?) + (sequence (super-init main-buffer #f 0 0 0 0 0 0 0 0) - (send main-buffer hide-caret #t) + (send main-buffer hide-caret #t) (send main-buffer insert arrow) (when title (send title-buffer insert title)) (when content (send content-buffer insert content)) @@ -637,7 +651,7 @@ (send list-keymap map-function "return" "toggle-open/closed") (define hierarchical-list% - (class100 editor-canvas% (parent [style '(no-hscroll)]) + (class100 editor-canvas% (parent [style '(no-hscroll)]) (inherit min-width min-height allow-tab-exit) (rename [super-on-char on-char] [super-on-focus on-focus]) @@ -854,6 +868,7 @@ [selected #f] [selected-item #f]) (sequence + (send top-buffer set-transparent (member 'transparent style)) (super-init parent top-buffer style) (allow-tab-exit #t) (send top-buffer set-cursor arrow-cursor) diff --git a/collects/mrlib/scribblings/hierlist/list.scrbl b/collects/mrlib/scribblings/hierlist/list.scrbl index de9b6b0a3e..81a7b21562 100644 --- a/collects/mrlib/scribblings/hierlist/list.scrbl +++ b/collects/mrlib/scribblings/hierlist/list.scrbl @@ -16,7 +16,15 @@ Creates a hierarchical-list control. 'resize-corner 'deleted 'transparent)) '(no-hscroll)])]{ -Creates the control.} +Creates the control. + +If the style @scheme['transparent] is passed, then the +@method[editor-snip% use-style-background] method will be +called with @scheme[#t] when editor snips are created as part of +the hierarchical list, ensuring that the entire control is +transparent. + +} @defmethod[(get-selected) (or/c (is-a?/c hierarchical-list-item<%>) From fe532b712c487adf4ad33e044c39d3d8aaabbd5f Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Fri, 29 Jan 2010 20:08:17 +0000 Subject: [PATCH 109/113] update list of supported platforms svn: r17887 --- src/README | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/src/README b/src/README index 1e36c25615..af41c47d41 100644 --- a/src/README +++ b/src/README @@ -385,21 +385,14 @@ mzscheme/sconfig.h to provide a platform-specific compilation information. As dsitributed, mzscheme/sconfig.h contains configurations for the following platforms: - Windows - Mac OS X - Linux (x86, PPC, 68k, Alpha) - Cygwin + Windows (x86) + Mac OS X (PPC, x86, x86_64) + Linux (x86, x86_64, PPC, 68k) + Cygwin (x86) Solaris (x86, Sparc) - SunOS4 (Sparc) - IBM AIX (RS6000) - SGI IRIX (Mips) - DEC Ultrix - HP/UX - FreeBSD - OpenBSD - NetBSD - OSF1 (Alpha) - SCO Unix (x86) + FreeBSD (x86) + OpenBSD (x86) + NetBSD (x86) If your platfrom is not supported by the Boehm garbage collector (distributed with PLT source), provide the `--enable-sgc' flag to From 73a1675286ac0ebb6d86d2535a50f1edc3667d1b Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Fri, 29 Jan 2010 20:30:46 +0000 Subject: [PATCH 110/113] fix select #f for hierlist svn: r17888 --- collects/mrlib/hierlist/hierlist-unit.ss | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/collects/mrlib/hierlist/hierlist-unit.ss b/collects/mrlib/hierlist/hierlist-unit.ss index 27b1cb6016..b06a7ed114 100644 --- a/collects/mrlib/hierlist/hierlist-unit.ss +++ b/collects/mrlib/hierlist/hierlist-unit.ss @@ -716,8 +716,14 @@ (send (car l) scroll-to)] [else (loop (cdr l))])))] [select (lambda (i) - (send i select #t) - (send i scroll-to))] + (cond + [i + (send i select #t) + (send i scroll-to)] + [(and (allow-deselect) selected) + (send selected show-select #f) + (set! selected #f) + (set! selected-item #f)]))] [click-select (lambda (i) (send i click-select #t) (send i scroll-to))] From 16e6a8156e135805f1278b5009d667b5f0706cf2 Mon Sep 17 00:00:00 2001 From: Robby Findler Date: Fri, 29 Jan 2010 21:44:22 +0000 Subject: [PATCH 111/113] a few more tweaks to the language dialog svn: r17889 --- collects/drscheme/private/language-configuration.ss | 12 +++++++++--- collects/drscheme/private/module-language.ss | 13 ++++++++----- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/collects/drscheme/private/language-configuration.ss b/collects/drscheme/private/language-configuration.ss index d37019deeb..68af30ed1b 100644 --- a/collects/drscheme/private/language-configuration.ss +++ b/collects/drscheme/private/language-configuration.ss @@ -385,7 +385,7 @@ (define in-source-discussion-spacer (new horizontal-panel% [parent in-source-discussion-panel] [stretchable-width #f] - [min-width 24])) + [min-width 32])) (define stupid-internal-definition-syntax1 (add-discussion in-source-discussion-panel)) (define use-chosen-language-rb (new radio-box% @@ -394,12 +394,18 @@ [parent languages-choice-panel] [callback (λ (this-rb evt) + (let ([i (send languages-hier-list get-selected)]) + (cond + [(and i (is-a? i hieritem-language<%>)) + (something-selected i)] + [else + (non-language-selected)])) (send use-language-in-source-rb set-selection #f))])) (define languages-hier-list-panel (new horizontal-panel% [parent languages-choice-panel])) (define languages-hier-list-spacer (new horizontal-panel% [parent languages-hier-list-panel] [stretchable-width #f] - [min-width 24])) + [min-width 16])) (define languages-hier-list (new selectable-hierlist% [parent languages-hier-list-panel] @@ -918,7 +924,7 @@ (send t set-styles-sticky #f) (send t set-autowrap-bitmap #f) - (let* ([size-sd (make-object style-delta% 'change-size (send small-control-font get-point-size))] + (let* ([size-sd (make-object style-delta% 'change-size (send normal-control-font get-point-size))] [do-insert (λ (str tt-style?) (let ([before (send t last-position)]) diff --git a/collects/drscheme/private/module-language.ss b/collects/drscheme/private/module-language.ss index 04c1c80799..be1b0ab6da 100644 --- a/collects/drscheme/private/module-language.ss +++ b/collects/drscheme/private/module-language.ss @@ -62,11 +62,14 @@ (inherit get-language-name) (define/public (get-users-language-name defs-text) - (let ([m (regexp-match "#lang (.*)$" - (send defs-text get-text 0 (send defs-text paragraph-end-position 1)))]) - (if m - (list-ref m 1) - (get-language-name)))) + (let* ([i (open-input-text-editor defs-text)] + [l (with-handlers ((exn:fail? (λ (x) '?))) + (read-language i (lambda () '?)))]) + (if (eq? '? l) + (get-language-name) + (regexp-replace #rx".*#(?:!|lang ) *" + (send defs-text get-text 0 (file-position i)) + "")))) (define/override (use-namespace-require/copy?) #f) From 68c197d02fd60c7607a889db93db7c2228400b0b Mon Sep 17 00:00:00 2001 From: James Swaine Date: Fri, 29 Jan 2010 21:44:46 +0000 Subject: [PATCH 112/113] added basic test suite for the parallel futures module svn: r17890 --- collects/tests/mzscheme/future.ss | 110 ++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 collects/tests/mzscheme/future.ss diff --git a/collects/tests/mzscheme/future.ss b/collects/tests/mzscheme/future.ss new file mode 100644 index 0000000000..01ba92b82e --- /dev/null +++ b/collects/tests/mzscheme/future.ss @@ -0,0 +1,110 @@ +(load-relative "loadtest.ss") + +(Section 'future) +(require scheme/future) + +;; ---------------------------------------- + +(test 2 + touch + (future (λ () + 2))) + +(let ([f1 (future (λ () (+ 2 2)))] + [f2 (future (λ () (+ 5 3)))]) + (test 12 + (touch f2) (touch f1))) + +(let* ([v 5] + [f1 (future (λ () + (set! v 10) + v))]) + (test 10 touch f1)) + +(define (build-rand-list lst len) + (case len + [(0) lst] + [else + (build-rand-list (cons + (random) + lst) + (- len 1))])) + +(define (append-list-of-lists acc lst) + (cond + [(empty? lst) acc] + [else + (append-list-of-lists + (append acc (first lst)) + (rest lst))])) + +(let* ([nums '()] + [f1 (future (λ () + (build-rand-list nums 10)))]) + (set! nums (touch f1)) + (test 20 length (touch (future (λ () + (build-rand-list nums 10)))))) + +(let* ([f1 (future (λ () + (build-rand-list '() 20)))] + [f2 (future (λ () (length (touch f1))))]) + (test 20 touch f2)) + +(test 50000 'test7 + (let ([fts (for/list ([i (in-range 0 10000)]) + (future (λ () (build-rand-list '() 5))))]) + (length (append-list-of-lists '() (map touch fts))))) + +(test 31 'test8 + (let* ([f1 (future (λ () (foldl + 0 '(1 2 3 4 5))))] + [f2 (future (λ () (+ (touch + (future (λ () + (+ 6 + (touch f1))))) + 10)))]) + (touch f2))) + +(test 30000 'test9 + (let ([fts (for/list ([i (in-range 0 100)]) + (future (λ () + (build-rand-list '() 300))))]) + (collect-garbage) + (collect-garbage) + (length (append-list-of-lists '() (map touch fts))))) + +(define (sum-to acc limit) + (case limit + [(0) acc] + [else + (sum-to (+ acc limit) (- limit 1))])) + +(test 600030000 'test10 + (let ([f1 (future (λ () (sum-to 0 20000)))] + [f2 (future (λ () (sum-to 0 20000)))] + [f3 (future (λ () (sum-to 0 20000)))]) + (+ (+ (touch f3) (touch f1)) (touch f2)))) + +(test #t 'test11 + (let* ( [f1 (future (λ () (build-rand-list '() 10000)))] + [f2 (future (λ () + (foldl (λ (a b) + (* a b)) + 1 + (touch f1))))] + [f3 (future (λ () (< (touch f2) 1)))]) + (touch f3))) + + +(report-errs) + + + + + + + + + + + + + From f980cf9462d86de4dffba22b2c44ed5e53d77aa4 Mon Sep 17 00:00:00 2001 From: Jon Rafkind Date: Sat, 30 Jan 2010 01:42:14 +0000 Subject: [PATCH 113/113] use new syntax-parse primitive to enable macro invocation during expression parsing svn: r17891 --- collects/honu/main.ss | 1 + collects/honu/private/honu-typed-scheme.ss | 44 +++++++++++++++++++--- 2 files changed, 40 insertions(+), 5 deletions(-) diff --git a/collects/honu/main.ss b/collects/honu/main.ss index ae632c9d99..c45f275fa8 100644 --- a/collects/honu/main.ss +++ b/collects/honu/main.ss @@ -1,6 +1,7 @@ #lang scheme/base (require "private/honu-typed-scheme.ss" + ;; "private/honu.ss" "private/macro.ss") (provide (rename-out (#%dynamic-honu-module-begin #%module-begin) diff --git a/collects/honu/private/honu-typed-scheme.ss b/collects/honu/private/honu-typed-scheme.ss index f82899e3f0..62c9ba0d6f 100644 --- a/collects/honu/private/honu-typed-scheme.ss +++ b/collects/honu/private/honu-typed-scheme.ss @@ -6,6 +6,7 @@ syntax/name syntax/define syntax/parse + syntax/parse/experimental scheme/splicing "contexts.ss" "util.ss" @@ -67,6 +68,7 @@ (and (positive? (string-length str)) (memq (string-ref str 0) sym-chars))))))) +;; returns a transformer or #f (define (get-transformer stx) ;; if its an identifier and bound to a transformer return it (define (bound-transformer stx) @@ -366,16 +368,46 @@ x(2) [pattern (type:id name:id (#%parens args ...) body:block . rest) #:with result #'(define (name args ...) body.result)]) - (define-syntax-class expr - [pattern f]) + + (define (syntax-object-position mstart end) + (if (stx-null? end) + (length (syntax->list mstart)) + (let loop ([start mstart] + [count 0]) + ;; (printf "Checking ~a vs ~a\n" start end) + (cond + [(stx-null? start) (raise-syntax-error 'honu-macro "the `rest' syntax returned by a honu macro did not return objects at the same syntactic nesting level as the head of the pattern. this is probably because it returned syntax from some inner nesting level such as (if (x + 1 2) more-stuff) where `rest' was (+ 1 2) instead of `more-stuff'" end mstart)] + [(eq? (stx-car start) (stx-car end)) count] + ;; [(equal? start end) count] + [else (loop (stx-cdr start) (add1 count))])))) + + (define-primitive-splicing-syntax-class (expr) + #:attrs (result) + #:description "expr" + (lambda (stx fail) + (cond + [(stx-null? stx) (fail)] + [(get-transformer stx) => (lambda (transformer) + (let-values ([(used rest) + (transformer stx context)]) + (list rest (syntax-object-position stx rest) + used)))] + + [else (syntax-case stx () + [(f . rest) (list #'rest 1 #'f)])]))) + + #; + (define-splicing-syntax-class expr + [pattern (~seq f ...) #:with result]) (define-splicing-syntax-class call #:literals (honu-comma) [pattern (~seq e:expr (#%parens (~seq arg:ternary (~optional honu-comma)) ...)) - #:with call #'(e arg.result ...)]) + #:with call #'(e.result arg.result ...)]) (define-splicing-syntax-class expression-last [pattern (~seq call:call) #:with result #'call.call] [pattern (~seq x:number) #:with result #'x] + [pattern (~seq e:expr) #:with result #'e.result] ) (define-syntax-rule (define-infix-operator name next [operator reducer] ...) @@ -524,7 +556,7 @@ Then, in the pattern above for 'if', 'then' would be bound to the following synt (lambda (stx ctx) (define (parse-complete-block stx) ;; (printf "Parsing complete block ~a\n" (syntax->datum stx)) - (with-syntax ([(exprs ...) (parse-block stx ctx)]) + (with-syntax ([(exprs ...) (parse-block stx the-expression-block-context)]) #'(begin exprs ...)) #; (let-values ([(a b) @@ -556,7 +588,7 @@ Then, in the pattern above for 'if', 'then' would be bound to the following synt [(_ condition:paren-expr on-true:block else on-false:block . rest) ;; (printf "used if with else\n") (let ([result #'(if condition.expr on-true.line on-false.line)]) - (expression-result ctx result #'rest))] + (expression-result ctx result (syntax/loc #'rest rest)))] [(_ condition:paren-expr on-true:block . rest) ;; (printf "used if with no else\n") (let ([result #'(when condition.expr on-true.line)]) @@ -656,6 +688,8 @@ if (foo){ (syntax-case stx () [(_) #'(begin (void))] [(_ . body) (let-values ([(code rest) (parse-block-one/2 #'body + the-expression-context + #; the-top-block-context)]) ;; (printf "Rest is ~a\n" (syntax->datum rest)) (with-syntax ([code code]

    The benchmark page shows some benchmark results on a collection of fairly standard (mostly Gabriel) Scheme benchmarks.