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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: eval-last-sexp in other window


From: Pascal J. Bourguignon
Subject: Re: eval-last-sexp in other window
Date: Wed, 01 Apr 2009 11:09:10 +0200
User-agent: Gnus/5.101 (Gnus v5.10.10) Emacs/22.2 (gnu/linux)

Bob Babcock <wssddc@nospam.gis.net> writes:

> pjb@informatimago.com (Pascal J. Bourguignon) wrote in
> news:87bpri9lhd.fsf@galatea.local: 
>
>>> (defun last-sexp-other-window()
>>> "Get last sexp and run it in other window.
>>> If there isn't another window, use current window."
>>>   (interactive)
>>>   (setq ow-sexp (preceding-sexp))
>>>   (other-window 1) (eval ow-sexp) (other-window -1) )
>> 
>> At the very least, use let, not setq!
>> 
>> (defun last-sexp-other-window()
>>  "Get last sexp and run it in other window.
>> If there isn't another window, use current window."
>>    (interactive)
>>    (let ((ow-sexp (preceding-sexp)))
>>       (other-window 1)
>>       (eval ow-sexp)
>>       (other-window -1)))
>
> I will admit that I was surprised when setq worked in this context.
> Perhaps there are cases where setq would fail?

For example in this case:

(defun evaluate-sexps-in-other-windows ()
  (let ((ow-sexp 0)) ; count the sexps we evaluate.
     (while (< (point) (max-point))
        (incf ow-sexp)
        (forward-sexp)
        (last-sexp-other-window))
    ow-sexp))


Remember that in emacs lisp, all the bindings are special (dynamic).
When you use setq on a variable for which you don't provide a local
binding, you are actually destroying the binding of the caller (or the
caller of the caller...), therefore introducing bugs in unrelated code.

In some occasions it might be easier to use setq/setf, but do it only
on a locally rebound variable:

  (let ((var init-value))
     (setf var (f1 var))
     (loop 
        while (condp var)
        do (setf var (f2 var)))
     (setf var (f3 var))
     var)


[ which, in the case of loop can also be rewritten as:

    (loop
       with var = init-value
       initially (setf var (f1 var))
       while (condp var)
       do (setf var (f2 var))
       finally (return (f3 var)))
].



But it may be clearer to write it as:

  (f3 (fix (function f2) (function condp) (f1 init-value)))


with:

(defun fix (fun predicate value)
  (if (funcall predicate value)
     (fix fun predicate (funcall fun value))
     value))


-- 
__Pascal Bourguignon__


reply via email to

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