[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
What is this RESTART kludge?
- To: Fahlman at CMU-20C
- Subject: What is this RESTART kludge?
- From: Alan Bawden <ALAN at MIT-MC>
- Date: Thu, 30 Sep 1982 06:23:00 -0000
- Cc: Common-Lisp at SU-AI
Date: Wednesday, 29 September 1982 20:53-EDT
From: Scott E. Fahlman <Fahlman at Cmu-20c>
For use in error recovery, it is important to have the implicit BLOCK
surround the body, but NOT the variable initializations. Re-doing the
inits is hardly ever what you want to do, not to mention the fact that
this would tend to clobber any repairs the user has made to variable
values.
Can you provide examples to back up the claim that "re-doing the inits is
hardly ever what you want to do"? Suppose:
(defun foo (l &optional (y (1+ (car l))))
...
(when (oddp (car l))
(cerror :bad-argument "Odd car: ~S" l)
(restart foo))
...)
Can you really argue that it is wrong to recompute the value of Y in GENERAL if
it wasn't given by the caller and the list L has been given a new car?
(Granted you can probably construct an INSTANCE in which it is wrong to
recompute the value of Y.)
A good reason to make the restart redo the inits is that it would otherwise be
impossible for the programmer to ask for that behavior, whereas if he doesn't
want them redone he can always explicitly add a restart block around the body
of his defun. Given that in general you are going to have to think about this
problem when you write a RESTART, I think it best to give the option of having
it either way by having the built in restart do something that would be
impossible to do otherwise.
[Actually I think this is also a fairly good argument against the whole restart
kludge. No matter what we do here people are going to be fooled into
believing that RESTART is something that it isn't.]