no title pasted by buhman on Mon Dec 3 10:25:11 2018

(define-syntax test
  (ir-macro-transformer
   (lambda (exp inject compare)
     (let* ((type (cadr exp))
            (body (cddr exp))
            (get-x (inject (symbol-append (strip-syntax type) '- (strip-syntax 'x))))
            (get-y (inject (symbol-append (strip-syntax type) '- (strip-syntax 'y)))))
       `(let ((thing ,@body))
          (list (,get-x thing) (,get-y thing)))))))

(define-syntax test-outer
  (ir-macro-transformer
   (lambda (exp inject compare)
     (let* ((type (cadr exp))
            (body (cddr exp)))
       `(test ,type ,@body)))))

#;704> (test-outer my-foo (make-foo 1 2))

Error: unbound variable: my-foo-x

	Call history:

	<eval>	  (##sys#list (##core#quote let) (##sys#list (##sys#cons (##core#quote thing) body)) (##sys#list (##co...
	<eval>	  (##sys#list (##sys#cons (##core#quote thing) body))
	<eval>	  (##sys#cons (##core#quote thing) body)
	<eval>	  (##sys#list (##core#quote list) (##sys#list get-x (##core#quote thing)) (##sys#list get-y (##core#qu...
	<eval>	  (##sys#list get-x (##core#quote thing))
	<eval>	  (##sys#list get-y (##core#quote thing))
	<syntax>	  (##core#let ((thing2353278 (make-foo 1 2))) (list2353279 (my-foo-x thing2353278) (my-foo-y thing2353...
	<syntax>	  (##core#begin (list2353279 (my-foo-x thing2353278) (my-foo-y thing2353278)))
	<syntax>	  (list2353279 (my-foo-x thing2353278) (my-foo-y thing2353278))
	<syntax>	  (my-foo-x thing2353278)
	<syntax>	  (my-foo-y thing2353278)
	<syntax>	  (make-foo 1 2)
	<eval>	  (make-foo 1 2)
	<eval>	  [make-foo] (##sys#make-structure (##core#quote foo) x y)
	<eval>	  (list2353279 (my-foo-x thing2353278) (my-foo-y thing2353278))
	<eval>	  (my-foo-x thing2353278)	<--

How to make this work added by sjamaan on Mon Dec 3 10:31:28 2018

(define-record-type foo
  (make-foo x y)
  foo?
  (x foo-x)
  (y foo-y))

(define-syntax test
  (ir-macro-transformer
   (lambda (exp inject compare)
     (let* ((type (cadr exp))
            (body (cddr exp))
            (get-x (inject (symbol-append (strip-syntax type) '- (strip-syntax 'x))))
            (get-y (inject (symbol-append (strip-syntax type) '- (strip-syntax 'y)))))
       `(let ((thing ,@body))
          (list (,get-x thing) (,get-y thing)))))))

(begin-for-syntax
 (define my-type 'foo)) ;; She's just my type

(define-syntax test-outer
  (ir-macro-transformer
   (lambda (exp inject compare)
     (let ((body (cdr exp)))
       `(test ,my-type ,@body)))))

(print (test-outer (make-foo 1 2)))