在 clojure 中,为什么 core.match 地图在向量中?

in clojure, why core.match a map inside a vector?

来自core.match的示例代码,url:https://github.com/clojure/core.match/wiki/Basic-usage

(let [x {:a 1 :b 1}]
  (match [x]
    [{:a _ :b 2}] :a0
    [{:a 1 :b 1}] :a1
    [{:c 3 :d _ :e 4}] :a2
    :else nil))

;=> :a1

为什么我们只能匹配一个“x”?为什么我们不能这样做?

(let [x {:a 1 :b 1}]
  (match x
    {:a _ :b 2} :a0
    {:a 1 :b 1} :a1
    {:c 3 :d _ :e 4} :a2
    :else nil))

;=> :a1

可以;或者至少这是我从阅读 the source and documentation of match.

中推断出来的

match 的来源以以下行开头:

(defmacro match
  . . .
  [vars & clauses]
  (let [[vars clauses]
        (if (vector? vars)  ; If it's a vector...
          [vars clauses]    ;  leave it alone,
          [(vector vars)    ;  else wrap it in a vector
            . . .]

文档还包含位:

. . . Optionally may take a single var not wrapped in a vector, questions then need not be wrapped in a vector.

那么他们为什么要展示带有向量的示例?可能是为了语法的一致性。这可能有助于理解像这样的简单、基本的概述。在使用和不使用矢量之间来回切换将需要解释何时需要矢量,这会偏离页面的要点。


编辑:实际上,它在顶部 explicitly explain on that page 可以匹配未包装的值。您可以通过在该页面上搜索 match x 来找到它。