diff options
Diffstat (limited to 'sieve/extra-functional.scm')
-rw-r--r-- | sieve/extra-functional.scm | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/sieve/extra-functional.scm b/sieve/extra-functional.scm new file mode 100644 index 0000000..ab480c0 --- /dev/null +++ b/sieve/extra-functional.scm @@ -0,0 +1,47 @@ + +(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 ...))))) + + + +) |