arnesi

A reader macro for simple lambdas 

(defun enable-sharp-l ()
  (set-dispatch-macro-character #\# #\L #'sharpL-reader))
(defun sharpL-reader (stream subchar min-args)
  "Reader macro for simple lambdas."
  (declare (ignore subchar))[...]
  (let* ((form (read stream t nil t))
         (lambda-args (loop
                         for i upfrom 1 upto (max (or min-args 0)
                                                  (highest-bang-var form))
                         collect (make-sharpl-arg i))))
    `(lambda ,lambda-args
       , (when lambda-args
           `(declare (ignorable ,@lambda-args)))
       ,form)))
(defun highest-bang-var (form)
  (acond
   ((consp form) (max (highest-bang-var (car form))[...]
                      (highest-bang-var (cdr form))))
   ((bang-var-p form) it)
   (t 0)))
(defun bang-var-p (form)
  (and (symbolp form)
       (char= #\! (aref (symbol-name form) 0))
       (parse-integer (subseq (symbol-name form) 1) :junk-allowed t)))
(defun make-sharpl-arg (number)
  (intern (format nil "!~D" number)))