簡體   English   中英

以下clojure代碼如何運行?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM