arnesi
(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)))