Emacs 在elisp中,如何与字符串进行比较?
我希望得到一个案例结构,将“a”与输入进行比较,并调用Emacs 在elisp中,如何与字符串进行比较?,emacs,elisp,Emacs,Elisp,我希望得到一个案例结构,将“a”与输入进行比较,并调用(message“foo”)。 我无法让上面的代码调用任何东西,只能调用(消息“foo”) 我一定是做错了什么?在这种情况下,您可能想使用cond案例使用将比较实际对象的eql进行比较。在这种情况下,它们将是两个不同的字符串,因此它总是计算否则子句 使用cond可以指定要使用的相等运算符,例如: (defun test:case (INPUT) (case (quote INPUT) ("a" (message "bar"))
(message“foo”)
。
我无法让上面的代码调用任何东西,只能调用(消息“foo”)
我一定是做错了什么?在这种情况下,您可能想使用
cond
<代码>案例使用将比较实际对象的eql
进行比较。在这种情况下,它们将是两个不同的字符串,因此它总是计算否则
子句
使用cond可以指定要使用的相等运算符,例如:
(defun test:case (INPUT)
(case (quote INPUT)
("a" (message "bar"))
(otherwise (message "foo"))
))
(test:case "a")
看一看可用的组件以及它们的行为
(消息(if(相等输入“a”)“bar”“foo”)
案例
中引用第一个参数-这毫无意义。如果您引用INPUT
,则求值结果为符号INPUT
,始终。在这种情况下,case
是无用的,因为从来没有超过一个case(在这种情况下,否则
case)
您总是测试字符串“a”
和符号输入的相等性(使用eql
,但这不是重点)。这总是错误的,因此对于原始代码,您总是会看到消息foo
如果您有Emacs 24,
pcase
也可以用于比较字符串,并且可能比长的cond
表达式更可读
(defun test:case (INPUT)
(cond
((equal INPUT "a") (message "bar"))
(t (message "foo"))))
(test:case "a")
pcase
的匹配规则比case
更为复杂,但也更为通用和灵活,类似于ML或Haskell中的模式匹配。如果您不知道INPUT
的来源,最好使用string equal
。文本属性被string equal
忽略。
(defun test-case (input)
(message
(pcase input
("a" "bar")
("b" "baz")
("c" "quux")
(_ "foo"))))