行列を操作する 3 つの関数があるとします。
(defn flip [matrix] (...))
(defn rotate [matrix] (...))
(defn inc-all [matrix] (...))
各関数が正しく機能するためには、int のベクトルのベクトル (各内部ベクトルは同じ長さ) が必要であると想像してください。
マトリックス データが正しい形式であることを検証する assert-matrix 関数を提供できます。
(defn assert-matrix [matrix] (...) )
ただし、flip 関数 (たとえば) には、関数に渡されたデータが検証されているかどうかを知る方法がありません (関数に渡す前にデータを検証する必要があるかどうかは、完全にユーザー次第です)。したがって、正確性を保証するには、flip を次のように定義する必要があります。
(defn flip [matrix]
(assert-matrix matrix)
(...))
ここには 2 つの主な問題があります。
- マトリックス関数が呼び出されるたびに assert-matrix を呼び出し続ける必要があるのは非効率的です。
- マトリックス関数を作成するときはいつでも、assert-matrix を呼び出すことを覚えておく必要があります。これを繰り返すのは退屈なので、忘れてしまう可能性があります。
オブジェクト指向言語では、インスタンスの作成時にコンストラクター引数の有効性をチェックするコンストラクターを使用して、Matrix という名前のクラスを作成します。クラスが初期化されたときにデータが検証されたことを確信できるため、メソッドが有効性を再チェックする必要はありません。
これは Clojure でどのように達成されるでしょうか?