縮減是指對序列中的每個元素重複套用一個函式,並以某種方式累積結果。 所套用的函式接受兩個參數:目前的累積值,以及要處理的項目。 它的求值結果必須是新的累積值。
在 Common Lisp 中,這個過程是透過reduce函式完成的。
最簡單的形式如下:
(reduce #'function-to-apply sequence :initial-value value)
請注意,這裡提供了初始值,這會是處理第一個元素時傳入函式的「目前的累積值」。
以下範例會將陣列中的數字相加,並從初始值 10 開始:
(reduce #'+ '(1 2 3 4) :initial-value 10) ; => 20
請注意,如果序列是空的,函式永遠不會被呼叫,而這個形式會求值為 initial-value。
Lisp 外星人 Logan 喜歡數字,也喜歡整理歸類。
他們想請你幫忙寫一個函式,這個函式會接收一串數字,並產生一對陣列:第一個包含所有奇數,第二個包含所有偶數。
首先,你需要建立一個函式,接收兩個陣列組成的一對和一個數字,並根據這個數字是奇數還是偶數,將它放進正確的子陣列中:
(categorize-number '((1) . (2)) 23) ; => ((23 1) . (2))
(categorize-number '((1) . (2)) 42) ; => ((1) . (42 2))
現在,利用你剛才建立的函式,你可以再寫一個函式,接收一串數字,並像上面那樣將它們分類:
(partition-numbers '(1 2 3 4)) ; => ((3 1) . (4 2))
(partition-numbers '(42 31 24 13)) ; => ((13 31) . (24 42))