Tokyo.clj #2 に行ってきた

Clojure Hackathon です!最初はキャンセル待ちで行けるかわからなかったんだけど前日に見たら空いてた!当日は定員15名のところ12名参加だった!世の中そんなもん!

で、私は何をしていたかと言うと、プログラミングClojureをまだ読了していなかったのでREPLを弄りつつ残りの部分を読んでた。大半の時間をこれに費やす。何しに行ったんだっけ。
途中で clojure.core/replace の最初の要素だけを置換するにはどうすればいいか、と言う話になっていたので、読了後、勉強がてら私も書いてみた。

(use '[clojure.contrib.seq :only (positions)])

(defn replace-first
  ([smap coll]
   (reduce #(%2 %1) coll (map (fn [[k v]] #(replace-first k v %)) smap)))
  ([key val coll]
  (if-let [fst (first (positions #(= % key) coll))]
    (assoc coll fst val))))

[smap coll] の中身がすごくキモい。こういう、とある値を別のリストで順次更新していくような操作ってどう書くのがいいんだろ。標準でありそうな気がしたのだけど見当たらなかった。


あと、http://rd.clojure-users.org/というページを作っている方がいらしていて、他の人が当日書いた replace-first 他が更新されてた。こういうページ便利だよね。もっと項目が増えていくといいなぁ。
で、帰ったら今日やったことをみんなで更新しましょうみたいに言っていたので、とは言っても私がやったのは上の replace-first くらいなので同ページに追記しておいた。
http://rd.clojure-users.org/entry/view/20001
さっきも書いたけど何かキモいのでもっといい方法があったらガシガシ書き換えちゃって構わないです。

replace-first 書き終わったあとも少し時間があったので、doc マクロを使って ref-clojure.vim が作れそうな予感がしたのでプロトタイプ書いてた。*1
ものすごく簡単なものはあっさり動いたので、もう少し手直ししたら公開する予定。と言っても use の指定の方法とか面倒な部分はあるのでそんな簡単には行かないんだけど。あと毎回 clj -e "(doc hoge)" ってしてると重い気もする。キャッシュの単位どうしよ…。


早々に次回も決まってるようなので、またおじゃましたいと思います。次こそはちゃんとclojureのコード書きたいなぁ。遊びでもいいから。

追記: どうやらassocはvectorにしか使えないっぽいので、下の部分あれじゃダメだね…。とりあえず逆引きの方のは消しておきます。

*1:全てはVimに繋がる