(defun test:case (INPUT)
(case (quote INPUT)
("a" (message "bar"))
(otherwise (message "foo"))
))
(test:case "a")
我想获得一个用于比较"a"和输入的案例结构,并调用(message "foo")
。
但我无法让上述代码调用除(message "foo")
之外的任何内容。
我一定做错了什么?
pcase
也可以用于比较字符串,并且可能比冗长的cond
表达式更易读。(defun test-case (input)
(message
(pcase input
("a" "bar")
("b" "baz")
("c" "quux")
(_ "foo"))))
pcase
的匹配规则比case
更加复杂,但也更加通用和灵活,类似于ML或Haskell中的模式匹配。cond
。 case
使用eql
进行比较,它将比较实际的对象。在这种情况下,它们将是两个不同的字符串,因此它总是评估otherwise
子句。(defun test:case (INPUT)
(cond
((equal INPUT "a") (message "bar"))
(t (message "foo"))))
(test:case "a")
(message (if (equal INPUT "a") "bar" "foo"))
在case
的第一个参数中不要加引号,这没有意义。如果给INPUT
加上引号,则评估的结果始终是符号INPUT
,此时case
是无用的,因为永远只有一个情况(在这种情况下是otherwise
情况)。
您总是在测试字符串"a"
和符号INPUT
的相等性(使用eql
,但这不是重点),这总是false,所以使用原始代码您总是会看到消息foo
。
INPUT
来自哪里,最好使用string-equal
。string-equal
会忽略文本属性。 - Tobias