下面的clojure代码是如何运行的?
我读了clojuredoc关于condp的文件。在文档中,我找到了以下代码:下面的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
(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
搜索停止了