2014-03-19 34 views
2

我從clojuredoc讀取關於condp的文檔。而在doc我發現下面的代碼:以下clojure代碼如何運行?

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

上述代碼的結果是3,但我不明白爲什麼。

如果有人能幫我弄明白嗎?告訴我代碼如何運行。

謝謝〜

回答

8

好,讓我們從一個簡單的情況:

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

:the-default-value 

建立此測試:

user> (some #{5} [1 2 3 4]) 
nil 

由於測試falsy返回的東西(零是falsy)它跳過這一條款,並返回默認值最後,因爲沒有更多的條款要檢查。

如果我們使用經過

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

它建立了測試的測試:

user> (some #{1} [1 2 3 4]) 
1 

導致一些truthy(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 

並停止搜索。

+0

謝謝!現在我知道它是如何工作的。 – zcfrank1st

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的結果。

+0

謝謝你的幫助〜 – zcfrank1st