aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathan Weizenbaum <nweiz@google.com>2012-11-30 15:32:28 -0800
committerNathan Weizenbaum <nweiz@google.com>2012-11-30 15:35:32 -0800
commitcf796cb7ce1380e17188f04ffe78d7c19daf2c69 (patch)
tree786b74f9b5becfd73acf8f151db74dd176ac2757
parenta2277475f0f84b5cac517807d2d0920fcd739375 (diff)
parente3eab64af34c30915e9eef5e13b3f96766836e4e (diff)
Merge remote-tracking branch 'fred-o/recursive-edit-bugfix'
Closes #17
-rw-r--r--perspective.el30
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-)