我从clojuredoc上阅读了有关condp
的文档。在文档中我找到了以下代码:
(condp some [1 2 3 4]
#{0 6 7} :>> inc
#{4 5 9} :>> dec
#{1 2 3} :>> #(+ % 3))
上面代码的结果是3.但我不明白为什么。
如果有人可以帮我搞清楚吗?告诉我代码是如何运行的。
谢谢〜
答案 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
的结果。