kme*_*lvn 4 clojure core.match
当评估这个超级简单的core.match表达式时,我得到:
(match [(class "3.14")]
[Integer] "Integer"
[Double] "Doubler")
; => "Integer"
Run Code Online (Sandbox Code Playgroud)
这怎么可能是正确的,我错过了关于core.match的基本内容吗?在此表单上执行macroexpand-1可以让我:
=> (clojure.core/let [ocr-2751 (class "3.14")] (clojure.core/let [Integer ocr-2751] "Integer"))
Run Code Online (Sandbox Code Playgroud)
任何指针赞赏.
就像@Arthur所说,通常core.match会将值绑定到符号.然而,显然,它首先尝试与当地人匹配.谁知道?
无论如何,let在匹配之前将类绑定为本地人,你很高兴:
(let [Integer java.lang.Integer
String java.lang.String]
(match [(class "3.14")]
[Integer] "Integer"
[String] "String"))
Run Code Online (Sandbox Code Playgroud)
core.match允许您为匹配子句中的一个值指定名称(如示例所示)
(let [x 1 y 2]
(match [x y]
[1 b] b
[a 2] a
:else nil))
Run Code Online (Sandbox Code Playgroud)
在此示例中,如果第一个匹配值为1,则在用于生成结果的表达式中,可以在名称下访问第二个值b.
因为match子句中的任何符号都被解释为将相应值绑定到该名称的指令,所以在您的情况下,名称Integer绑定到该值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
Run Code Online (Sandbox Code Playgroud)
从文档中可以看出,有一种方法可以使用core.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"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
209 次 |
| 最近记录: |