Function: elisp-scope-lambda
elisp-scope-lambda is a byte-compiled function defined in
elisp-scope.el.gz.
Signature
(elisp-scope-lambda ARGS BODY &optional OUTSPEC)
Source Code
;; Defined in /usr/src/emacs/lisp/emacs-lisp/elisp-scope.el.gz
(defun elisp-scope-lambda (args body &optional outspec)
(let ((l elisp-scope-local-bindings))
(when (listp args)
(dolist (arg args)
(when-let* ((bare (bare-symbol arg))
(beg (elisp-scope--sym-pos arg)))
(unless (memq bare '(&optional &rest))
(setq l (elisp-scope--local-new bare beg l))))))
;; Handle docstring.
(cond
((and (consp (car body))
(or (symbol-with-pos-p (caar body))
(symbolp (caar body)))
(eq (bare-symbol (caar body)) :documentation))
(elisp-scope--symbol (caar body))
(elisp-scope-1 (cadar body))
(setq body (cdr body)))
((stringp (car body)) (setq body (cdr body))))
;; Handle `declare'.
(when-let* ((form (car body))
(decl (car-safe form))
((or (symbol-with-pos-p decl)
(symbolp decl)))
(bare (bare-symbol decl))
((eq bare 'declare)))
(when (symbol-with-pos-p decl)
(elisp-scope--report 'macro (symbol-with-pos-pos decl) bare))
(dolist (spec (cdr form))
(when-let* ((head (car-safe spec))
(bare (elisp-scope--sym-bare head)))
(when (symbol-with-pos-p head)
(elisp-scope--report 'function-property-declaration (symbol-with-pos-pos head) bare))
(cl-case bare
(completion (elisp-scope-sharpquote (cadr spec)))
(interactive-only
(when-let* ((bare (elisp-scope--sym-bare (cadr spec)))
((not (eq bare t))))
(elisp-scope-sharpquote (cadr spec))))
(obsolete
(when-let* ((bare (elisp-scope--sym-bare (cadr spec))))
(elisp-scope-sharpquote (cadr spec))))
((compiler-macro gv-expander gv-setter)
;; Use the extended lexical environment `l'.
(let ((elisp-scope-local-bindings l))
(elisp-scope-sharpquote (cadr spec))))
(modes (mapc #'elisp-scope-major-mode-name (cdr spec)))
(interactive-args
(dolist (arg-form (cdr spec))
(when-let* ((arg (car-safe arg-form)))
(let ((elisp-scope-local-bindings l)) (elisp-scope--symbol arg))
(when (consp (cdr arg-form))
(elisp-scope-1 (cadr arg-form)))))))))
(setq body (cdr body)))
;; Handle `interactive'.
(when-let* ((form (car body))
(intr (car-safe form))
((or (symbol-with-pos-p intr)
(symbolp intr)))
((eq (bare-symbol intr) 'interactive)))
(elisp-scope-interactive intr (cadar body) (cddar body))
(setq body (cdr body)))
;; Handle ARGS.
(when (listp args)
(dolist (arg args)
(and (symbol-with-pos-p arg)
(let* ((beg (symbol-with-pos-pos arg))
(bare (bare-symbol arg)))
(when (and beg (not (eq bare '_)))
(if (memq bare '(&optional &rest))
(elisp-scope--report 'ampersand beg bare)
(elisp-scope--report 'binding-variable beg bare beg)))))))
;; Handle BODY.
(let ((elisp-scope-local-bindings l)) (elisp-scope-n body outspec))))