Emacs Lisp:如何使用交互式(对于条件参数)?

yPh*_*hil 4 elisp

我想根据第一个问题的答案向用户问第二个问题。

(defun something (a b)
  (interactive
   (list
    (read-number "First num: ")
    (read-number "Second num: ")))
  (message "a is %s and b is %s" a b))
Run Code Online (Sandbox Code Playgroud)

所以我需要一种方法来测试条目值:

(defun something-else (a &optional b)
  (interactive
   (list
    (read-number "First num: ")
    (if (< a 2)
        (read-number "Second num: "))))
  (message "a is %s" a))
Run Code Online (Sandbox Code Playgroud)

if: Symbol's value as variable is void: a
Run Code Online (Sandbox Code Playgroud)

interactive问题:如何以真正互动的方式使用?

Tob*_*ias 6

将表单解释为interactive一种子程序,它将参数值列表作为返回值传递。您可以在类似形式的帮助下在那里拥有局部变量let

(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))
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,a-localb-local是具有您选择的名称的变量,它们是封闭 let*形式的本地变量。星号 inlet*表示在评估表达式(read-number "First num: ")for之前a-local先将评估的a-local表达式(when (< a-local 2) (read-number "Second num: "))for赋值。b-local