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

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

RE: [External] : Re: Function that changes value of a variable


From: Drew Adams
Subject: RE: [External] : Re: Function that changes value of a variable
Date: Sun, 21 Aug 2022 13:47:47 +0000

> (defun constrain (variable min-n max-n)
>   (cond
>    ((< (symbol-value variable) min-n)
>     (set variable min-n))
>    ((> (symbol-value variable) max-n)
>     (set variable max-n))
>    ((eq (symbol-value variable) t)
>     (set variable 1))
>    ((eq (symbol-value variable) nil)
>     (set variable 0))))

1. Evaluate the initial value just once - bind
   a local variable.
2. Make obvious to readers that the function
   always sets the var (if numberp, t, or nil)
   - put the `set' on the outside.

(defun constrain (variable min-n max-n)
  (let ((val  (symbol-value variable)))
    (when (or (numberp val) (memq val '(nil t))) 
      (set variable (if (numberp val)
                        (if (< val min-n)
                            min-n
                          (min max-n val))
                      (if val 1 0))))))

3. Your function doesn't change the value, if
   if not a number, t, or nil.  Is that what
   you really want?  If not:

(defun constrain (variable min-n max-n)
  (let ((val  (symbol-value variable)))
    (unless (or (numberp val) (memq val '(nil t)))
      (error "Oops?! `%s' is %S" variable val))
    (set variable (if (numberp val)
                      (if (< val min-n)
                          min-n
                        (min max-n val))
                    (if val 1 0)))))

<<attachment: winmail.dat>>


reply via email to

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