diff options
| author | Nathan Weizenbaum <nweiz@google.com> | 2012-11-30 15:32:28 -0800 |
|---|---|---|
| committer | Nathan Weizenbaum <nweiz@google.com> | 2012-11-30 15:35:32 -0800 |
| commit | cf796cb7ce1380e17188f04ffe78d7c19daf2c69 (patch) | |
| tree | 786b74f9b5becfd73acf8f151db74dd176ac2757 | |
| parent | a2277475f0f84b5cac517807d2d0920fcd739375 (diff) | |
| parent | e3eab64af34c30915e9eef5e13b3f96766836e4e (diff) | |
Merge remote-tracking branch 'fred-o/recursive-edit-bugfix'
Closes #17
| -rw-r--r-- | perspective.el | 30 |
1 files changed, 16 insertions, 14 deletions
diff --git a/perspective.el b/perspective.el index 2cdd35d..86357a8 100644 --- a/perspective.el +++ b/perspective.el @@ -63,20 +63,22 @@ them in Emacs >= 23.2. In older versions, this is identical to (and (= emacs-major-version 23) (< emacs-minor-version 2))) `(let ,bindings ,@body) (let ((binding-syms (mapcar (lambda (binding) (list (car binding) (gensym))) bindings))) - (flet ((setmap (bdgs) - (mapcar (lambda (binding) - (let ((name (car binding))) - `(when (boundp ',name) (setq ,name ,(cadr binding))))) - bdgs))) - `(let ,(mapcar (lambda (binding) - (list (cadr binding) - (let ((name (car binding))) - `(when (boundp ',name) ,name)))) - binding-syms) - (unwind-protect - (progn ,@(setmap bindings) - ,@body) - ,@(setmap binding-syms))))))) + ;; Each binding-sym is a pair (ORIGINAL-VALUE . WAS-BOUND). + `(let ,(mapcar (lambda (binding) + (list (cadr binding) + (let ((name (car binding))) + `(cons (when (boundp ',name) ,name) + (boundp ',name))))) + binding-syms) + (unwind-protect + (progn ,@(mapcar (lambda (binding) `(setq ,(car binding) ,(cadr binding))) bindings) + ,@body) + ;; After the body, reset the original value of each binding sym if + ;; there was one, unbind it if there wasn't. + ,@(mapcar (lambda (binding) + `(if (cdr ,(cadr binding)) + (setq ,(car binding) (car ,(cadr binding))) + (makunbound ',(car binding)))) binding-syms)))))) (defstruct (perspective (:conc-name persp-) |
