ファイルの読み込み

Common Lispでファイルの読み込み。
例によって実践Common Lispから。
実践Common Lisp
基本的なファイルの読み込みは以下の様になる。

CL-USER> (let ((in (open "/home/hironemu/test.txt" :if-does-not-exist nil)))
	   (when in
	     (loop for line = (read-line in nil)
		  while line do (format t "~a~%" line))
	     (close in)))
テスト用ファイル
2行目
3行目
NIL

(oepn "/home/hironemu/test.txt")でファイルのストリームを開く。その後ろにある:if-does-not-existってのは、ファイルがなかった場合どうするかってことで、上の例だとファイルがなかったらNILを返すように設定している。
when inで開いたストリームがNILでなかったらそれ以降の処理を実行する。
loopの新しい使い方が出てきた。以下のサイトで調べてみる。
Common Lisp: loopマクロ用法抄: 微酔半壊
loop for のあとのline = (read-line in nil)でlineという変数に一行分のデータを毎回更新しながらループしていく。(read-line in)でストリームから一行分のデータを取り出す。その後のwhile 〜でループの終了条件を指定。
ループから抜けたら(close in)でストリームを閉じる。

これで、基本的な読み込みは出きるようになった。が、通常は以下の構文を使って読み込みをやる。

CL-USER> (with-open-file (in "/home/hiromi/test.txt" :if-does-not-exist nil)
	   (when in
	     (loop for line = (read-line in nil)
		  while line do (format t "~a~%" line))))
テスト用ファイル
2行目
3行目
NIL

最初の例と違うのは(close in)がないこと。これは遣らなくていいってわけじゃなくて、with-open-fileが終了するときに勝手にやってくれてる。これはRubyでもあったから当然あるんだろうなと思ったらやっぱりあった。Rubyにも受け継がれているわけだ。きっとw
Rubyの場合はこんな感じ。

open("/home/hironemu/test.txt") {|f|
  f.each {|line|
    print line
  }
}