Hatena::ブログ(Diary)

ありの日記 このページをアンテナに追加 RSSフィード

2009-04-25

ファイルの読み込み

| 22:55 |  ファイルの読み込みのブックマークコメント

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
  }
}
トラックバック - http://d.hatena.ne.jp/hiro_nemu/20090425/1240667723