Sample definitions for derived forms

case-lambda

The case-lambda keyword (see section 13.2) could be defined in terms of base library by the following macros:

(define-syntax case-lambda
  (syntax-rules ()
    ((case-lambda
      (formals-0 body0-0 body1-0 ...)
      (formals-1 body0-1 body1-1 ...)
      ...)
     (lambda args
       (let ((l (length args)))
         (case-lambda-helper
          l args
          (formals-0 body0-0 body1-0 ...)
          (formals-1 body0-1 body1-1 ...) ...))))))

(define-syntax case-lambda-helper
  (syntax-rules ()
    ((case-lambda-helper
      l args
      ((formal ...) body ...)
      clause ...)
     (if (= l (length ’(formal ...)))
         (apply (lambda (formal ...) body ...)
                args)
         (case-lambda-helper l args clause ...)))
    ((case-lambda-helper
      l args
      ((formal . formals-rest) body ...)
      clause ...)
     (case-lambda-helper-dotted
       l args
       (body ...)
       (formal . formals-rest)
       formals-rest 1
       clause ...))
    ((case-lambda-helper
      l args
      (formal body ...))
     (let ((formal args))
       body ...))))

(define-syntax case-lambda-helper-dotted
  (syntax-rules ()
    ((case-lambda-helper-dotted
      l args
      (body ...)
      formals
      (formal . formals-rest) k
      clause ...)
     (case-lambda-helper-dotted
      l args
      (body ...)
      formals
      formals-rest (+ 1 k)
      clause ...))
    ((case-lambda-helper-dotted
      l args
      (body ...)
      formals
      rest-formal k
      clause ...)
     (if (>= l k)
         (apply (lambda formals body ...) args)
         (case-lambda-helper
          l args clause ...)))))