(これは、など、私はこれが条件文の束を行うことができます知っています。スタイルについての質問ですマルチメソッド)マルチシグネチャ関数内のすべての実装に共通のバインディングを設定することはできますか?次の関数で
、null-vector
は、各実装に定義されています。どのように私は一度全体の機能のためにそれを設定することができますか?一般的に、すべての実装に共通のバインディングを設定することは可能ですか?
null-vector
には「引数」が必要なのでクロージャは機能しませんが、私はpartial
と考えています。しかし、それでもsizeパラメータの計算が必要です。明らかにコードを繰り返さないようにしたいと思います。
(defn path
"Returns a lazy sequence of vectors representing a monotonic path
walked over coll in n-dimensional space, where n is the cardinality
of coll's alphabet."
([coll]
(let [alphabet (set coll)
cardinality (count alphabet)
alpha-map (apply hash-map (interleave alphabet (range cardinality)))
null-vector (vec (repeat cardinality 0))]
(path coll null-vector alpha-map)))
([coll alpha-map]
(let [null-vector (vec (repeat (count (keys alpha-map)) 0))]
(path coll null-vector alpha-map)))
([coll origin alpha-map]
(let [null-vector (vec (repeat (count origin) 0))
unit-vector #(assoc null-vector (alpha-map %) 1)
sum-vectors #(vec (map + %1 %2))]
(reductions sum-vectors origin (map unit-vector coll)))))