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

Emacs 在elisp中,如何与字符串进行比较?,emacs,elisp,Emacs,Elisp,我希望得到一个案例结构,将“a”与输入进行比较,并调用(message“foo”)。 我无法让上面的代码调用任何东西,只能调用(消息“foo”) 我一定是做错了什么?在这种情况下,您可能想使用cond案例使用将比较实际对象的eql进行比较。在这种情况下,它们将是两个不同的字符串,因此它总是计算否则子句 使用cond可以指定要使用的相等运算符,例如: (defun test:case (INPUT) (case (quote INPUT) ("a" (message "bar"))

我希望得到一个案例结构,将“a”与输入进行比较,并调用
(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"))))