- (`(,(and sym (or `defconst `defvar)) ,definedsymbol . ,body-forms)
-
- (let ((body-forms-new '()))
- (dolist (elm body-forms)
- (push (cconv-closure-convert-rec
- elm emvrs fvrs envs lmenvs)
- body-forms-new))
- (setq body-forms-new (reverse body-forms-new))
- `(,sym ,definedsymbol . ,body-forms-new)))
-
- ;defun, defmacro
- (`(,(and sym (or `defun `defmacro))
- ,func ,vars . ,body-forms)
-
- ;; The freevar data was pushed onto cconv-freevars-alist
- ;; but we don't need it.
- (assert (equal body-forms (caar cconv-freevars-alist)))
- (assert (null (cdar cconv-freevars-alist)))
- (setq cconv-freevars-alist (cdr cconv-freevars-alist))
-
- (let ((body-new '()) ; The whole body.
- (body-forms-new '()) ; Body w\o docstring and interactive.
- (letbind '()))
- ; Find mutable arguments.
- (dolist (elm vars)
- (when (member (cons (list elm) form) cconv-captured+mutated)
- (push elm letbind)
- (push elm emvrs)))
- ;Transform body-forms.
- (when (stringp (car body-forms)) ; Treat docstring well.
- (push (car body-forms) body-new)
- (setq body-forms (cdr body-forms)))
- (when (eq (car-safe (car body-forms)) 'interactive)
- (push (cconv-closure-convert-rec
- (car body-forms)
- emvrs fvrs envs lmenvs)
- body-new)
- (setq body-forms (cdr body-forms)))
-
- (dolist (elm body-forms)
- (push (cconv-closure-convert-rec
- elm emvrs fvrs envs lmenvs)
- body-forms-new))
- (setq body-forms-new (reverse body-forms-new))
-
- (if letbind
- ; Letbind mutable arguments.
- (let ((binders-new '()))
- (dolist (elm letbind) (push `(,elm (list ,elm))
- binders-new))
- (push `(let ,(reverse binders-new) .
- ,body-forms-new) body-new)
- (setq body-new (reverse body-new)))
- (setq body-new (append (reverse body-new) body-forms-new)))
-
- `(,sym ,func ,vars . ,body-new)))