最初に見つけた要素だけ置き換えたいんです。
(use '[clojure.contrib.seq-utils]) ;(defn- position-sub [x coll i] ; (if (= (first coll) x) i ; (position-sub x (rest coll) (inc i)))) ; ;(defn position [x coll] ; (position-sub x coll 0)) ; ;別バージョンのposition ;(defn position-2 [x coll] ; (inc (last (for [[idx item] (indexed coll) :while (not= item x)] idx)))) (defn position [x coll] (first (positions #(= x %) coll))) (defn replace-first [s r coll] (let [idx (position s coll) splitted (split-at idx coll)] (concat (first splitted) (list r) (rest (fnext splitted)))))
なんかposition関数の実装で盛り上がるhackathonメンバ。
以下はmakingさんに書き換えていただいたposition。
(defn position ([x coll] (position x coll 0)) ([x coll i] (if (= (first coll) x) i (recur x (rest coll) (inc i)))))
最終版。positionには値じゃなくて、predicate自身を渡すようにした。
(use '[clojure.contrib.seq-utils]) (defn position [f coll] (first (positions f coll))) (defn replace-first [s r coll] (let [idx (position #(= s %) coll) splitted (split-at idx coll)] (concat (first splitted) (list r) (rest (fnext splitted)))))