I want to ask a second question to the user depending on the answer to the first one.
(defun something (a b)
(interactive
(list
(read-number "First num: ")
(read-number "Second num: ")))
(message "a is %s and b is %s" a b))
So I need a way to test the entry values :
(defun something-else (a &optional b)
(interactive
(list
(read-number "First num: ")
(if (< a 2)
(read-number "Second num: "))))
(message "a is %s" a))
But
if: Symbol's value as variable is void: a
Question : How can I use interactive in a really interactive way?
Interpret the form in interactive as kind of subprogram which delivers the list of argument values as return value.
You can have local variables there with the help of a let-like form.
(defun something-else (a &optional b)
(interactive
(let* ((a-local (read-number "First num: "))
(b-local (when (< a-local 2)
(read-number "Second num: "))))
(list a-local b-local)))
(message "a is %s, b is %s" a b))
In the above example a-local and b-local are variables with names of your choice wich are local to the enclosing let*-form. The star in let* means that the evaluated expression (read-number "First num: ") for a-local is assigned to a-local before the expression (when (< a-local 2) (read-number "Second num: ")) for b-local is evaluated.
(defun xtest (a &optional b)
(interactive
(let (a b)
(setq a (read-number "First: "))
(if (< a 2)
(setq b (read-number "Second: ")))
(list a b)))
(message "a is %s b is %s" a b))
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With