Function: cconv--convert-funcbody
cconv--convert-funcbody is a byte-compiled function defined in
cconv.el.gz.
Signature
(cconv--convert-funcbody FUNARGS FUNCBODY ENV PARENTFORM)
Documentation
Run cconv-convert on FUNCBODY, the forms of a lambda expression.
PARENTFORM is the form containing the lambda expression. ENV is a
lexical environment (same format as for cconv-convert), not
including FUNARGS, the function's argument list. Return a list
of converted forms.
Source Code
;; Defined in /usr/src/emacs/lisp/emacs-lisp/cconv.el.gz
(defun cconv--convert-funcbody (funargs funcbody env parentform)
"Run `cconv-convert' on FUNCBODY, the forms of a lambda expression.
PARENTFORM is the form containing the lambda expression. ENV is a
lexical environment (same format as for `cconv-convert'), not
including FUNARGS, the function's argument list. Return a list
of converted forms."
(let ((wrappers ()))
(dolist (arg funargs)
(pcase (cconv--var-classification (list arg) parentform)
(:captured+mutated
(push `(,arg . (car-safe ,arg)) env)
(push (lambda (body) `(let ((,arg (list ,arg))) ,body)) wrappers))
((and :unused
(let (and (pred stringp) msg)
(cconv--warn-unused-msg arg "argument")))
(if (assq arg env) (push `(,arg . nil) env)) ;FIXME: Is it needed?
(push (lambda (body) (macroexp--warn-wrap arg msg body 'lexical)) wrappers))
(_
(if (assq arg env) (push `(,arg . nil) env)))))
(setq funcbody (mapcar (lambda (form)
(cconv-convert form env nil))
funcbody))
(if wrappers
(pcase-let ((`(,decls . ,body) (macroexp-parse-body funcbody)))
(let ((body (macroexp-progn body)))
(dolist (wrapper wrappers) (setq body (funcall wrapper body)))
`(,@decls ,@(macroexp-unprogn body))))
funcbody)))