From 704c473015795543f72a1e146cd862074f2419a2 Mon Sep 17 00:00:00 2001 From: Jesse McDonald Date: Thu, 8 Dec 2011 17:18:32 -0600 Subject: [PATCH] Add a new syntax macro, compose-if. The macro resembles (or x (fn x)) except: 1) The value is only evaluated once, and 2) Multiple (single-argument) functions can be chained. If the original value or the result of any function is #f, the final value is #f. Otherwise the result is ((compose ,@fns) x). Short-circuit evaluation is employed. --- src/lib/syntax.rls | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/lib/syntax.rls b/src/lib/syntax.rls index 87b7aef..55144d7 100644 --- a/src/lib/syntax.rls +++ b/src/lib/syntax.rls @@ -69,4 +69,10 @@ (define-syntax (let/cc var . body) `(call/cc (lambda (,var) ,@body))) +(define-syntax (compose-if x fn . fns) + (let ([it (gensym)]) + (if (pair? fns) + `(let ([,it ,x]) (if ,it (compose-if (,fn ,it) ,@fns) #f)) + `(let ([,it ,x]) (if ,it (,fn ,it) #f))))) + ; vim:set syntax=scheme sw=2 expandtab: