(define-syntax curried-lambda (syntax-rules () ((_ () exp exp* ...) (lambda () exp exp* ...)) ((_ (x) exp exp* ...) (lambda (x) exp exp* ...)) ((_ (x y y* ...) exp exp* ...) (lambda (x . z) (let ((l (curried-lambda (y y* ...) exp exp* ...))) (if (null? z) l (apply l z)))))))