Well, that was a happy coincidence. Thank you for the explanation! -- Chad Albers http://www.neomantic.com (pgp signature available on request)
On Wed, Sep 11, 2013 at 10:40 AM, Jay McCarthy <jay.mccar...@gmail.com> wrote: > Luckily, you've asked the person who wrote that code! > > There's a few things going on here... > > 1. read-request is just provided for backwards compatibility, the Web server > itself ONLY use make-ext:read-request (as renamed to make-read-request on > line 23); for instance, see > https://github.com/plt/racket/blob/v5.3.4/collects/web-server/web-server.rkt#L62 > > The reason is that we want to give you the option to never use HTTP/1.1 and > always close a connection and that is part of request handling. > > That's the first part of make-ext:read-request, or rather why we have > make-read-request at all. > > 2. Next, we want to make sure that whenever read-request throws an error, it > kills the connection (which will in turn kill the Web server thread and free > resources). However, we don't want to clutter the definition of > make-read-request with these details, particularly because the test suite > wants to turn this behavior off for various reasons and uses require/expose > to get the /real/ make-read-request. > > So, in all, I wouldn't call this a use of a 'pattern' but rather a weird > hodge-podge of the stuff from the past decade of maintaining the Web server > :) > > Jay > > > > > On Tue, Sep 10, 2013 at 7:28 PM, Chad A. <c...@neomantic.com> wrote: >> >> Thanks for your help. I was sure it would have something to do with >> capturing bindings in a closure, but the code in question seems to >> lack a closure. Maybe I'm missing something, though. >> >> Here's the code: >> >> https://github.com/plt/racket/blob/v5.3.4/collects/web-server/http/request.rkt#L102. >> >> Thanks again, >> Chad >> >> >> -- >> Chad Albers >> http://www.neomantic.com >> (pgp signature available on request) >> >> >> On Tue, Sep 10, 2013 at 10:16 PM, Jay McCarthy <jay.mccar...@gmail.com> >> wrote: >> > I think more context would be useful to know why a specific case is >> > useful. >> > But, I'll do my best with none... >> > >> > By using functions like this, you can control when things happen and >> > what >> > they can see. For instance... >> > >> > (define (make-worker) >> > (define a (build-list 10 add1) >> > (define (worker) >> > ;; a is visible to 'worker' >> > (+ (first a) 10)) >> > worker) >> > >> > ;; a is not visible here >> > >> > ;; .... you do some other work ... >> > >> > ;; and only now do you run the construction of a >> > >> > (define some-worker >> > (make-worker)) >> > >> > ;; .... you do some other work before getting the contents >> > >> > (define answer >> > (some-worker)) >> > >> > This is all because closures are a basic form of objects---their >> > environment >> > values are their "private fields" and "apply" is their one method. Thus, >> > any >> > time that you would find OO useful, you might find a pattern like this >> > useful. Especially when you don't want to go whole hog and use the >> > object/class system from racket/class >> > >> > Jay >> > >> > >> > >> > >> > On Mon, Sep 9, 2013 at 8:24 PM, Chad A. <c...@neomantic.com> wrote: >> >> >> >> Hi, >> >> >> >> I'm wondering if someone can help me understand a design-pattern that >> >> I have noticed in the Racket code base. (I'm teaching myself, so >> >> review other people's code alot). >> >> >> >> I've seen this pattern..which is a bit contrived. >> >> >> >> (define (say-hello) >> >> (define (display-hello) >> >> (display "hello"))) >> >> >> >> So this produces a producer, and to evaluate it I would need to write >> >> ((hello)) => "hello" >> >> >> >> But then I see this... >> >> >> >> (define say-hi (say-hello)). When I evaluate (say-hello), I get >> >> "hello". Obviously, the definition of "say-hi" contains the evaluated >> >> (say-hello) than returns the 'display-hello' procedure to be >> >> evaluated. >> >> >> >> My question is...why would I want to write the code like this? 3 >> >> definitions have been created which could easily be compressed into >> >> one. >> >> >> >> (I also see nothing in the code I'm looking at that appears to >> >> capture a binding via a closure). >> >> >> >> Thanks in advance for any insights someone can share. >> >> >> >> Chad >> >> ____________________ >> >> Racket Users list: >> >> http://lists.racket-lang.org/users >> > >> > >> > >> > >> > -- >> > Jay McCarthy <j...@cs.byu.edu> >> > Assistant Professor / Brigham Young University >> > http://faculty.cs.byu.edu/~jay >> > >> > "The glory of God is Intelligence" - D&C 93 > > > > > -- > Jay McCarthy <j...@cs.byu.edu> > Assistant Professor / Brigham Young University > http://faculty.cs.byu.edu/~jay > > "The glory of God is Intelligence" - D&C 93 ____________________ Racket Users list: http://lists.racket-lang.org/users