diff options
Diffstat (limited to 'mew.scm')
-rw-r--r-- | mew.scm | 17 |
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) |