#:g1: read-csvの紹介

Posted 2014-05-31 11:00:00 GMT

(LISP Library 365参加エントリ)

 LISP Library 365 の151日目です。

read-csvとはなにか

 read-csvは、Warren Wilkinson氏作のCVSを扱うシンプルなライブラリです。

パッケージ情報

パッケージ名read-csv
Quicklisp
CLiKihttp://cliki.net/read-csv
Quickdocshttp://quickdocs.org/read-csv
CL Test Grid: ビルド状況read-csv | CL Test Grid

インストール方法

(ql:quickload :read-csv)

試してみる

 どんな関数があるかは、Quickdocsで確認できます。

 エクスポートされている関数は、行ごとに処理する、read-csvと、ファイルを一括で処理するparse-csvの2つのみです。

;;; ^MはReturn
(with-input-from-string (in "0,1,2,3,4,5,6,7,8,9^M
10,11,12,13,14,15,16,17,18,19^M
20,21,22,23,24,25,26,27,28,29^M
30,31,32,33,34,35,36,37,38,39^M
40,41,42,43,44,45,46,47,48,49^M
50,51,52,53,54,55,56,57,58,59^M
60,61,62,63,64,65,66,67,68,69^M
70,71,72,73,74,75,76,77,78,79^M
80,81,82,83,84,85,86,87,88,89^M
90,91,92,93,94,95,96,97,98,99^M
")
  (loop :for line := (read-csv:read-csv in #\, nil)
        :while line
        :collect line))
;=>  (("0" "1" "2" "3" "4" "5" "6" "7" "8" "9")
;     ("10" "11" "12" "13" "14" "15" "16" "17" "18" "19")
;     ("20" "21" "22" "23" "24" "25" "26" "27" "28" "29")
;     ("30" "31" "32" "33" "34" "35" "36" "37" "38" "39")
;     ("40" "41" "42" "43" "44" "45" "46" "47" "48" "49")
;     ("50" "51" "52" "53" "54" "55" "56" "57" "58" "59")
;     ("60" "61" "62" "63" "64" "65" "66" "67" "68" "69")
;     ("70" "71" "72" "73" "74" "75" "76" "77" "78" "79")
;     ("80" "81" "82" "83" "84" "85" "86" "87" "88" "89")
;     ("90" "91" "92" "93" "94" "95" "96" "97" "98" "99"))

(with-input-from-string (in "0,1,2,3,4,5,6,7,8,9^M
10,11,12,13,14,15,16,17,18,19^M
20,21,22,23,24,25,26,27,28,29^M
30,31,32,33,34,35,36,37,38,39^M
40,41,42,43,44,45,46,47,48,49^M
50,51,52,53,54,55,56,57,58,59^M
60,61,62,63,64,65,66,67,68,69^M
70,71,72,73,74,75,76,77,78,79^M
80,81,82,83,84,85,86,87,88,89^M
90,91,92,93,94,95,96,97,98,99^M
")
  (read-csv:parse-csv in))
;=>  (("0" "1" "2" "3" "4" "5" "6" "7" "8" "9")
;     ("10" "11" "12" "13" "14" "15" "16" "17" "18" "19")
;     ("20" "21" "22" "23" "24" "25" "26" "27" "28" "29")
;     ("30" "31" "32" "33" "34" "35" "36" "37" "38" "39")
;     ("40" "41" "42" "43" "44" "45" "46" "47" "48" "49")
;     ("50" "51" "52" "53" "54" "55" "56" "57" "58" "59")
;     ("60" "61" "62" "63" "64" "65" "66" "67" "68" "69")
;     ("70" "71" "72" "73" "74" "75" "76" "77" "78" "79")
;     ("80" "81" "82" "83" "84" "85" "86" "87" "88" "89")
;     ("90" "91" "92" "93" "94" "95" "96" "97" "98" "99"))

 という風に利用については問題ないのですが、先日巨大なコアを作成している時にquoteを定数宣言してしまう問題があるので、ライブラリの紹介ついでにPull Requestも投げてみたいと思います。

Pull Requestを投げる

問題

 quoteというシンボルをdefconstantで定数宣言してしまっているのですが、これが、cl:quoteなので、変数名にcl:quoteを利用したりしていると、定数へ再束縛したと見做されてコンパイルでこけます。
(defun foo (quote)...)なんてしないよ、と思いますが割合に使われてます〈コードウォーカー等〉

修正

 quoteという変数名をやめて、quoかなにかにすれば良さそうですが、どうも他の定数も5文字の名前でぴっちり揃えているので、shadowすることにしてみました。

ソースコードの所在の確認

 ライブラリの大元はQuicklispでインストールしている場合、github上の、quicklisp-projectsのプロジェクト一覧から確認できます。
今回であれば、

に記載があり、git://github.com/WarrenWilkinson/read-csv.gitが大元だなということが分かります。
ソース元はgithubとは限りませんが、その辺りは流してください。

フォークする

 右上のForkボタンを押してフォークします

修正する

 今回は、上記のドキュメントを参考にしてPull Request用のブランチを作成しました。
テストケースも付属しているので、一応テストも追加。ただ今回の問題の場合、機能のテストではないので一緒にして良いのかは迷うところ。

Pull Requestする

 Pull Request用のブランチのページを確認すると、親切にCompare & Pull Requestという黄緑のボタンがあるので、問題の内容の説明文も入力してPull Requestします。

まとめ

 今回は、read-csvを紹介しつつ、ついでにPull Requestもしてみました。
これまで他のプロジェクトにも修正の報告は出したりしてみていますが、結構放置されます。放置が基本と考えて期待せずに反応を待ちましょう。
ちなみに先日紹介したclickrにもPull Requestを送ってみましたが翌日にはマージされました。こういう珍しいことも無い訳でもありません。

comments powered by Disqus