ファイルの読み込み
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 } }