[racket] Help with phases
Yes that is my understanding.
On 01/17/2012 01:43 AM, Veer Singh wrote:
> Thanks , I think I understand it now , so roughly following steps happens(apology for incorrect terminology) :
>
> 1. bind the identifier 'phases' to some val(a syntax transformer) in phase 1
>
> i) during the above step id 'phase2' is bound to some val i.e syntax transformer in phase 2
>
> ii) (phase2) is expanded i.e it is looked up in phase 2 and it's syntax transformer applied , which returns the syntax object which is basically #'0
> since cnt was 0 at the time of application of transformer.
>
> iii) step 1 done.
>
>
>
> 2. encounters macro call (set-compile) and expansion takes place and set cnt=1(phase 1) , cnt=2(phase 2).
>
> 3. encounters macro call (phases) looks up in phase 1 and its transformer is applied and we get (list 1 0) , since
> (p1 cnt=1) and (p2 0).
>
>
>
> On Tue, Jan 17, 2012 at 12:51 PM, Jon Rafkind <rafkind at cs.utah.edu <mailto:rafkind at cs.utah.edu>> wrote:
>
> I'm guessing a little bit but I think its because the `phases' macro is expanded at phase 2 before `set-compile' is called. If you put (set-compile) before the definition of `phases' then you get '(1 2).
>
>
> On 01/17/2012 12:06 AM, Veer Singh wrote:
>>
>> Why macro call (phases) produces '(1 0) and not '(1 2) ?
>>
>>
>> (module mod1 racket
>> (require (for-syntax syntax/parse))
>> ;"mod-compile.rkt"))
>> (require (for-syntax
>> (for-syntax syntax/parse racket )))
>> ;"mod-compile.rkt")))
>> (provide set-compile phases)
>>
>> ;For phase 1
>> (begin-for-syntax
>> (define cnt 0)
>>
>> (define (store! v)
>> (set! cnt v)))
>>
>> ;For phase 2
>> (begin-for-syntax (begin-for-syntax
>> (define cnt 0)
>>
>> (define (store! v)
>> (set! cnt v))))
>>
>> ;;set the value of "cnt" in phase1 and phase2
>> (define-syntax (set-compile stx)
>> (syntax-parse stx
>> [(_) #'(begin
>>
>> (begin-for-syntax
>> ; in "cnt" in phase 1 cnt=1
>> (store! 1)
>> (begin-for-syntax
>> ; in "cnt" in phase 2 cnt=2
>> (store! 2)))
>> 'done)]))
>>
>>
>> ;;return the value of cnt in phase1 and phase2
>> (define-syntax (phases stx)
>>
>> ;phase2 ???
>> (define-syntax (phase2 stx)
>> (syntax-parse stx
>> [(_) (with-syntax ([p cnt])
>> #'p)]))
>>
>>
>> ;phase1
>> (syntax-parse stx
>> [(_) (with-syntax ([p1 cnt]
>> [p2 (phase2)])
>> #'(list p1 p2))]))
>>
>> (set-compile)
>> (phases)
>> ;produces (list 1 0), but why not (list 1 2)
>>
>> )
>>
>>
>> Thanks
>>
>>
>>
>> ____________________
>> Racket Users list:
>> http://lists.racket-lang.org/users
>
>
> ____________________
> Racket Users list:
> http://lists.racket-lang.org/users
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.racket-lang.org/users/archive/attachments/20120117/662816c8/attachment.html>