[racket] Ready for the next phase - or how to shift the phase of a namespace

From: Matthias Felleisen (matthias at ccs.neu.edu)
Date: Sat Jul 19 19:19:41 EDT 2014

Can't you just put forms2 into a constructed module that requires the desired module at the phase where you want it? -- Matthias


On Jul 19, 2014, at 3:52 PM, Jens Axel Søgaard wrote:

> I am looking for a way to change the base phase of a namespace.
> Or perhaps to make a new namespace with the same mappings except a
> shift in phases.
> I hope I have missed a trick, but I couldn't find a
> namespace-shift-phase in the docs.
> 
> Consider the following program which defines a variable x to 0, 1, 2, and, 3
> in phases 0, 1, 2, and, 3 respectively. It does so by evalunting the
> forms in forms.
> 
> Then it displays the values of x in phases 1 and 2 with the results 1 and 2.
> It does so by evaluating the forms in forms2.
> 
> I'd like to shift the base phase of the namespace (or make a copy with
> new base phase),
> so evaluating the forms in forms2 again will give results 2 and 3.
> 
> #lang racket
> (define (eval* forms [ns (current-namespace)])
>  (for ([form forms])
>    (displayln (~a "> " form))
>    (eval form ns)))
> 
> (define forms '((module m0 racket (provide x) (define x 0))
>                (module m1 racket (provide x) (define x 1))
>                (module m2 racket (provide x) (define x 2))
>                (module m3 racket (provide x) (define x 3))
>                (require (for-meta 0 'm0))
>                (require (for-meta 1 'm1))
>                (require (for-meta 2 'm2))
>                (require (for-meta 3 'm3))))
> 
> (define forms2 '(; display the value of x in phase 1
>                 (define-syntaxes () (begin (displayln x) (values)))
>                 ; display the value of x in phase 2
>                 (define-syntaxes () (begin (let-syntaxes ([() (begin
> (displayln x) (values))])
>                                                          (void)) (values)))))
> 
> (define ns (make-base-empty-namespace))
> (parameterize ([current-namespace ns])
>  ; setup the namespace
>  (namespace-require '(for-meta 0 racket/base))
>  (namespace-require '(for-meta 1 racket/base))
>  (namespace-require '(for-meta 2 racket/base))
>  (namespace-require '(for-meta 3 racket/base))
>  ; declare and require the modules
>  (eval* forms)
>  ; display the value of x in phase 1 and 2
>  (eval* forms2)       ; displays 1 and 2
>  ; (namespace-shift-phase ns +1)  ; on the wish list
>  ; (eval* forms2)                 ; would display 2 and 3
>  )
> 
> The output is:
> 
>> (module m0 racket (provide x) (define x 0))
>> (module m1 racket (provide x) (define x 1))
>> (module m2 racket (provide x) (define x 2))
>> (module m3 racket (provide x) (define x 3))
>> (require (for-meta 0 (quote m0)))
>> (require (for-meta 1 (quote m1)))
>> (require (for-meta 2 (quote m2)))
>> (require (for-meta 3 (quote m3)))
>> (define-syntaxes () (begin (displayln x) (values)))
> 1
>> (define-syntaxes () (begin (let-syntaxes ((() (begin (displayln x) (values)))) (void)) (values)))
> 2
> 
> --
> Jens Axel Søgaard
> 
> ____________________
>  Racket Users list:
>  http://lists.racket-lang.org/users



Posted on the users mailing list.