You would have to implement laziness for attributes manually -- I think. But I don't have time to play with code and get an example to work right now. -- Matthias
On May 31, 2013, at 11:00 AM, Eric Dobson wrote: > That seems like a a workable amount of overhead, but I'm not sure what > you are suggesting the v attribute to be bound as. It might have not > been obvious from my my example that its value depends on the slow > computation, so unless pattern variables can be mutated I'm not sure > how force-all can change what e.v resolves to. > > On Fri, May 31, 2013 at 5:18 AM, Matthias Felleisen > <matth...@ccs.neu.edu> wrote: >> >> Can you prefix the #'(complicated ..) expression with a form >> that forces all lazy computations so that complicated itself >> remains the same? >> >> (let () (force-all) #'(complicated (form e.v))) >> >> where force-all is defined via a begin in the slow syntax class? >> >> -- Matthias >> >> >> On May 31, 2013, at 2:47 AM, Eric Dobson wrote: >> >>> I'm working on code (TR optimizer) that needs to match some >>> expressions and then compute an attribute based on the expression. I >>> would like to abstract this out as a syntax class. Example is below: >>> >>> #lang racket >>> (require syntax/parse) >>> >>> (define-syntax-class slow >>> (pattern e:expr >>> #:with v (begin (displayln 'slow) #''e))) >>> >>> (syntax-parse #'(x 2) >>> ((e:slow 1) #'(complicated (form e.v))) >>> ((e:slow 2) #'(complicated (form e.v)))) >>> >>> The issue is that computing the attribute is slow/expensive/effectful >>> and so I only want to do the calculation in the case that I use the >>> result. One solution is to attach a thunk as the attribute value, but >>> this requires changing #'(complicated (form e.v)) to #`(complicated >>> (form #,((attribute e.v)))) which quickly becomes less readable with >>> many such attributes in the final syntax object. Is there a way to do >>> this in a lazy manner that does not complicate the use of the syntax >>> class? I'm fine adding complexity to the creation of the syntax class >>> because it is a one time cost versus the many places where the syntax >>> class would be used. >>> ____________________ >>> Racket Users list: >>> http://lists.racket-lang.org/users >> ____________________ Racket Users list: http://lists.racket-lang.org/users