On 05/21/2012 08:13 PM, Harry Spier wrote:
I've entered the following example from the Racket Guide into DrRacket

#lang racket
(define-syntax-rule (swap X Y)
   (let ([tmp X])
     (set! X Y)
     (set! Y tmp)))

(let ([tmp 5] [other 6])
   (swap tmp other)
   (list tmp other))

It gives me the correct result:
'(6 5)

But  when I stepped through it with the macro expander I got:

  [Macro transformation]

(module anonymous-module racket
   (#%module-begin
    (define-syntax-rule
     (swap X Y)
     (let ([tmp X]) (set! X Y) (set! Y tmp)))
    (let ([tmp 5] [other 6])
      (let ([tmp tmp]) (set! tmp other) (set! other tmp))
      (list tmp other))))

I was expecting to see something like the Racket Guide description in
section 16.1 I.e:
"Racket doesn’t produce the naive expansion for the above use of swap.
Instead, it produces
(let ([tmp 5]
       [other 6])
   (let ([tmp_1 tmp])
     (set! tmp other)
     (set! other tmp_1))
   (list tmp other))            "

The Guide should really say that it produces something *equivalent* to the code above. It doesn't actually change the names; the information is stored "out of band" as Mark and Rename wraps attached to the syntax object. The macro stepper renders Marks using colors: some of the 'tmp's should be red (or some other color besides black).

Ryan
____________________
 Racket Users list:
 http://lists.racket-lang.org/users

Reply via email to