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