在elisp案例中,如何与字符串进行比较?

Dan*_*Dan 3 emacs elisp

(defun test:case (INPUT)
  (case (quote INPUT)
    ("a" (message "bar"))
    (otherwise (message "foo"))
    ))
(test:case "a")
Run Code Online (Sandbox Code Playgroud)

我希望得到一个案例结构,将"a"与INPUT和调用进行比较(message "foo").我不能让上面的代码调用任何东西,但(message "foo").

我一定做错了什么 ?

Jon*_* O. 7

如果您有Emacs 24,pcase也适用于比较字符串,并且可能比长cond表达式更具可读性.

(defun test-case (input)
  (message
   (pcase input
     ("a" "bar")
     ("b" "baz")
     ("c" "quux")
     (_ "foo"))))
Run Code Online (Sandbox Code Playgroud)

匹配规则pcasecaseML或Haskell中的模式匹配更复杂但也更通用和灵活.


Rob*_*Joy 6

您可能想cond在这种情况下使用。compare caseusing eqlwhich 将比较实际对象。在这种情况下,它们将是两个不同的字符串,因此它始终评估otherwise子句。

使用 cond 您可以指定要使用的相等运算符,例如:

(defun test:case (INPUT)
  (cond
    ((equal INPUT "a") (message "bar"))
    (t (message "foo"))))

(test:case "a")
Run Code Online (Sandbox Code Playgroud)

查看可用的elisp 相等谓词及其行为方式。