On Sun, Mar 6, 2011 at 1:32 PM, rusi
<rustompmody@gmail.com> wrote:
On Mar 6, 4:21 am, PJ Weisberg <p...@irregularexpressions.net> wrote:
> On Sat, Mar 5, 2011 at 2:17 PM, Tim X <t...@nospam.dev.null> wrote:
> > The way I usually deal with this is to either reset the variable in the
> > scratch buffer i.e.
>
> > (setq var nil)
>
> > then when I re-evaluate the buffer, var will be set if it is in a defvar
> > statement.
>
> Not true. If the variable is set at all, even to nil, defvar respects
> it and doesn't overwrite it with the default. Otherwise putting
> something like (setq flyspell-persistent-highlight nil) in your .emacs
> file would have no effect.
>
> The way to actually do that is:
>
> (makunbound 'var)
>
> -PJ
This points out the real problem -- elisp is not a functional
language.
In (pure) functional languages the pattern (for loading) is to 'clean
the slate' and then load. IOW everything -- variable, function, type
-- that was defined in this module is first 'makunbounded' and then
the module is loaded.
It would certainly be worthwhile to have such a feature in emacs. I
guess its not easy to do unless one has available the pair-list of the
form: ((var defined-in-file)...).
Another problem that would probably muddy the waters are macros...
(defmacro replacement-def (sym val &rest args)
`(setq ,sym ,val))
(defun force-eval-buffer (&optional buf)
(interactive)
(eval-buffer buf) ; define variables properly at least once
(let ((func-alist (mapcar (lambda (func)
(cons func (symbol-function func)))
'(defvar defcustom))))
(unwind-protect
(progn
(mapc (lambda (func-cons)
(fset (car func-cons) (symbol-function 'replacement-def)))
func-alist)
(eval-buffer buf))
(mapcar (lambda (func-cons)
(fset (car func-cons) (cdr func-cons)))
func-alist))))
I'm not sure if this introduces any problems.