Clojure core.match can';我不能在课堂上比赛

Clojure core.match can';我不能在课堂上比赛,clojure,core.match,Clojure,Core.match,当计算这个超级简单的core.match表达式时,我得到: (match [(class "3.14")] [Integer] "Integer" [Double] "Doubler") ; => "Integer" 这怎么可能是正确的,我是否遗漏了core.match的一些基本信息?在此表单上执行宏扩展-1时,我会: => (clojure.core/let [ocr-2751 (class "3.14")] (clojure.core/let [In

当计算这个超级简单的core.match表达式时,我得到:

(match [(class "3.14")]
       [Integer] "Integer"
       [Double] "Doubler")
; => "Integer"
这怎么可能是正确的,我是否遗漏了core.match的一些基本信息?在此表单上执行宏扩展-1时,我会:

=> (clojure.core/let [ocr-2751 (class "3.14")] (clojure.core/let [Integer ocr-2751] "Integer"))

欢迎使用任何指针。

core.match允许您为match子句中的一个值命名,如(从)

在本例中,如果第一个匹配值为1,则在用于生成结果的表达式中,第二个值将可在名称
b
下访问

由于match子句中的任何符号都被解释为将相应值绑定到该名称的指令,因此在您的示例中,名称
整数
被绑定到值
java.lang.String

user> (match [(class "3.14")]
             [Integer] Integer
             [Double] "Doubler")
java.lang.String

user> (match [(class "3.14")]
             [name-to-bind] name-to-bind
             [Double] "Doubler")
java.lang.String
从文档中不清楚是否有方法使用core.match来计算match子句,而不是绑定到它。可以通过匹配字符串来解决此问题,尽管这会降低一些优雅性:

user> (match [(str (class (int 3)))]
             ["class java.lang.Integer"] "Integer"
             ["class java.lang.String"] "String"
             ["class java.lang.Double"] "Double")
"Integer"
user> (match [(str (class "3.14"))]
             ["class java.lang.Integer"] "Integer"
             ["class java.lang.String"] "String"
             ["class java.lang.Double"] "Double")
"String"
user> (match [(str (class 3.14))]
             ["class java.lang.Integer"] "Integer"
             ["class java.lang.String"] "String"
             ["class java.lang.Double"] "Double")
"Double"

正如@Arthur所说,通常
core.match将值绑定到符号。然而,很显然,这是错误的。谁知道呢

无论如何,在匹配之前,将类绑定为
let
中的局部变量,就可以开始了:

(let [Integer java.lang.Integer
      String  java.lang.String]
  (match [(class "3.14")]
         [Integer] "Integer"
         [String] "String"))
如果这不是
(match[(class 3.14)…]
?您没有要匹配
字符串的子句,那么
(class“3.14”)
@Thumbnail的值是:“3.14”而不是仅仅3.14是有意的,我不希望它匹配任何子句。不过,也许可以选择一个比3.14更好的示例:)
(let [Integer java.lang.Integer
      String  java.lang.String]
  (match [(class "3.14")]
         [Integer] "Integer"
         [String] "String"))