下面的clojure代码是如何运行的?

下面的clojure代码是如何运行的?,clojure,Clojure,我读了clojuredoc关于condp的文件。在文档中,我找到了以下代码: (condp some[1 2 3 4] #{067}:>>公司 #{4 5 9}:>>dec #{1 2 3}:>>#(+%3)) 上述代码的结果是3。但我不明白为什么 如果有人能帮我弄清楚?告诉我代码是如何运行的 谢谢~在本例中,condp依次在每个测试表达式上尝试谓词some,第二个参数为[1 2 3 4] (一些{067}[1234])失败,返回nil (一些{459}[1234])成功,返回4 condp

我读了clojuredoc关于condp的文件。在文档中,我找到了以下代码:

(condp some[1 2 3 4]
#{067}:>>公司
#{4 5 9}:>>dec
#{1 2 3}:>>#(+%3))

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

如果有人能帮我弄清楚?告诉我代码是如何运行的


谢谢~

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

  • (一些{067}[1234])
    失败,返回
    nil
  • (一些{459}[1234])
    成功,返回
    4

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

当然,让我们从一个简单的例子开始:

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

:the-default-value
生成此测试:

user> (some #{5} [1 2 3 4])
nil
因为测试返回的是falsy(nil是falsy),所以它跳过这个子句,并在最后返回默认值,因为没有更多的子句要检查

如果我们使用通过的测试

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
搜索停止了