以下clojure代码如何运行?

zcf*_*1st 2 clojure

我读了condpclojuredoc 的文档.在文档中我找到了以下代码:

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

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

如果有人可以帮助我解决这个问题?告诉我代码是如何运行的.

谢谢〜

Art*_*ldt 8

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

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)

并且搜索停止.


Thu*_*ail 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.