Source
(defun walk-lambda-list (lambda-list parent env &key allow-specializers)
(flet ((extend-env (argument)
(unless (typep argument 'allow-other-keys-function-argument-form)
(extend env :let (name argument) argument))))
(let ((state :required)
(arguments '()))
(dolist (argument lambda-list)
(if (member argument '(&optional &key &rest))
(setf state argument)
(progn
(push (case state
(:required
(if allow-specializers
(walk-specialized-argument-form argument parent env)
(walk-required-argument argument parent env)))
(&optional (walk-optional-argument argument parent env))
(&key
(if (eql '&allow-other-keys argument)
(make-instance 'allow-other-keys-function-argument-form
:parent parent :source argument)
(walk-keyword-argument argument parent env)))
(&rest (walk-rest-argument argument parent env)))
arguments)
(extend-env (car arguments)))))
(values (nreverse arguments) env))))
Source Context