diff --git a/contrib/50.procedure/nitro.mk b/contrib/50.procedure/nitro.mk new file mode 100644 index 00000000..87f2e8f5 --- /dev/null +++ b/contrib/50.procedure/nitro.mk @@ -0,0 +1 @@ +CONTRIB_LIBS += $(wildcard contrib/50.procedure/*.scm) diff --git a/contrib/50.procedure/procedure.scm b/contrib/50.procedure/procedure.scm new file mode 100644 index 00000000..5be822c3 --- /dev/null +++ b/contrib/50.procedure/procedure.scm @@ -0,0 +1,25 @@ +(define-library (picrin procedure) + (import (scheme base)) + (export >> + << + constant + identity) + + (define identity values) + + (define (constant . args) + (lambda _ + (apply values args))) + + (define (>> . fs) + (if (null? fs) + identity + (let ((f (car fs)) + (g (apply >> (cdr fs)))) + (lambda args + (call-with-values (lambda () (apply f args)) + (lambda args + (apply g args))))))) + + (define (<< . fs) + (apply >> (reverse fs))))