我读了condpclojuredoc 的文档.在文档中我找到了以下代码:
(condp some [1 2 3 4]
#{0 6 7} :>> inc
#{4 5 9} :>> dec
#{1 2 3} :>> #(+ % 3))
上面代码的结果是3.但我不明白为什么.
如果有人可以帮助我解决这个问题?告诉我代码是如何运行的.
谢谢〜
当然,让我们从一个更简单的案例开始:
user> (condp some [1 2 3 4]
#{5} :>> inc
:the-default-value)
:the-default-value
Run Code Online (Sandbox Code Playgroud)
构建此测试:
user> (some #{5} [1 2 3 4])
nil
Run Code Online (Sandbox Code Playgroud)
因为测试返回了一些假的(nil是假的)它跳过这个子句并在结尾返回默认值,因为没有更多的子句要检查.
如果我们使用通过的测试
user> (condp some [1 2 3 4] #{1} :>> inc :the-default-value)
2
Run Code Online (Sandbox Code Playgroud)
它构建了测试:
user> (some #{1} [1 2 3 4])
1
Run Code Online (Sandbox Code Playgroud)
这导致了一些真实的东西(1)因此搜索停止并且该子句被接受.该:>>告诉condp参加测试的结果,并把它传递给下面的功能,在这种情况下inc.导致2
所以在最初的例子中,第一个测试是:
(some #{0 6 7} [1 2 3 4])
Run Code Online (Sandbox Code Playgroud)
这是nil所以这种情况是不能接受的,并继续搜索.第二个测试是:
user> (some #{4 5 9} [1 2 3 4])
4
Run Code Online (Sandbox Code Playgroud)
这导致truthy值为4,因此它dec在值4上调用提供的函数:
user> (dec 4)
3
Run Code Online (Sandbox Code Playgroud)
并且搜索停止.
在此示例中,依次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.