(define-syntax define-method (ir-macro-transformer (lambda (expr inject compare) (assert (pair? expr)) (let* ((proc (car expr)) (defn (cdr expr)) (_ (assert (list? defn))) (_ (assert (= 4 (length defn)))) (sig (first defn)) (name (car sig)) (uri/req (second defn)) (writer (third defn)) (args (if writer `(body #!key . ,(cdr sig)) `(#!key . ,(cdr sig)))) (reader (fourth defn))) (list 'quote `(define ,name (let* ((writer ,writer) ; ensure this is eval'd only once (uri/req ,uri/req) ; ensure this is eval'd only once (uri (cond ((request? uri/req) (request-uri uri/req)) ((uri? uri/req) uri/req) (else (uri-reference uri/req)))) (method (cond ((request? uri/req) (request-method uri/req)) (writer 'POST) (else 'GET)))) (lambda ,args (let ((writer (if (writer) (writer body) #f)) (req (make-request uri: uri method: method)) ; poke the args into query string. ) (call-with-input-request req writer ,reader))))))))))