curry can only be applied to lambda.
| curry: (lambda ...) | procedure to curry |
|---|---|
| uncurry: procedure | curried procedure |
(curry (lambda (x y) (+ x y))) => procedure ; (lambda (x) (lambda (y) (+ x y))) (uncurry (lambda (x) (lambda (y) (+ x y))) 5 7) => 12
(define-syntax curry
(syntax-rules ()
((_ (lambda () . expr))
(begin . expr))
((_ (lambda (h . t) . expr))
(lambda (h) (curry (lambda t . expr))))))
(define-syntax uncurry
(syntax-rules ()
((_ fn arg)
(fn arg))
((_ fn arg . args)
(uncurry (fn arg) . args))))