(define-syntax jlambda-method* (syntax-rules () ((_ modifier class-name return-type method-name (arg-type ...) (arg-name ...)) (let ((class-object (class class-name)) (method (method-id modifier class-object return-type method-name arg-type ...)) (jvalue-array (make-jvalue-array* (arg-name ...)))) (lambda (arg-name ...) (build-jvalue-array* jvalue-array (arg-type ...) (arg-name ...)) (check-jexception)))))) (pp (expand* '(jlambda-method* static java.lang.String java.lang.String valueOf (int long double java.lang.String) (a1 a2 a3 a4)))) (define-syntax arg-types->arg-names* (er-macro-transformer (lambda (x r c) (let ((arg-types (cdr x))) (map (lambda (x) (symbol-append 'a x)) (map (compose string->symbol number->string) (iota (length arg-types)))))))) (define-syntax jlambda-method** (syntax-rules () ((_ modifier class-name return-type method-name arg-type ...) (jlambda-method* modifier class-name return-type method-name (arg-type ...) (arg-types->arg-names* arg-type ...)))))