summary refs log tree commit diff
path: root/mew.scm
diff options
context:
space:
mode:
Diffstat (limited to 'mew.scm')
-rw-r--r--mew.scm17
1 files changed, 11 insertions, 6 deletions
diff --git a/mew.scm b/mew.scm
index 7870656..97ff476 100644
--- a/mew.scm
+++ b/mew.scm
@@ -864,12 +864,17 @@
                   (apply and=> result (cdr fs)))))))
 
   (define-syntax proj
-    (syntax-rules ()
-      ((_ 0) (lambda (a . args) a))
-      ((_ 1) (lambda (a b . args) b))
-      ((_ 2) (lambda (a b c . args) c))
-      ((_ 3) (lambda (a b c d . args) d))
-      ((_ n) (lambda args (list-ref args n)))))
+    (er-macro-transformer
+      (lambda (expr rename compare)
+        (let* ((items (cdr expr))
+               (max-n (if (null? items) 0 (+ 1 (apply max items))))
+               (args (list-tabulate max-n
+                                    (lambda (n)
+                                      (string->symbol
+                                       (string-append "x"
+                                                      (number->string n)))))))
+          `(,(rename 'lambda) (,@args . rest)
+            (,(rename 'values) ,@(map (lambda (n) (list-ref args n)) items)))))))
 
   (define (fail exn . args)
     (if (list? exn)