我從clojuredoc讀取關於condp
的文檔。而在doc我發現下面的代碼:以下clojure代碼如何運行?
(condp some [1 2 3 4] #{0 6 7} :>> inc #{4 5 9} :>> dec #{1 2 3} :>> #(+ % 3))
上述代碼的結果是3,但我不明白爲什麼。
如果有人能幫我弄明白嗎?告訴我代碼如何運行。
謝謝〜
我從clojuredoc讀取關於condp
的文檔。而在doc我發現下面的代碼:以下clojure代碼如何運行?
(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
由於測試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
並停止搜索。
在這個例子中,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
的結果。
謝謝你的幫助〜 – zcfrank1st
謝謝!現在我知道它是如何工作的。 – zcfrank1st