以下clojure代码如何运行?

时间:2014-03-19 00:58:25

标签: clojure

我从clojuredoc上阅读了有关condp的文档。在文档中我找到了以下代码:

(condp some [1 2 3 4] #{0 6 7} :>> inc #{4 5 9} :>> dec #{1 2 3} :>> #(+ % 3))

上面代码的结果是3.但我不明白为什么。

如果有人可以帮我搞清楚吗?告诉我代码是如何运行的。

谢谢〜

2 个答案:

答案 0 :(得分:8)

当然,让我们从更简单的案例开始:

user> (condp some [1 2 3 4] 
             #{5}  :>> inc 
             :the-default-value)

:the-default-value

构建此测试:

user> (some #{5} [1 2 3 4])
nil

因为测试返回了一些虚假的东西(nil是假的),它会跳过这个子句并在结尾处返回默认值,因为没有更多的子句需要检查。

如果我们使用通过的测试

user> (condp some [1 2 3 4] #{1}  :>> inc :the-default-value)
2

它构建了测试:

user> (some #{1} [1 2 3 4])
1

这导致了一些真实的东西(1),因此搜索停止并且该子句被接受。 :>>告诉condp获取测试结果并将其传递给后面的函数,在本例中为inc。导致2

所以在最初的例子中,第一个测试是:

(some #{0 6 7} [1 2 3 4]) 

哪个是nil所以不接受此案例并继续搜索。第二个测试是:

user> (some #{4 5 9} [1 2 3 4])
4

这导致truthy值为4,因此它在值4上调用提供的函数dec

user> (dec 4) 
3

,搜索停止。

答案 1 :(得分:5)

在此示例中,condp依次在每个测试表达式上尝试谓词some,其中[1 2 3 4]作为第二个参数。

  • (some #{0 6 7} [1 2 3 4])失败,返回nil
  • (some #{4 5 9} [1 2 3 4])成功,返回4

condp然后返回将对应于后续测试表达式的函数(在本例中为dec)应用于测试值4的结果。