(define-syntax curried (syntax-rules () [(_ () exp ...) (lambda args (if (null? args) (begin exp ...) (apply (begin exp ...) args)))] [(_ (x x1 ...) exp ...) (letrec ([rec (case-lambda [() rec] [(x x1 ...) (begin exp ...)] [(x x1 ... . rest) (apply (rec x x1 ...) rest)] [fewer-args (let ([waiting-for-more (lambda (rec fewer-args) (lambda more-args (apply rec (append fewer-args more-args))))]) (waiting-for-more rec fewer-args))])]) rec)] [(_ (x x1 ... . rest) exp ...) (letrec ([rec (case-lambda [() rec] [(x x1 ... . rest) (begin exp ...)] [fewer-args (let ([waiting-for-more (lambda (rec fewer-args) (lambda more-args (apply rec (append fewer-args more-args))))]) (waiting-for-more rec fewer-args))])]) rec)] [(_ args exp ...) (lambda args exp ...)])) (define-syntax define-curried (syntax-rules () [(_ (f . args) . body) (define f (curried args . body))]))