help-gnu-emacs
[Top][All Lists]
Advanced

[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---




reply via email to

[Prev in Thread] Current Thread [Next in Thread]