HOMEUP

files - 俺式 - Common Lisp Memo

ensure-directories-exist - ディレクトリの作成

ディレクトリの作成にはensure-directories-existを使います。指定されたディレクトリが存在しない場合には作成されます。以下の様にすると/tmpの下にfooもbarも続けて作ってくれるので便利です。

CL-USER> (ensure-directories-exist
	  (make-pathname :directory '(:absolute "tmp" "foo" "bar")))
#P"/tmp/foo/bar/"
T

きちんとmake-pathnameでパスネームを渡してやらないとおかしなことになりそうです。ubuntu + sbclで以下の様にやってみると…

CL-USER> (ensure-directories-exist
	  "/tmp/hoge/huga")
"/tmp/hoge/huga"
T

/tmpの下にhogeが作られました。他のOSや処理系では/tmpの下に'hoge/huga'というディレクトリが作られたりしそうですね。今度Windowsでやってみます。

ファイルから読み込む

一文字づつ

Cでforとgetcharを使ったようなループはCommonLispでは

(with-open-file (ist "hoge.txt")
  (loop for c = (read-char ist nil) while (characterp c) do
       ( …何かする… )))

みたいな感じ。

上記はテキストファイル(ubuntu+sbclだとUTF-8に対応しているので漢字も読めます)の場合で、バイナリの場合は入力用のストリーム(ist)を束縛している部分とloopのcharacterpで終了を判定している部分を書き換える必要がある。

(read-char ist nil)の様にnilを指定するとファイルの終端に達した場合にnilを返します。(通常はerrorとなる)

HOMEUP