[racket-dev] [plt] Push #21179: master branch updated
By the way, on a match intensive work-load, this improved performance by 2x.
Jay
On Mon, Oct 4, 2010 at 3:55 PM, Jay McCarthy <jay.mccarthy at gmail.com> wrote:
> One of the results of adding unsafe optimizations to match was that
> Sam and I noticed there were no unsafe-mcar* (like unsafe-unbox*) that
> shows there are no chaperones on mutable pairs.
>
> Jay
>
> On Mon, Oct 4, 2010 at 3:55 PM, <jay at racket-lang.org> wrote:
>> jay has updated `master' from 2f56b23b21 to 0c47e572c0.
>> http://git.racket-lang.org/plt/2f56b23b21..0c47e572c0
>>
>> =====[ 4 Commits ]======================================================
>>
>> Directory summary:
>> 27.1% collects/racket/match/
>> 3.5% collects/tests/match/
>> 53.9% collects/web-server/scribblings/tutorial/examples/
>> 14.5% collects/web-server/scribblings/tutorial/
>>
>> ~~~~~~~~~~
>>
>> 09fbfcf Jay McCarthy <jay at racket-lang.org> 2010-10-04 15:38
>> :
>> | Fixing pr11280
>> :
>> M collects/web-server/scribblings/tutorial/continue.scrbl | 52 +++---
>> M collects/web-server/scribblings/tutorial/examples/model.rkt | 18 +-
>> M .../scribblings/tutorial/examples/no-use-redirect.rkt | 4 +-
>> M .../scribblings/tutorial/examples/use-redirect.rkt | 4 +-
>> M .../web-server/scribblings/tutorial/examples/dummy-3.rkt | 8 +-
>> M .../web-server/scribblings/tutorial/examples/iteration-1.rkt | 10 +-
>> M .../web-server/scribblings/tutorial/examples/iteration-2.rkt | 14 +-
>> M .../web-server/scribblings/tutorial/examples/iteration-3.rkt | 20 ++--
>> M .../web-server/scribblings/tutorial/examples/iteration-4.rkt | 24 ++--
>> M .../web-server/scribblings/tutorial/examples/iteration-5.rkt | 38 +++---
>> M .../web-server/scribblings/tutorial/examples/iteration-6.rkt | 36 +++---
>> M .../web-server/scribblings/tutorial/examples/iteration-7.rkt | 38 +++---
>> M .../web-server/scribblings/tutorial/examples/iteration-8.rkt | 20 ++--
>> M .../web-server/scribblings/tutorial/examples/model-2.rkt | 20 ++--
>> M .../web-server/scribblings/tutorial/examples/model-3.rkt | 8 +-
>>
>> ~~~~~~~~~~
>>
>> 61441bb Jay McCarthy <jay at racket-lang.org> 2010-10-04 15:40
>> :
>> | Fixing pr11284
>> :
>> M collects/web-server/servlet-dispatch.rkt | 2 +-
>>
>> ~~~~~~~~~~
>>
>> 0965af6 Jay McCarthy <jay at racket-lang.org> 2010-10-04 15:43
>> :
>> | Adding some unsafe ops to the match compiler
>> :
>> M collects/racket/match/compiler.rkt | 13 +++++++------
>>
>> ~~~~~~~~~~
>>
>> 0c47e57 Jay McCarthy <jay at racket-lang.org> 2010-10-04 15:54
>> :
>> | Using unsafe operations in racket/match
>> :
>> M collects/racket/match/compiler.rkt | 3 +
>> M collects/racket/match/parse-helper.rkt | 70 ++++++++++++++-------------
>> M collects/racket/match/patterns.rkt | 3 +-
>> M collects/tests/match/plt-match-tests.rkt | 12 +++++
>>
>> =====[ Overall Diff ]===================================================
>>
>> collects/racket/match/compiler.rkt
>> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> --- OLD/collects/racket/match/compiler.rkt
>> +++ NEW/collects/racket/match/compiler.rkt
>> @@ -1,6 +1,6 @@
>> #lang scheme/base
>>
>> -(require (for-template scheme/base "runtime.rkt" scheme/stxparam)
>> +(require (for-template scheme/base "runtime.rkt" scheme/stxparam racket/unsafe/ops)
>> syntax/boundmap
>> syntax/stx
>> "patterns.rkt"
>> @@ -60,12 +60,13 @@
>> #`[(pred #,x) (let ([tmps (accs #,x)] ...) body)]))
>> (cond
>> [(eq? 'box k)
>> - (compile-con-pat (list #'unbox) #'box? (compose list Box-p))]
>> + (compile-con-pat (list #'unsafe-unbox*) #'box? (compose list Box-p))]
>> [(eq? 'pair k)
>> - (compile-con-pat (list #'car #'cdr) #'pair?
>> + (compile-con-pat (list #'unsafe-car #'unsafe-cdr) #'pair?
>> (lambda (p) (list (Pair-a p) (Pair-d p))))]
>> [(eq? 'mpair k)
>> - (compile-con-pat (list #'mcar #'mcdr) #'mpair?
>> + ; XXX These should be unsafe-mcar* when mpairs have chaperones
>> + (compile-con-pat (list #'unsafe-mcar #'unsafe-mcdr) #'mpair?
>> (lambda (p) (list (MPair-a p) (MPair-d p))))]
>> [(eq? 'string k) (constant-pat #'string?)]
>> [(eq? 'number k) (constant-pat #'number?)]
>> @@ -104,10 +105,10 @@
>> esc)]
>> [(n ...) ns])
>> #`[(#,arity)
>> - (let ([tmps (vector-ref #,x n)] ...)
>> + (let ([tmps (unsafe-vector*-ref #,x n)] ...)
>> body)]))))])])
>> #`[(vector? #,x)
>> - (case (vector-length #,x)
>> + (case (unsafe-vector*-length #,x)
>> clauses ...
>> [else (#,esc)])])]
>> ;; it's a structure
>> @@ -115,6 +116,9 @@
>> ;; all the rows are structures with the same predicate
>> (let* ([s (Row-first-pat (car rows))]
>> [accs (Struct-accessors s)]
>> + [accs (if (Struct-complete? s)
>> + (build-list (length accs) (λ (i) #`(λ (x) (unsafe-struct*-ref x #,i))))
>> + accs)]
>> [pred (Struct-pred s)])
>> (compile-con-pat accs pred Struct-ps))]
>> [else (error 'match-compile "bad key: ~a" k)]))
>>
>> collects/racket/match/parse-helper.rkt
>> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> --- OLD/collects/racket/match/parse-helper.rkt
>> +++ NEW/collects/racket/match/parse-helper.rkt
>> @@ -85,43 +85,47 @@
>> (let ([super (list-ref (extract-struct-info (syntax-local-value
>> struct-name))
>> 5)])
>> - (cond [(equal? super #t) '()] ;; no super type exists
>> - [(equal? super #f) '()] ;; super type is unknown
>> - [else (cons super (get-lineage super))])))
>> + (cond [(equal? super #t) (values #t '())] ;; no super type exists
>> + [(equal? super #f) (values #f '())] ;; super type is unknown
>> + [else
>> + (let-values ([(complete? lineage) (get-lineage super)])
>> + (values complete?
>> + (cons super lineage)))])))
>> (unless pred
>> (raise-syntax-error 'match (format "structure ~a does not have an associated predicate"
>> (syntax->datum struct-name))
>> stx struct-name))
>> - (let* (;; the accessors come in reverse order
>> - [acc (reverse acc)]
>> - ;; remove the first element, if it's #f
>> - [acc (cond [(null? acc) acc]
>> - [(not (car acc)) (cdr acc)]
>> - [else acc])])
>> - (make-Struct pred
>> - (syntax-property
>> - pred
>> - 'disappeared-use (list struct-name))
>> - (get-lineage (cert struct-name))
>> - acc
>> - (cond [(eq? '_ (syntax-e pats))
>> - (map make-Dummy acc)]
>> - [(syntax->list pats)
>> - =>
>> - (lambda (ps)
>> - (unless (= (length ps) (length acc))
>> - (raise-syntax-error
>> - 'match
>> - (format "~a structure ~a: expected ~a but got ~a"
>> - "wrong number for fields for"
>> - (syntax->datum struct-name) (length acc)
>> - (length ps))
>> - stx pats))
>> - (map parse ps))]
>> - [else (raise-syntax-error
>> - 'match
>> - "improper syntax for struct pattern"
>> - stx pats)]))))))
>> + (let-values ([(complete? lineage) (get-lineage (cert struct-name))])
>> + (let* (;; the accessors come in reverse order
>> + [acc (reverse acc)]
>> + ;; remove the first element, if it's #f
>> + [acc (cond [(null? acc) acc]
>> + [(not (car acc)) (cdr acc)]
>> + [else acc])])
>> + (make-Struct pred
>> + (syntax-property
>> + pred
>> + 'disappeared-use (list struct-name))
>> + lineage complete?
>> + acc
>> + (cond [(eq? '_ (syntax-e pats))
>> + (map make-Dummy acc)]
>> + [(syntax->list pats)
>> + =>
>> + (lambda (ps)
>> + (unless (= (length ps) (length acc))
>> + (raise-syntax-error
>> + 'match
>> + (format "~a structure ~a: expected ~a but got ~a"
>> + "wrong number for fields for"
>> + (syntax->datum struct-name) (length acc)
>> + (length ps))
>> + stx pats))
>> + (map parse ps))]
>> + [else (raise-syntax-error
>> + 'match
>> + "improper syntax for struct pattern"
>> + stx pats)])))))))
>>
>> (define (trans-match pred transformer pat)
>> (make-And (list (make-Pred pred) (make-App transformer pat))))
>>
>> collects/racket/match/patterns.rkt
>> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> --- OLD/collects/racket/match/patterns.rkt
>> +++ NEW/collects/racket/match/patterns.rkt
>> @@ -55,9 +55,10 @@
>>
>> ;; pred is an identifier
>> ;; super is an identifier, or #f
>> +;; complete? is a boolean
>> ;; accessors is a listof identifiers (NB in reverse order from the struct info)
>> ;; ps is a listof patterns
>> -(define-struct (Struct CPat) (id pred super accessors ps) #:transparent)
>> +(define-struct (Struct CPat) (id pred super complete? accessors ps) #:transparent)
>>
>> ;; both fields are lists of pats
>> (define-struct (HashTable CPat) (key-pats val-pats) #:transparent)
>>
>> collects/tests/match/plt-match-tests.rkt
>> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> --- OLD/collects/tests/match/plt-match-tests.rkt
>> +++ NEW/collects/tests/match/plt-match-tests.rkt
>> @@ -179,6 +179,18 @@
>> (else #f)))
>> (check-true (origin? (make-point 0 0)))
>> (check-false (origin? (make-point 1 1)))))
>> + ; This test ensures that the unsafe struct optimization is correct
>> + (test-case "struct patterns (with opaque parent)"
>> + (let ()
>> + (define-struct opq (any))
>> + (parameterize ([current-inspector (make-sibling-inspector)])
>> + (define-struct point (x y) #:super struct:opq)
>> + (define (origin? pt)
>> + (match pt
>> + ((struct point (0 0)) #t)
>> + (else #f)))
>> + (check-true (origin? (make-point 'a 0 0)))
>> + (check-false (origin? (make-point 'a 1 1))))))
>> ))
>>
>> (define nonlinear-tests
>>
>> collects/web-server/scribblings/tutorial/continue.scrbl
>> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> --- OLD/collects/web-server/scribblings/tutorial/continue.scrbl
>> +++ NEW/collects/web-server/scribblings/tutorial/continue.scrbl
>> @@ -62,9 +62,9 @@ By the end of this tutorial, we'll have a simple blogging application.
>> We start by considering our data definitions. We want to represent a
>> list of posts. Let's say that a post is:
>>
>> - at racketblock[(define-struct post (title body))]
>> + at racketblock[(struct post (title body))]
>>
>> -@(defstruct post ([title string?] [body string?]))
>> +@(defstruct* post ([title string?] [body string?]))
>>
>> @bold{Exercise.} Make a few examples of posts.
>>
>> @@ -75,8 +75,8 @@ A blog, then, will be a list of posts:
>> As a very simple example of a blog:
>>
>> @racketblock[
>> -(define BLOG (list (make-post "First Post!"
>> - "Hey, this is my first post!")))
>> +(define BLOG (list (post "First Post!"
>> + "Hey, this is my first post!")))
>> ]
>>
>> Now that we have a sample blog structure, let's get our web
>> @@ -172,7 +172,7 @@ an @racket[html-response] representing that content.
>> As an example, we want:
>>
>> @racketblock[
>> - (render-post (make-post "First post!" "This is a first post."))
>> + (render-post (post "First post!" "This is a first post."))
>> ]
>>
>> to produce:
>> @@ -229,8 +229,8 @@ should produce:
>> While
>>
>> @racketblock[
>> -(render-posts (list (make-post "Post 1" "Body 1")
>> - (make-post "Post 2" "Body 2")))
>> +(render-posts (list (post "Post 1" "Body 1")
>> + (post "Post 2" "Body 2")))
>> ]
>>
>> should produce:
>> @@ -441,9 +441,9 @@ Earlier, we had said that a @racket[blog] was a list of @racket[post]s,
>> but because we want to allow the blog to be changed, let's revisit our
>> definition so that a blog is a mutable structure:
>>
>> - at racketblock[(define-struct blog (posts) #:mutable)]
>> + at racketblock[(struct blog (posts) #:mutable)]
>>
>> - at defstruct[blog ([posts (listof post?)])]
>> + at defstruct*[blog ([posts (listof post?)])]
>>
>> Mutable structures provide functions to change the fields of a
>> structure; in this case, we now have a structure mutator called
>> @@ -484,7 +484,7 @@ the same blog.
>> Next, let's extend the application so that each post can hold a list
>> of comments. We refine the data definition of a blog to be:
>>
>> - at defstruct[post ([title string?] [body string?] [comments (listof string?)]) #:mutable]
>> + at defstruct*[post ([title string?] [body string?] [comments (listof string?)]) #:mutable]
>>
>> @bold{Exercise.} Write the updated data structure definition for posts. Make
>> sure to make the structure mutable, since we intend to add comments to
>> @@ -504,7 +504,7 @@ comments in an itemized list.
>>
>> @bold{Exercise.} Because we've extended a post to include comments, other
>> post-manipulating parts of the application may need to be adjusted,
>> -such as uses of @racket[make-post]. Identify and fix any other part of the
>> +such as uses of @racket[post]. Identify and fix any other part of the
>> application that needs to accommodate the post's new structure.
>>
>> @centerline{------------}
>> @@ -736,8 +736,8 @@ between the model of our blog, and the web application that uses that
>> model. Let's isolate the model: it's all the stuff near the top:
>>
>> @racketblock[
>> - (define-struct blog (posts) #:mutable)
>> - (define-struct post (title body comments) #:mutable)
>> + (struct blog (posts) #:mutable)
>> + (struct post (title body comments) #:mutable)
>> (define BLOG ...)
>> (define (blog-insert-post! ...) ...)
>> (define (post-insert-comment! ...) ...)
>> @@ -794,7 +794,7 @@ started running---which is exactly what we want when restoring the blog data fro
>> Our blog structure definition now looks like:
>>
>> @racketblock[
>> - (define-struct blog (posts) #:mutable #:prefab)
>> + (struct blog (posts) #:mutable #:prefab)
>> ]
>>
>> Now @racket[blog] structures can be read from the outside world with @racket[read] and written
>> @@ -809,7 +809,7 @@ At this point, we @emph{can} read and write the blog to disk. Now let's actually
>> First, we'll make a place to record in the model where the blog lives on disk. So, we need to change
>> the blog structure again. Now it will be:
>>
>> - at defstruct[blog ([home string?] [posts (listof post?)]) #:mutable]
>> + at defstruct*[blog ([home string?] [posts (listof post?)]) #:mutable]
>>
>> @bold{Exercise.} Write the new structure definition for blogs.
>>
>> @@ -820,14 +820,14 @@ Then, we'll make a function that allows our application to initialize the blog:
>> @code:comment{Reads a blog from a path, if not present, returns default}
>> (define (initialize-blog! home)
>> (local [(define (log-missing-exn-handler exn)
>> - (make-blog
>> + (blog
>> (path->string home)
>> - (list (make-post "First Post"
>> - "This is my first post"
>> - (list "First comment!"))
>> - (make-post "Second Post"
>> - "This is another post"
>> - (list)))))
>> + (list (post "First Post"
>> + "This is my first post"
>> + (list "First comment!"))
>> + (post "Second Post"
>> + "This is another post"
>> + (list)))))
>> (define the-blog
>> (with-handlers ([exn? log-missing-exn-handler])
>> (with-input-from-file home read)))]
>> @@ -983,7 +983,7 @@ By adding a new comments table, we are more in accord with the relational style.
>>
>> A @racket[blog] structure will simply be a container for the database handle:
>>
>> - at defstruct[blog ([db sqlite:db?])]
>> + at defstruct*[blog ([db sqlite:db?])]
>>
>> @bold{Exercise.} Write the @racket[blog] structure definition. (It does not need to be mutable or serializable.)
>>
>> @@ -993,7 +993,7 @@ We can now write the code to initialize a @racket[blog] structure:
>> @code:comment{Sets up a blog database (if it doesn't exist)}
>> (define (initialize-blog! home)
>> (define db (sqlite:open home))
>> - (define the-blog (make-blog db))
>> + (define the-blog (blog db))
>> (with-handlers ([exn? void])
>> (sqlite:exec/ignore db
>> (string-append
>> @@ -1056,7 +1056,7 @@ However, we cannot tell from this structure
>> what blog this posts belongs to, and therefore, what database; so, we could not extract the title or body values,
>> since we do not know what to query. Therefore, we should associate the blog with each post:
>>
>> - at defstruct[post ([blog blog?] [id integer?])]
>> + at defstruct*[post ([blog blog?] [id integer?])]
>>
>> @bold{Exercise.} Write the structure definition for posts.
>>
>> @@ -1067,7 +1067,7 @@ The only function that creates posts is @racket[blog-posts]:
>> @code:comment{Queries for the post ids}
>> (define (blog-posts a-blog)
>> (local [(define (row->post a-row)
>> - (make-post
>> + (post
>> a-blog
>> (vector-ref a-row 0)))
>> (define rows (sqlite:select
>>
>> collects/web-server/scribblings/tutorial/examples/dummy-3.rkt
>> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> --- OLD/collects/web-server/scribblings/tutorial/examples/dummy-3.rkt
>> +++ NEW/collects/web-server/scribblings/tutorial/examples/dummy-3.rkt
>> @@ -3,17 +3,17 @@
>>
>> ;; A blog is a (make-blog db)
>> ;; where db is an sqlite database handle
>> -(define-struct blog (db))
>> +(struct blog (db))
>>
>> ;; A post is a (make-post blog id)
>> ;; where blog is a blog and id is an integer?
>> -(define-struct post (blog id))
>> +(struct post (blog id))
>>
>> ;; initialize-blog! : path? -> blog?
>> ;; Sets up a blog database (if it doesn't exist)
>> (define (initialize-blog! home)
>> (define db (sqlite:open home))
>> - (define the-blog (make-blog db))
>> + (define the-blog (blog db))
>> (with-handlers ([exn? void])
>> (sqlite:exec/ignore db
>> (string-append
>> @@ -35,7 +35,7 @@
>> ;; Queries for the post ids
>> (define (blog-posts a-blog)
>> (local [(define (row->post a-row)
>> - (make-post a-blog (string->number (vector-ref a-row 0))))
>> + (post a-blog (string->number (vector-ref a-row 0))))
>> (define rows (sqlite:select
>> (blog-db a-blog)
>> "SELECT id FROM posts"))]
>>
>> collects/web-server/scribblings/tutorial/examples/iteration-1.rkt
>> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> --- OLD/collects/web-server/scribblings/tutorial/examples/iteration-1.rkt
>> +++ NEW/collects/web-server/scribblings/tutorial/examples/iteration-1.rkt
>> @@ -2,20 +2,20 @@
>>
>> ;; A blog is a (listof post)
>> ;; and a post is a (make-post title body)
>> -(define-struct post (title body))
>> +(struct post (title body))
>>
>> ;; BLOG: blog
>> ;; The static blog.
>> (define BLOG
>> - (list (make-post "First Post" "This is my first post")
>> - (make-post "Second Post" "This is another post")))
>> + (list (post "First Post" "This is my first post")
>> + (post "Second Post" "This is another post")))
>>
>> ;; start: request -> html-response
>> ;; Consumes a request, and produces a page that displays all of the
>> ;; web content.
>> (define (start request)
>> (render-blog-page BLOG request))
>> -
>> +
>> ;; render-blog-page: blog request -> html-response
>> ;; Consumes a blog and a request, and produces an html-response page
>> ;; of the content of the blog.
>> @@ -23,7 +23,7 @@
>> `(html (head (title "My Blog"))
>> (body (h1 "My Blog")
>> ,(render-posts a-blog))))
>> -
>> +
>> ;; render-post: post -> html-response
>> ;; Consumes a post, produces an html-response fragment of the post.
>> (define (render-post a-post)
>>
>> collects/web-server/scribblings/tutorial/examples/iteration-2.rkt
>> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> --- OLD/collects/web-server/scribblings/tutorial/examples/iteration-2.rkt
>> +++ NEW/collects/web-server/scribblings/tutorial/examples/iteration-2.rkt
>> @@ -2,13 +2,13 @@
>>
>> ;; A blog is a (listof post)
>> ;; and a post is a (make-post title body)
>> -(define-struct post (title body))
>> +(struct post (title body))
>>
>> ;; BLOG: blog
>> ;; The static blog.
>> (define BLOG
>> - (list (make-post "First Post" "This is my first post")
>> - (make-post "Second Post" "This is another post")))
>> + (list (post "First Post" "This is my first post")
>> + (post "Second Post" "This is another post")))
>>
>> ;; start: request -> html-response
>> ;; Consumes a request and produces a page that displays all of the
>> @@ -21,7 +21,7 @@
>> [else
>> BLOG]))]
>> (render-blog-page a-blog request)))
>> -
>> +
>>
>> ;; can-parse-post?: bindings -> boolean
>> ;; Produces true if bindings contains values for 'title and 'body.
>> @@ -33,8 +33,8 @@
>> ;; parse-post: bindings -> post
>> ;; Consumes a bindings, and produces a post out of the bindings.
>> (define (parse-post bindings)
>> - (make-post (extract-binding/single 'title bindings)
>> - (extract-binding/single 'body bindings)))
>> + (post (extract-binding/single 'title bindings)
>> + (extract-binding/single 'body bindings)))
>>
>> ;; render-blog-page: blog request -> html-response
>> ;; Consumes a blog and a request, and produces an html-response page
>> @@ -49,8 +49,6 @@
>> (input ((name "body")))
>> (input ((type "submit")))))))
>>
>> -
>> -
>> ;; render-post: post -> html-response
>> ;; Consumes a post, produces an html-response fragment of the post.
>> (define (render-post a-post)
>>
>> collects/web-server/scribblings/tutorial/examples/iteration-3.rkt
>> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> --- OLD/collects/web-server/scribblings/tutorial/examples/iteration-3.rkt
>> +++ NEW/collects/web-server/scribblings/tutorial/examples/iteration-3.rkt
>> @@ -2,25 +2,25 @@
>>
>> ;; A blog is a (listof post)
>> ;; and a post is a (make-post title body)
>> -(define-struct post (title body))
>> +(struct post (title body))
>>
>> ;; BLOG: blog
>> ;; The static blog.
>> (define BLOG
>> - (list (make-post "First Post" "This is my first post")
>> - (make-post "Second Post" "This is another post")))
>> + (list (post "First Post" "This is my first post")
>> + (post "Second Post" "This is another post")))
>>
>> ;; start: request -> html-response
>> ;; Consumes a request and produces a page that displays all of the
>> ;; web content.
>> (define (start request)
>> (render-blog-page BLOG request))
>> -
>> +
>> ;; parse-post: bindings -> post
>> ;; Extracts a post out of the bindings.
>> (define (parse-post bindings)
>> - (make-post (extract-binding/single 'title bindings)
>> - (extract-binding/single 'body bindings)))
>> + (post (extract-binding/single 'title bindings)
>> + (extract-binding/single 'body bindings)))
>>
>> ;; render-blog-page: blog request -> html-response
>> ;; Consumes a blog and a request, and produces an html-response page
>> @@ -33,16 +33,16 @@
>> ,(render-posts a-blog)
>> (form ((action
>> ,(make-url insert-post-handler)))
>> - (input ((name "title")))
>> - (input ((name "body")))
>> - (input ((type "submit")))))))
>> + (input ((name "title")))
>> + (input ((name "body")))
>> + (input ((type "submit")))))))
>>
>> (define (insert-post-handler request)
>> (render-blog-page
>> (cons (parse-post (request-bindings request))
>> a-blog)
>> request))]
>> -
>> +
>> (send/suspend/dispatch response-generator)))
>>
>> ;; render-post: post -> html-response
>>
>> collects/web-server/scribblings/tutorial/examples/iteration-4.rkt
>> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> --- OLD/collects/web-server/scribblings/tutorial/examples/iteration-4.rkt
>> +++ NEW/collects/web-server/scribblings/tutorial/examples/iteration-4.rkt
>> @@ -2,25 +2,25 @@
>>
>> ;; A blog is a (make-blog posts)
>> ;; where posts is a (listof post)
>> -(define-struct blog (posts) #:mutable)
>> +(struct blog (posts) #:mutable)
>>
>> ;; and post is a (make-post title body)
>> ;; where title is a string, and body is a string
>> -(define-struct post (title body))
>> +(struct post (title body))
>>
>> ;; BLOG: blog
>> ;; The initial BLOG.
>> (define BLOG
>> - (make-blog
>> - (list (make-post "First Post" "This is my first post")
>> - (make-post "Second Post" "This is another post"))))
>> + (blog
>> + (list (post "First Post" "This is my first post")
>> + (post "Second Post" "This is another post"))))
>>
>> ;; blog-insert-post!: blog post -> void
>> ;; Consumes a blog and a post, adds the post at the top of the blog.
>> (define (blog-insert-post! a-blog a-post)
>> (set-blog-posts! a-blog
>> (cons a-post (blog-posts a-blog))))
>> -
>> +
>> ;; start: request -> html-response
>> ;; Consumes a request and produces a page that displays
>> ;; all of the web content.
>> @@ -30,8 +30,8 @@
>> ;; parse-post: bindings -> post
>> ;; Extracts a post out of the bindings.
>> (define (parse-post bindings)
>> - (make-post (extract-binding/single 'title bindings)
>> - (extract-binding/single 'body bindings)))
>> + (post (extract-binding/single 'title bindings)
>> + (extract-binding/single 'body bindings)))
>>
>> ;; render-blog-page: request -> html-response
>> ;; Produces an html-response page of the content of the BLOG.
>> @@ -43,15 +43,15 @@
>> ,(render-posts)
>> (form ((action
>> ,(make-url insert-post-handler)))
>> - (input ((name "title")))
>> - (input ((name "body")))
>> - (input ((type "submit")))))))
>> + (input ((name "title")))
>> + (input ((name "body")))
>> + (input ((type "submit")))))))
>>
>> (define (insert-post-handler request)
>> (blog-insert-post!
>> BLOG (parse-post (request-bindings request)))
>> (render-blog-page request))]
>> -
>> +
>> (send/suspend/dispatch response-generator)))
>>
>> ;; render-post: post -> html-response
>>
>> collects/web-server/scribblings/tutorial/examples/iteration-5.rkt
>> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> --- OLD/collects/web-server/scribblings/tutorial/examples/iteration-5.rkt
>> +++ NEW/collects/web-server/scribblings/tutorial/examples/iteration-5.rkt
>> @@ -2,23 +2,23 @@
>>
>> ;; A blog is a (make-blog posts)
>> ;; where posts is a (listof post)
>> -(define-struct blog (posts) #:mutable)
>> +(struct blog (posts) #:mutable)
>>
>> ;; and post is a (make-post title body comments)
>> ;; where title is a string, body is a string,
>> ;; and comments is a (listof string)
>> -(define-struct post (title body comments) #:mutable)
>> +(struct post (title body comments) #:mutable)
>>
>> ;; BLOG: blog
>> ;; The initial BLOG.
>> (define BLOG
>> - (make-blog
>> - (list (make-post "First Post"
>> - "This is my first post"
>> - (list "First comment!"))
>> - (make-post "Second Post"
>> - "This is another post"
>> - (list)))))
>> + (blog
>> + (list (post "First Post"
>> + "This is my first post"
>> + (list "First comment!"))
>> + (post "Second Post"
>> + "This is another post"
>> + (list)))))
>>
>> ;; blog-insert-post!: blog post -> void
>> ;; Consumes a blog and a post, adds the post at the top of the blog.
>> @@ -52,22 +52,22 @@
>> ,(render-posts make-url)
>> (form ((action
>> ,(make-url insert-post-handler)))
>> - (input ((name "title")))
>> - (input ((name "body")))
>> - (input ((type "submit")))))))
>> + (input ((name "title")))
>> + (input ((name "body")))
>> + (input ((type "submit")))))))
>>
>> ;; parse-post: bindings -> post
>> ;; Extracts a post out of the bindings.
>> (define (parse-post bindings)
>> - (make-post (extract-binding/single 'title bindings)
>> - (extract-binding/single 'body bindings)
>> - (list)))
>> + (post (extract-binding/single 'title bindings)
>> + (extract-binding/single 'body bindings)
>> + (list)))
>>
>> (define (insert-post-handler request)
>> (blog-insert-post!
>> BLOG (parse-post (request-bindings request)))
>> (render-blog-page request))]
>> -
>> +
>> (send/suspend/dispatch response-generator)))
>>
>> ;; render-post-detail-page: post request -> html-response
>> @@ -86,7 +86,7 @@
>> ,(make-url insert-comment-handler)))
>> (input ((name "comment")))
>> (input ((type "submit")))))))
>> -
>> +
>> (define (parse-comment bindings)
>> (extract-binding/single 'comment bindings))
>>
>> @@ -94,8 +94,8 @@
>> (post-insert-comment!
>> a-post (parse-comment (request-bindings a-request)))
>> (render-post-detail-page a-post a-request))]
>> -
>> -
>> +
>> +
>> (send/suspend/dispatch response-generator)))
>>
>>
>>
>> collects/web-server/scribblings/tutorial/examples/iteration-6.rkt
>> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> --- OLD/collects/web-server/scribblings/tutorial/examples/iteration-6.rkt
>> +++ NEW/collects/web-server/scribblings/tutorial/examples/iteration-6.rkt
>> @@ -2,23 +2,23 @@
>>
>> ;; A blog is a (make-blog posts)
>> ;; where posts is a (listof post)
>> -(define-struct blog (posts) #:mutable)
>> +(struct blog (posts) #:mutable)
>>
>> ;; and post is a (make-post title body comments)
>> ;; where title is a string, body is a string,
>> ;; and comments is a (listof string)
>> -(define-struct post (title body comments) #:mutable)
>> +(struct post (title body comments) #:mutable)
>>
>> ;; BLOG: blog
>> ;; The initial BLOG.
>> (define BLOG
>> - (make-blog
>> - (list (make-post "First Post"
>> - "This is my first post"
>> - (list "First comment!"))
>> - (make-post "Second Post"
>> - "This is another post"
>> - (list)))))
>> + (blog
>> + (list (post "First Post"
>> + "This is my first post"
>> + (list "First comment!"))
>> + (post "Second Post"
>> + "This is another post"
>> + (list)))))
>>
>> ;; blog-insert-post!: blog post -> void
>> ;; Consumes a blog and a post, adds the post at the top of the blog.
>> @@ -52,22 +52,22 @@
>> ,(render-posts make-url)
>> (form ((action
>> ,(make-url insert-post-handler)))
>> - (input ((name "title")))
>> - (input ((name "body")))
>> - (input ((type "submit")))))))
>> + (input ((name "title")))
>> + (input ((name "body")))
>> + (input ((type "submit")))))))
>>
>> ;; parse-post: bindings -> post
>> ;; Extracts a post out of the bindings.
>> (define (parse-post bindings)
>> - (make-post (extract-binding/single 'title bindings)
>> - (extract-binding/single 'body bindings)
>> - (list)))
>> + (post (extract-binding/single 'title bindings)
>> + (extract-binding/single 'body bindings)
>> + (list)))
>>
>> (define (insert-post-handler request)
>> (blog-insert-post!
>> BLOG (parse-post (request-bindings request)))
>> (render-blog-page request))]
>> -
>> +
>> (send/suspend/dispatch response-generator)))
>>
>> ;; render-post-detail-page: post request -> html-response
>> @@ -101,7 +101,7 @@
>>
>> (define (back-handler request)
>> (render-blog-page request))]
>> -
>> +
>> (send/suspend/dispatch response-generator)))
>>
>> ;; render-confirm-add-comment-page :
>> @@ -130,7 +130,7 @@
>>
>> (define (cancel-handler request)
>> (render-post-detail-page a-post request))]
>> -
>> +
>> (send/suspend/dispatch response-generator)))
>>
>> ;; render-post: post (handler -> string) -> html-response
>>
>> collects/web-server/scribblings/tutorial/examples/iteration-7.rkt
>> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> --- OLD/collects/web-server/scribblings/tutorial/examples/iteration-7.rkt
>> +++ NEW/collects/web-server/scribblings/tutorial/examples/iteration-7.rkt
>> @@ -2,23 +2,23 @@
>>
>> ;; A blog is a (make-blog posts)
>> ;; where posts is a (listof post)
>> -(define-struct blog (posts) #:mutable)
>> +(struct blog (posts) #:mutable)
>>
>> ;; and post is a (make-post title body comments)
>> ;; where title is a string, body is a string,
>> ;; and comments is a (listof string)
>> -(define-struct post (title body comments) #:mutable)
>> +(struct post (title body comments) #:mutable)
>>
>> ;; BLOG: blog
>> ;; The initial BLOG.
>> (define BLOG
>> - (make-blog
>> - (list (make-post "First Post"
>> - "This is my first post"
>> - (list "First comment!"))
>> - (make-post "Second Post"
>> - "This is another post"
>> - (list)))))
>> + (blog
>> + (list (post "First Post"
>> + "This is my first post"
>> + (list "First comment!"))
>> + (post "Second Post"
>> + "This is another post"
>> + (list)))))
>>
>> ;; blog-insert-post!: blog post -> void
>> ;; Consumes a blog and a post, adds the post at the top of the blog.
>> @@ -52,22 +52,22 @@
>> ,(render-posts make-url)
>> (form ((action
>> ,(make-url insert-post-handler)))
>> - (input ((name "title")))
>> - (input ((name "body")))
>> - (input ((type "submit")))))))
>> + (input ((name "title")))
>> + (input ((name "body")))
>> + (input ((type "submit")))))))
>>
>> ;; parse-post: bindings -> post
>> ;; Extracts a post out of the bindings.
>> (define (parse-post bindings)
>> - (make-post (extract-binding/single 'title bindings)
>> - (extract-binding/single 'body bindings)
>> - (list)))
>> + (post (extract-binding/single 'title bindings)
>> + (extract-binding/single 'body bindings)
>> + (list)))
>>
>> (define (insert-post-handler request)
>> (blog-insert-post!
>> BLOG (parse-post (request-bindings request)))
>> (render-blog-page (redirect/get)))]
>> -
>> +
>> (send/suspend/dispatch response-generator)))
>>
>> ;; render-post-detail-page: post request -> html-response
>> @@ -98,10 +98,10 @@
>> (parse-comment (request-bindings request))
>> a-post
>> request))
>> -
>> +
>> (define (back-handler request)
>> (render-blog-page request))]
>> -
>> +
>> (send/suspend/dispatch response-generator)))
>>
>> ;; render-confirm-add-comment-page :
>> @@ -130,7 +130,7 @@
>>
>> (define (cancel-handler request)
>> (render-post-detail-page a-post request))]
>> -
>> +
>> (send/suspend/dispatch response-generator)))
>>
>> ;; render-post: post (handler -> string) -> html-response
>>
>> collects/web-server/scribblings/tutorial/examples/iteration-8.rkt
>> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> --- OLD/collects/web-server/scribblings/tutorial/examples/iteration-8.rkt
>> +++ NEW/collects/web-server/scribblings/tutorial/examples/iteration-8.rkt
>> @@ -19,22 +19,22 @@
>> ,(render-posts make-url)
>> (form ((action
>> ,(make-url insert-post-handler)))
>> - (input ((name "title")))
>> - (input ((name "body")))
>> - (input ((type "submit")))))))
>> + (input ((name "title")))
>> + (input ((name "body")))
>> + (input ((type "submit")))))))
>>
>> ;; parse-post: bindings -> post
>> ;; Extracts a post out of the bindings.
>> (define (parse-post bindings)
>> - (make-post (extract-binding/single 'title bindings)
>> - (extract-binding/single 'body bindings)
>> - (list)))
>> + (post (extract-binding/single 'title bindings)
>> + (extract-binding/single 'body bindings)
>> + (list)))
>>
>> (define (insert-post-handler request)
>> (blog-insert-post!
>> BLOG (parse-post (request-bindings request)))
>> (render-blog-page (redirect/get)))]
>> -
>> +
>> (send/suspend/dispatch response-generator)))
>>
>> ;; render-post-detail-page: post request -> html-response
>> @@ -65,10 +65,10 @@
>> (parse-comment (request-bindings request))
>> a-post
>> request))
>> -
>> +
>> (define (back-handler request)
>> (render-blog-page request))]
>> -
>> +
>> (send/suspend/dispatch response-generator)))
>>
>> ;; render-confirm-add-comment-page :
>> @@ -97,7 +97,7 @@
>>
>> (define (cancel-handler request)
>> (render-post-detail-page a-post request))]
>> -
>> +
>> (send/suspend/dispatch response-generator)))
>>
>> ;; render-post: post (handler -> string) -> html-response
>>
>> collects/web-server/scribblings/tutorial/examples/model-2.rkt
>> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> --- OLD/collects/web-server/scribblings/tutorial/examples/model-2.rkt
>> +++ NEW/collects/web-server/scribblings/tutorial/examples/model-2.rkt
>> @@ -2,25 +2,25 @@
>>
>> ;; A blog is a (make-blog home posts)
>> ;; where home is a string, posts is a (listof post)
>> -(define-struct blog (home posts) #:mutable #:prefab)
>> +(struct blog (home posts) #:mutable #:prefab)
>>
>> ;; and post is a (make-post blog title body comments)
>> ;; where title is a string, body is a string,
>> ;; and comments is a (listof string)
>> -(define-struct post (title body comments) #:mutable #:prefab)
>> +(struct post (title body comments) #:mutable #:prefab)
>>
>> ;; initialize-blog! : path? -> blog
>> ;; Reads a blog from a path, if not present, returns default
>> (define (initialize-blog! home)
>> (local [(define (log-missing-exn-handler exn)
>> - (make-blog
>> + (blog
>> (path->string home)
>> - (list (make-post "First Post"
>> - "This is my first post"
>> - (list "First comment!"))
>> - (make-post "Second Post"
>> - "This is another post"
>> - (list)))))
>> + (list (post "First Post"
>> + "This is my first post"
>> + (list "First comment!"))
>> + (post "Second Post"
>> + "This is another post"
>> + (list)))))
>> (define the-blog
>> (with-handlers ([exn? log-missing-exn-handler])
>> (with-input-from-file home read)))]
>> @@ -41,7 +41,7 @@
>> (define (blog-insert-post! a-blog title body)
>> (set-blog-posts!
>> a-blog
>> - (cons (make-post title body empty) (blog-posts a-blog)))
>> + (cons (post title body empty) (blog-posts a-blog)))
>> (save-blog! a-blog))
>>
>> ;; post-insert-comment!: blog post string -> void
>>
>> collects/web-server/scribblings/tutorial/examples/model-3.rkt
>> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> --- OLD/collects/web-server/scribblings/tutorial/examples/model-3.rkt
>> +++ NEW/collects/web-server/scribblings/tutorial/examples/model-3.rkt
>> @@ -3,17 +3,17 @@
>>
>> ;; A blog is a (make-blog db)
>> ;; where db is an sqlite database handle
>> -(define-struct blog (db))
>> +(struct blog (db))
>>
>> ;; A post is a (make-post blog id)
>> ;; where blog is a blog and id is an integer?
>> -(define-struct post (blog id))
>> +(struct post (blog id))
>>
>> ;; initialize-blog! : path? -> blog?
>> ;; Sets up a blog database (if it doesn't exist)
>> (define (initialize-blog! home)
>> (define db (sqlite:open home))
>> - (define the-blog (make-blog db))
>> + (define the-blog (blog db))
>> (with-handlers ([exn? void])
>> (sqlite:exec/ignore db
>> (string-append
>> @@ -35,7 +35,7 @@
>> ;; Queries for the post ids
>> (define (blog-posts a-blog)
>> (local [(define (row->post a-row)
>> - (make-post
>> + (post
>> a-blog
>> (vector-ref a-row 0)))
>> (define rows (sqlite:select
>>
>> collects/web-server/scribblings/tutorial/examples/model.rkt
>> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> --- OLD/collects/web-server/scribblings/tutorial/examples/model.rkt
>> +++ NEW/collects/web-server/scribblings/tutorial/examples/model.rkt
>> @@ -2,23 +2,23 @@
>>
>> ;; A blog is a (make-blog posts)
>> ;; where posts is a (listof post)
>> -(define-struct blog (posts) #:mutable)
>> +(struct blog (posts) #:mutable)
>>
>> ;; and post is a (make-post title body comments)
>> ;; where title is a string, body is a string,
>> ;; and comments is a (listof string)
>> -(define-struct post (title body comments) #:mutable)
>> +(struct post (title body comments) #:mutable)
>>
>> ;; BLOG: blog
>> ;; The initial BLOG.
>> (define BLOG
>> - (make-blog
>> - (list (make-post "First Post"
>> - "This is my first post"
>> - (list "First comment!"))
>> - (make-post "Second Post"
>> - "This is another post"
>> - (list)))))
>> + (blog
>> + (list (post "First Post"
>> + "This is my first post"
>> + (list "First comment!"))
>> + (post "Second Post"
>> + "This is another post"
>> + (list)))))
>>
>> ;; blog-insert-post!: blog post -> void
>> ;; Consumes a blog and a post, adds the post at the top of the blog.
>>
>> collects/web-server/scribblings/tutorial/examples/no-use-redirect.rkt
>> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> --- OLD/collects/web-server/scribblings/tutorial/examples/no-use-redirect.rkt
>> +++ NEW/collects/web-server/scribblings/tutorial/examples/no-use-redirect.rkt
>> @@ -2,7 +2,7 @@
>>
>> ;; A roster is a (make-roster names)
>> ;; where names is a list of string.
>> -(define-struct roster (names) #:mutable)
>> +(struct roster (names) #:mutable)
>>
>> ;; roster-add-name!: roster string -> void
>> ;; Given a roster and a name, adds the name
>> @@ -12,7 +12,7 @@
>> (append (roster-names a-roster)
>> (list a-name))))
>>
>> -(define ROSTER (make-roster '("kathi" "shriram" "dan")))
>> +(define ROSTER (roster '("kathi" "shriram" "dan")))
>>
>> ;; start: request -> html-response
>> (define (start request)
>>
>> collects/web-server/scribblings/tutorial/examples/use-redirect.rkt
>> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> --- OLD/collects/web-server/scribblings/tutorial/examples/use-redirect.rkt
>> +++ NEW/collects/web-server/scribblings/tutorial/examples/use-redirect.rkt
>> @@ -2,7 +2,7 @@
>>
>> ;; A roster is a (make-roster names)
>> ;; where names is a list of string.
>> -(define-struct roster (names) #:mutable)
>> +(struct roster (names) #:mutable)
>>
>> ;; roster-add-name!: roster string -> void
>> ;; Given a roster and a name, adds the name
>> @@ -12,7 +12,7 @@
>> (append (roster-names a-roster)
>> (list a-name))))
>>
>> -(define ROSTER (make-roster '("kathi" "shriram" "dan")))
>> +(define ROSTER (roster '("kathi" "shriram" "dan")))
>>
>> ;; start: request -> html-response
>> (define (start request)
>>
>> collects/web-server/servlet-dispatch.rkt
>> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> --- OLD/collects/web-server/servlet-dispatch.rkt
>> +++ NEW/collects/web-server/servlet-dispatch.rkt
>> @@ -135,7 +135,7 @@
>> (if launch-path
>> (string-append server-url launch-path)
>> server-url))
>> - (printf "Click 'Stop' at any time to terminate the Web Server.\n"))
>> + (printf "Stop this program at any time to terminate the Web Server.\n"))
>> (let ([bye (lambda ()
>> (when banner? (printf "\nWeb Server stopped.\n"))
>> (shutdown-server))])
>>
>
>
>
> --
> Jay McCarthy <jay at cs.byu.edu>
> Assistant Professor / Brigham Young University
> http://teammccarthy.org/jay
>
> "The glory of God is Intelligence" - D&C 93
>
--
Jay McCarthy <jay at cs.byu.edu>
Assistant Professor / Brigham Young University
http://teammccarthy.org/jay
"The glory of God is Intelligence" - D&C 93