5

私はClojureに非常に慣れていないので、コードの1つを移植して学習しようとしていますが、現在次の問題で立ち往生しています:

=> lineup
{:c b4|b4|b3|b3, :sg b6|b11|b6|b6, :sf b7|b5|b5|b5, :pf b3|b1|b1|b1, :pg b10|b10|b11|b10}
=> (validate-lineup lineup)
ArityException Wrong number of args (0) passed to: PersistentHashMap  clojure.lang.AFn.throwArity (AFn.java:437)

そして、ここに関数があります:

(defn validate-lineup [lineup]
    (map (fn [position]
        ((hash-map (position 0)
            (map
                (fn [s] (.substring s 1))
                (str/split (position 1) #"\|"))
                ))
        ) lineup))

そして、私は次の結果のようなものを生成しようとしています:

{:c {"4" "4" "3" "3"} :sg {"6" "11" "6" "6"} :sf {"7" "5" "5" "5"} ... }

助けてくれてありがとう。私が正しい「Lisp」の方法で書いていない場合は、その方法も教えてください。

4

1 に答える 1

12

あなたの主な問題はここにあります:

(fn [position]
  ((hash-map (position 0)
             (map
               (fn [s] (.substring s 1))
               (str/split (position 1) #"\|")))))

hash-map を作成し、それを関数として呼び出します ( の前の二重括弧に注意してくださいhash-map)。あなたはそれを削除してこれを得ることができます:

(fn [position]
  (hash-map (position 0)
             (map
               (fn [s] (.substring s 1))
               (str/split (position 1) #"\|"))))

この道validate-lineupは戻ります

({:c ("4" "4" "3" "3")} 
 {:sg ("6" "11" "6" "6")} 
 {:sf ("7" "5" "5" "5")} 
 {:pf ("3" "1" "1"` "1")} 
 {:pg ("10" "10" "11" "10")})

ただし、一連のマップではなく、単一のマップが必要です。それらをマージできます:

(apply merge (validate-lineup lineup))

いくつかのアドバイス:

subsの代わりに使用.substring:マップを反復処理するときに構造化解除を(fn [s] (subs s 1))
使用

(fn [[key value]]
  (hash-map key
             (map
               (fn [s] (subs s 1))
               (str/split value #"\|"))))

into関数を使用して、ペアのベクトルからマップを作成する優れた方法があります。lineupしたがって、ペアの最初の項目がキーで、2 番目が数値のリストであるペアのベクトルに変換できます。

(defn validate-lineup [lineup]
  (into {} (map (fn [[key value]]
                    [key
                     (map #(subs s 1) (str/split value #"\|"))])
             lineup)))

re-seqb4|b4|b3|b3で一連の数値に解析できます。

user=> (re-seq #"\d+" "b1|b2|b3")
("1" "2" "3")

mapそして最後に、outerをforマクロに置き換えることができます:

(defn validate-lineup [lineup]
  (into {} (for [[key value] lineup]
                [key (re-seq #"\d+" value)])))
于 2012-08-05T13:12:10.010 に答える