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

3
(defun test:case (INPUT)
  (case (quote INPUT)
    ("a" (message "bar"))
    (otherwise (message "foo"))
    ))
(test:case "a")

我想获得一个用于比较"a"和输入的案例结构,并调用(message "foo")

但我无法让上述代码调用除(message "foo")之外的任何内容。

我一定做错了什么?

3个回答

9
如果你使用的是Emacs 24,pcase也可以用于比较字符串,并且可能比冗长的cond表达式更易读。
(defun test-case (input)
  (message
   (pcase input
     ("a" "bar")
     ("b" "baz")
     ("c" "quux")
     (_ "foo"))))
pcase的匹配规则比case更加复杂,但也更加通用和灵活,类似于ML或Haskell中的模式匹配。

6
在这种情况下,您可能希望使用condcase使用eql进行比较,它将比较实际的对象。在这种情况下,它们将是两个不同的字符串,因此它总是评估otherwise子句。
使用cond,您可以指定要使用哪个等于运算符,例如:
(defun test:case (INPUT)
  (cond
    ((equal INPUT "a") (message "bar"))
    (t (message "foo"))))

(test:case "a")

请查看可用的elisp等式断言以及它们的行为。 (链接)

如果你不知道INPUT来自哪里,最好使用string-equalstring-equal会忽略文本属性。 - Tobias

2
  1. (message (if (equal INPUT "a") "bar" "foo"))

  2. case的第一个参数中不要加引号,这没有意义。如果给INPUT加上引号,则评估的结果始终是符号INPUT,此时case是无用的,因为永远只有一个情况(在这种情况下是otherwise情况)。

    您总是在测试字符串"a"和符号INPUT的相等性(使用eql,但这不是重点),这总是false,所以使用原始代码您总是会看到消息foo


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接