clojure map,什么是%2和%1

时间:2015-10-02 04:01:07

标签: clojure functional-programming

我正在做一个特殊情况,这是一个问题。

(true?  (__ :a {:a nil :b 2}))

答案是:

 #(nil?(%2 %1 0))

但我无法得到它。 %2%1 0在这做什么? 特别是那个0做了什么?

你可以帮我解释一下吗? 感谢

2 个答案:

答案 0 :(得分:7)

#()格式是定义匿名函数的简写。 例如:#(+ %1 %2)相当于(fn [a,b] (+ a b))

这里%2%1分别代表函数的第二个和第一个参数。

答案 1 :(得分:2)

如前所述, <{1}}是

的糖

#(nil? (%2 %1 0))

关于这一行的一些注意事项:

    clo中的
  1. 哈希映射支持函数语义,因此使用映射代替函数与调用(fn [a-map a-key] (nil? (a-map a-key 0)))函数
  2. 相同

    get等于(a-map a-key default-value)

    1. 零作为默认密钥添加,以区分密钥的绝对值与密钥的 (get a-map a-key default-value)。例如:
    2. nil生成(get {:b 1} :a)(因为地图中没有nil键)

      :a也会生成(get {:a nil :b 1} :a)(因为nil的值为nil

      使用默认值时会消除这种不确定性:

      :a =&gt; 0

      (get {:b 1} :a 0) =&gt;零

      1. 示例中的地图具有数值,因此使用零作为默认值可能会导致更大的混乱(嗯,取决于用例。有时零正是您在此需要的)。通常使用一些不存在的值,例如像(get {:a nil :b 1} :a 0)
      2. 这样的关键字

        但在这种情况下,您可能希望以这种方式完成任务:

        :not-found

        因为他们显然希望您检查地图中是否存在密钥(true? (#(contains? %2 %1) :a {:a nil :b 2}))