summaryrefslogtreecommitdiff
path: root/sieve/extra-functional.scm
diff options
context:
space:
mode:
Diffstat (limited to 'sieve/extra-functional.scm')
-rw-r--r--sieve/extra-functional.scm47
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 ...)))))
+
+
+
+)