struct-member pasted by wasamasa on Sat Jan 9 22:39:10 2016

(define-syntax struct-member
  (syntax-rules ()
    ((struct-member record accessor ret-type struct-name member-name)
     (let ((record* (accessor record)))
       (when record*
         (let ((code (format "C_return(struct->~a);" member-name)))
           ((foreign-lambda* ret-type
                             (((c-pointer (struct struct-name))
                               struct))
                             code)
            record*)))))))

(define (gif-width gif)
  (struct-member gif gif-pointer int "GifFileType" "SWidth"))

(define (gif-height gif)
  (struct-member gif gif-pointer int "GifFileType" "SHeight"))

;; compiling the above yields the following backtrace:

;; Error: (string-append) bad argument type - not a string: code154
;;
;;        Call history:
;;
;;        <syntax>          (##core#begin (##core#let ((out162 out161)) (##sys#check-output
;;-port out162 #t (quote format)) (##sy......
;;        <syntax>          (##core#let ((out162 out161)) (##sys#check-output-port out162 #
;;t (quote format)) (##sys#print "C_ret...
;;        <syntax>          (##core#begin (##sys#check-output-port out162 #t (quote format)
;;) (##sys#print "C_return(struct->" #f...
;;        <syntax>          (##sys#check-output-port out162 #t (quote format))
;;        <syntax>          (quote format)
;;        <syntax>          (##core#quote format)
;;        <syntax>          (##sys#print "C_return(struct->" #f out162)
;;        <syntax>          (##sys#print "SWidth" #f out162)
;;        <syntax>          (##sys#print ");" #f out162)
;;        <syntax>          (get-output-string167 out161)
;;        <syntax>          (##core#begin ((foreign-lambda*156 int (((c-pointer157 (struct1
;;58 "GifFileType")) struct158)) code15......
;;        <syntax>          ((foreign-lambda*156 int (((c-pointer157 (struct158 "GifFileTyp
;;e")) struct158)) code154) record*152)
;;        <syntax>          (##core#let ((g174 (foreign-lambda*156 int (((c-pointer157 (str
;;uct158 "GifFileType")) struct158)) co......
;;        <syntax>          (foreign-lambda*156 int (((c-pointer157 (struct158 "GifFileType
;;")) struct158)) code154)
;;        <syntax>          (##core#the (procedure ((or boolean pointer locative)) fixnum)
;;#f (##core#foreign-lambda* int (((c-p......
;;        <syntax>          (##core#foreign-lambda* int (((c-pointer157 (struct158 "GifFile
;;Type")) struct158)) code154)    <--

w/ ir-macro-transformer added by evhan on Sat Jan 9 22:45:02 2016

(use-for-syntax matchable)

(define-syntax struct-member
  (ir-macro-transformer
   (lambda (e i c)
     (match e
       ((struct-member record accessor ret-type struct-name member-name)
        `(let ((record* (,(i accessor) ,(i record))))
           (when record*
             ((foreign-lambda* ,(i ret-type)
                (((c-pointer (struct ,(i struct-name)))
                  struct))
                ,(format "C_return(struct->~a);" (i member-name)))
              record*))))))))