0

来自示例代码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
4

1 回答 1

1

你可以; 或者至少这是我通过阅读.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
            . . .]

该文档还包含以下内容:

. . . 可选地,可以采用未包含在向量中的单个 var,然后问题不需要包含在向量中。

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


编辑:实际上,它确实在顶部的该页面上明确说明您可以匹配未包装的值。match x您可以通过在该页面上搜索找到它。

于 2019-08-09T16:08:06.007 回答