(load "functions.lisp")

;; This is based on the dlambda macro presented in "Let Over Lambda" by Doug Hoyte.

(defmacro dlambda (&rest methods)
  (let ((arguments (gensym)))

    `(lambda (&rest ,arguments)
      (case (first ,arguments)
        ,@(mapcar
            (lambda (method)
              `(,(first method)
                (apply (lambda ,@(rest method))
                       ,(if (equal t (first method))
                         arguments
                         `(rest ,arguments)))))
            methods)))))
