Hi, I recently came up with the following idea: similarly to curried definitions (from (ice-9 curried-definitions)), one could introduce matching lambdas, i.e. lambdas whose arguments can be destructured in the argument list, so that instead of e.g.
(define (f pair) (+ (car pair) (cdr pair))) one could write (define (f (a . b)) (+ a b)) The extension is compatible with curried-definitions and could be performed alongside (requires srfi-1 and ice-9 match modules, though): (define-syntax mlambda (lambda (stx) (syntax-case stx () ((_ (first-arg ... last-arg . rest-args) body body* ...) (and (every identifier? #'(first-arg ... last-arg)) (or (identifier? #'rest-args) (null? #'rest-args))) #'(lambda (first-arg ... last-arg . rest-args) body body* ...)) ((_ arg body body* ...) (or (identifier? #'arg) (null? #'arg)) #'(lambda arg body body* ...)) ((_ args body body* ...) #'(match-lambda* (args body body* ...)))))) (define-syntax cdefine (syntax-rules () ((_ ((head . tail) . args) body body* ...) (cdefine (head . tail) (mlambda args body body* ...))) ((_ (name . args) body body* ...) (define name (mlambda args body body* ...))) ((_ . rest) (define . rest)))) (obviously, mlambda should replace lambda just as cdefine replaces define) I think that it is would be a nice extension, because it only increases the expressive power of the language. WDYT?