&引用;Can';“不要让限定名”;使用clojure.core.match时

&引用;Can';“不要让限定名”;使用clojure.core.match时,clojure,pattern-matching,clojure-core.match,Clojure,Pattern Matching,Clojure Core.match,我正在使用并看到以下错误: 不能让限定名 我的代码类似于: (match [msg-type] [MsgType/TYPE_1] (do-type-1-thing) [MsgType/TYPE_2] (do-type-2-thing)) 其中MsgType/TYPE_1来自Java类: public class MsgType { public static final String TYPE_1 = "1"; public static final

我正在使用并看到以下错误:

不能让限定名

我的代码类似于:

(match [msg-type]
       [MsgType/TYPE_1] (do-type-1-thing)
       [MsgType/TYPE_2] (do-type-2-thing))
其中
MsgType/TYPE_1
来自Java类:

public class MsgType {
    public static final String TYPE_1 = "1";
    public static final String TYPE_2 = "2";
}
这个错误是什么意思?我该如何解决它呢?

这个问题似乎存在,尽管我对它的理解不深,因为我对宏还很陌生

最初,我希望使用而不是
match
将证明是一种可行的解决方法:

(case msg-type
      MsgType/TYPE_1 (do-type-1-thing)
      MsgType/TYPE_2 (do-type-2-thing))
但是,上述方法不起作用<代码>大小写匹配符号
MsgType/TYPE\u n
,而不是该符号的求值

到目前为止,我发现最好的方法是将输入的值转换为关键字并进行匹配:

(def type->keyword
     {MsgType/TYPE_1 :type-1
      MsgType/TYPE_2 :type-2})

(case (type->keyword msg-type)
      :type-1 (do-type-1-thing)
      :type-2 (do-type-2-thing))

一般来说,模式匹配不是比较一个变量和另一个变量的正确工具。模式应该是文本,例如
1
:a
,解构要绑定的表达式或变量。例如,以这个表达式为例:

(let [a 1
      b 2]
  (match [2]
    [a] "It matched A"
    [b] "It matched B"))
由于变量
B
等于2,您可能希望它生成“it matched B”,但实际上它将值2绑定到名为
a
的新变量,并生成“it matched a”

我想你在找
condp=
。这基本上就是你所希望的情况

(condp = msg-type
  MsgType/TYPE_1 (do-type-1-thing)
  MsgType/TYPE_2 (do-type-2-thing))