[英]How does the following clojure code run?
我從clojuredoc上讀到了關於condp
的文檔。 在文檔中我找到了以下代碼:
(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
構建此測試:
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
並且搜索停止。
在這個例子中, 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
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.