replace-first

最初に見つけた要素だけ置き換えたいんです。

(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)))))