畳み込みとは、シーケンスの各要素に関数を繰り返し適用し、その結果を何らかの形で蓄積していくことです。 適用される関数は、2つの仮引数を取ります。現在の累積値と、これから処理する要素です。 そして、新しい累積値に評価される必要があります。
Common Lispでは、この処理をreduce関数で行います。
最も単純な形では、次のようになります。
(reduce #'function-to-apply sequence :initial-value value)
初期値が指定されていることに注目してください。これが、最初の要素を処理するときに関数へ渡される「現在の累積値」になります。
次の例では、リストの数値を初期値10から始めて足し合わせていきます。
(reduce #'+ '(1 2 3 4) :initial-value 10) ; => 20
シーケンスが空の場合、関数は呼び出されることはなく、その式は初期値に評価されます。
Lispの宇宙人Loganは、数値が好きで、整理整頓も好きです。
Loganは、数値の配列を受け取り、2つの配列のペアを作る関数を書くのを手伝ってほしいと頼んできました。1つ目の配列にはすべての奇数、2つ目にはすべての偶数が入ります。
まず、2つの配列のペアと数値を受け取り、その数値が奇数か偶数かに応じて正しい方の配列に入れる関数を作る必要があります。
(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))
Exercismに登録すれば、27個のコンセプト92個の演習、そして本物の人間によるメンタリングとともに、Common Lispを学んでマスターできます。すべて無料です。