You want to head expand not just look at the raw words, because an expression 
can expand to (define-values (x …) …). You may wish to look at how modules, 
units, and classes are expanded — Matthias




> On Jan 23, 2018, at 8:15 PM, Matthew Butterick <m...@mbtype.com> wrote:
> 
> 
>> On Jan 22, 2018, at 7:22 PM, Matthew Flatt <mfl...@cs.utah.edu 
>> <mailto:mfl...@cs.utah.edu>> wrote:
>> 
>> I think I've never considered `splicing-parameterize` because
>> parameters can be mutated, but a `splicing-parameterize` form does make
>> sense. I imagine that it would be implemented by creating a
>> parameterization once, then pushing the parameterization over multiple
>> expressions using `call-with-parameterization`.
> 
> IIUC, to use `call-with-parameterization`, each expression needs to become 
> the body of a thunk. This works for expressions that return a value. But 
> forms like `define` and `require` can't be used as the body of a thunk. So 
> one has to specially pluck them out. The example below works, albeit 
> brutally. Is there a more elegant pattern for picking out identifiers that 
> cannot appear as the body of a thunk?
> 
>  
> ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
> 
> #lang racket/base
> (require racket/splicing
>          (for-syntax racket/base racket/syntax))
> 
> (define-syntax (splicing-parameterize stx)
>   (syntax-case stx ()
>     [(_ ([PARAM VAL] ...) . BODY)
>      (with-syntax* ([PZATION (generate-temporary)]
>                     [NEW-BODY (map (λ (stx)
>                                      (syntax-case stx ()
>                                        [(ID ARG0 . ARGS)
>                                         (memq (syntax->datum #'ID) '(define 
> define-values)) ; ... and others
>                                         #'(ID ARG0 
> (call-with-parameterization PZATION (λ () (begin . ARGS))))]
>                                        [(ID . ARGS)
>                                         (memq (syntax->datum #'ID) '(require 
> provide splicing-let)) ; ... and others
>                                         #'(ID . ARGS)]
>                                        [OTHER #'(call-with-parameterization 
> PZATION (λ () OTHER))])) (syntax->list #'BODY))])
>        #'(splicing-let ([PZATION (parameterize ([PARAM VAL] ...) 
> (current-parameterization))]) . NEW-BODY))]))
> 
> (define my-param (make-parameter 0))
> 
> (splicing-parameterize ([my-param 42])
>                        (add1 (my-param))
>                        (sub1 (my-param))) ; prints 43 and 41 to repl
> 
> (splicing-parameterize ([my-param 42])
>                        (define x (my-param))
>                        (check-equal? x 42)
>                        (define-values (y z) (values (add1 (my-param)) (sub1 
> (my-param)))))
> 
> (splicing-parameterize ([my-param 42])
>                        (require rackunit))
> 
> (check-equal? x 42)
> (check-equal? y 43)
> (check-equal? z 41)
> 
> 
> 
> 
> 
> 
> -- 
> You received this message because you are subscribed to the Google Groups 
> "Racket Users" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to racket-users+unsubscr...@googlegroups.com 
> <mailto:racket-users+unsubscr...@googlegroups.com>.
> For more options, visit https://groups.google.com/d/optout 
> <https://groups.google.com/d/optout>.

-- 
You received this message because you are subscribed to the Google Groups 
"Racket Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to racket-users+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to