﻿id	summary	reporter	owner	description	type	status	priority	milestone	component	version	resolution	keywords	cc	difficulty
1362	A case when composing with ir-macro-transformer	megane		"I ran into this unexpected behaviour when using ir macros in ir macros. I don't think this should happen:
 
 (I have tested this with 4.12, not with 5. )
 
 First macro:
 {{{#!scheme
 (define-syntax bind-pair
   (ir-macro-transformer
    (lambda (e i c)
      (let* ((b (second e))
             (exp (third e))
             (body (drop e 3)))
        `(let* ((x ,exp)
                (,(first b) (car x))
                (,(second b) (cdr x)))
           ,@body)))))
}}}
 
 Testing:
 
{{{
 (bind-pair (x y) (cons 1 2) (print y))
 
 => prints 2
}}}
 
 Now a second macro using bind-pair:
 
{{{#!scheme
 (define-syntax foo
   (ir-macro-transformer
    (lambda (e i c)
      `(bind-pair (x y) (cons 'foo-car 'b) (print y)))))
}}}
 
 Running (foo) gives the error:
 
 Error: (cdr) bad argument type: foo-car
 
 The expansion of (foo) looks like this:
 
{{{
 ;; (##core#let
 ;;   ((x40 (cons42 (quote43 foo-car44) (quote43 b45))))
 ;;   (##core#let
 ;;     ((x40 (car48 x40)))
 ;;     (##core#let ((y41 (cdr49 x40))) (##core#let () (print46 y41)))))
 }}}

 As you can see, the x in bind-pair and foo macros refer to the same
 variable in the expansion. You can confirm this happens by changing the
 x in foo to, say z.
"	defect	closed	major	4.13.0	expander	4.12.0	fixed	ir-macro-transformer		hard
