基本的なリスト操作を実装しましょう。
関数型言語では、lengthやmap、reduceのようなリスト操作がよく使われます。既存の関数を使わずに、一連の基本的なリスト操作を実装してみましょう。
実装する操作の正確な数や名前は、既存の名前との衝突を避けるため、トラックによって異なります。ただし、一般的には次のような操作を実装します。
append(2つのリストが与えられたとき、2つ目のリストのすべての要素を1つ目のリストの末尾に追加します)。concatenate(一連のリストが与えられたとき、すべてのリストの要素を1つの平坦なリストにまとめます)。filter(述語とリストが与えられたとき、predicate(item)がTrueになるすべての要素のリストを返します)。length(リストが与えられたとき、その中にある要素の総数を返します)。map(関数とリストが与えられたとき、すべての要素にfunction(item)を適用した結果のリストを返します)。foldl(関数・リスト・初期アキュムレーターが与えられたとき、各要素を左からアキュムレーターに畳み込みます(reduce))。foldr(関数・リスト・初期アキュムレーターが与えられたとき、各要素を右からアキュムレーターに畳み込みます(reduce))。reverse(リストが与えられたとき、元の要素をすべて逆順に並べたリストを返します)。なお、畳み込み関数(foldl、foldr)に引数を渡す順序は重要です。
上記の指示は、すべての言語のトラックで一貫性を保つために、共有リポジトリと同期されています。 この付録では、Clojureトラックの目標によりよく沿うように、追加の説明を加えたり、必要に応じて指示を変更したりしています。
Clojureトラックのこの演習では、テストが示すとおり、入力と出力の両方がベクターであると仮定してください。 余力があれば、途中のステップにリストを使わない方法をどう実装するか考えてみましょう。
似た機能を持つ既存のClojure組み込み関数を再利用しないことが大切です。そうしてしまうと、この演習が意図する学習上の価値が損なわれるからです。
clojure.core名前空間で避けるべき主な関数には、into、concat、cat、lazy-cat、mapcat、flatten、filter、filterv、remove、count、map、mapv、reduce、transduce、reverse、rseqがあります。
任意の目標は、さらに挑戦してみたい人に向けたもので、メインの目標をすでに達成していることを前提に設計されています。
次のことを前提とした方法を考えて、テストをパスしてみましょう。
これを公開することにした場合は、リストを使う任意の目標に対応していることを示すコメントを必ず入れてください。 docstringの更新も忘れないでください!