summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ccwl/utils.scm11
1 files changed, 11 insertions, 0 deletions
diff --git a/ccwl/utils.scm b/ccwl/utils.scm
index 71bc1fe..d0db51c 100644
--- a/ccwl/utils.scm
+++ b/ccwl/utils.scm
@@ -30,6 +30,7 @@
   #:export (pairify
             plist->alist
             lambda**
+            syntax-lambda**
             mapn
             append-mapn
             foldn))
@@ -134,6 +135,16 @@ for example, be invoked as:
                                    rest (list #,@(map (compose symbol->keyword syntax->datum)
                                                       unary-arguments))))))))))))
 
+(define-syntax-rule (syntax-lambda** formal-args body ...)
+  "Like lambda**, but for syntax objects. This is useful for writing
+macros that accept keyword arguments."
+  (lambda (x)
+    (apply (lambda** formal-args body ...)
+           (with-ellipsis :::
+             (syntax-case x ()
+               ((_ args :::)
+                (unsyntax-keywords #'(args :::))))))))
+
 (define (mapn proc lst)
   "Map the procedure PROC over list LST and return a list containing
 the results. PROC can return multiple values, in which case, an equal