[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
flet not undone on lisp nesting error
From: |
Dan Davison |
Subject: |
flet not undone on lisp nesting error |
Date: |
Sat, 27 Feb 2010 15:22:02 -0500 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/23.1 (gnu/linux) |
If I trigger a lisp nesting error with an infinite recursion inside a
let and an flet binding, then the effects of the flet are not undone,
resulting in a change of binding at the top-level. (Code below; the
effects of the let are undone).
However, if I trigger a "normal" error with (error) then both are
undone. Is this peculiar to a circular lisp nesting error, or are there
other classes of error upon which flet will not be undone? What is the
idiomatic way to protect against this (other than not having infinite
recursions in my code)? Do I have to keep copies of the original values
for use in an unwind-protect?
Dan
--8<---------------cut here---------------start------------->8---
(defun g () 'g-orig)
(setq a 'a-orig)
(defun h ()
(let ((a 'a-new))
(flet ((g () 'g-new))
(h))))
(h) ;; <-- Lisp nesting exceeds `max-lisp-eval-depth'
(g) ;; 'g-new !
a ;; a-orig
(defun g () 'g-orig)
(setq a 'a-orig)
(defun f ()
(let ((a 'a-new))
(flet ((g () 'g-new))
(error "Error!"))))
(f)
(g) ;; <-- 'g-orig
a ;; <-- 'a-orig
--8<---------------cut here---------------end--------------->8---
- flet not undone on lisp nesting error,
Dan Davison <=