(library (extra-functional) (export curry uncurry flip part compose) (import (rnrs base)) (define (curry f) (lambda (x) (lambda (y . r) (apply f (cons x (cons y r)))))) (define (uncurry f) (lambda (x y . r) (apply (f x) (cons y r)))) (define (flip f) (lambda (x y . r) (apply f (cons y (cons x r))))) (define-syntax part (syntax-rules () ((_ f x) ((curry f) x)))) (define-syntax dot (syntax-rules () ((_ x f) (f x)) ((_ x f g ...) (f (dot x g ...))))) ; (compose f g h) => (lambda (x) (f (g (h x)))) (define-syntax compose (syntax-rules () ((_ f ...) (lambda (x) (dot x f ...))))) )