我是clojure的新手,我试图尽可能多地理解,但文档是如此模糊
当你有一个功能时
(fn [_ {:keys [kind]}] kind)
我的理解是该函数采用矢量图,但只想访问第二个参数{:keys.....
指定的密钥正确吗?
然后我传递给这个函数多少个参数? 1还是2?
是矢量吗? {:kind 1:dog 2}或矢量键值(:kind {....})?
答案 0 :(得分:2)
您的函数需要两个参数(具有arity 2)。第一个参数的名称是_
(下划线),它通常表示未使用的变量。 (它是一个有效的变量名,它会被绑定,但按照惯例,它不会被使用,所以它表示占位符。)
第二个参数是destructured - {:keys [kind]}
,这意味着期望值是一个映射,并且作为解构的结果,名为kind
的变量将绑定到key {{1}的值实际参数(如果没有这样的键,则为nil。)
所以你的函数需要两个参数,第一个被忽略,第二个必须是带有键:kind
的映射(也许是其他键,但它们会被忽略。)
:kind
P.S。我再次看了你的问题,我意识到你的困惑可能来自哪里。语法((fn [_ {:keys [kind]}] kind) :foo {:kind :bar, :color :green})
=> :bar
看起来像一个包含第二个位置的地图的向量。这是正确的,但在Clojure中并不是一个矢量符号,这意味着你可以在那里粘贴一个矢量。 Clojure用户使用方括号来获取函数的形式参数列表 - 它是Clojure中使用矢量文字的常见模式的一部分,可以预期序列。事实上,与其他Lisps相比,您需要在许多地方仔细使用引号以避免将列表解释为函数应用程序表单,这实际上非常方便。但这是一个题外话,重要的一点是[_ {:kind [kind]}]
(和fn
)方括号表示参数列表,并不代表参数是矢量。
答案 1 :(得分:0)
让我们给这个函数命名:
(defn splot [_ {:keys [kind]}] kind)
这是
的简写(defn splot [_ {kind :kind}] kind)
两个(位置)参数的函数:
_
,通常未使用,:kind
条目绑定到本地kind
; 然后返回绑定到kind
的任何内容。
失败的绑定返回nil
。
例如:
(splot "..." 6) ;nil
(splot "..." {}) ;nil
(splot "..." {:kind 77}) ;77
答案 2 :(得分:-1)
通过在repl中尝试查看给定函数语法的功能,这是非常简单的。
+user=> ((fn [_ {:keys [kind]}] kind) (:kind {}))
ArityException Wrong number of args (1) passed to: user/eval1/fn--3 clojure.lang.AFn.throwArity (AFn.java:429)
+user=> ((fn [_ {:keys [kind]}] kind) nil (:kind {}))
nil
+user=> ((fn [_ {:keys [kind]}] kind) nil {:kind 1})
1
{:keys []}
解构语法为described pretty comprehensively in the official docs,描述了绑定来自hashmap的值的简写。在Clojure中{}
是一个散列图,[]
是一个向量,这些是不可互换的。 (:foo m)
调用get
查找:foo
中密钥m
下的值。 (let [{:keys [foo]} {:foo "bar"}] ...)
和(let [foo (:foo {:foo "bar"})] ...)
相同。