在 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
来找到它。
来自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
来找到它。