Shammer's Philosophy

My private adversaria

Lispでファイル読み書き

Lispでファイルを読み書きする場合、

  1. ファイルのPATHを取得
  2. そのPATHからストリームを生成
  3. ストリームに対して読み書き実行
  4. ストリームをクローズ

という流れになる。

簡単な内容だが、サンプルは以下のような感じ。

(defun file-write (message)
  (let ((stream (open (make-pathname :name "test.txt") :direction :output :if-exists :supersede)))
    (format stream message)
    (format stream ".~%")
    (close stream)))

(defun file-read (path)
  (let ((stream (open (make-pathname :name path) :direction :input)))
    (format t "~a~%" (read-line stream))
    (close stream)))

書き込み専用で開くときは、:outputとし、読み込み専用の場合は:inputとする。両方やりたい場合は、:ioとすればよいらしい。

でもまだこれだけの実装だと、

  • 書き込みは追記ではなく、上書きになってしまう
  • 読み込みは1行しか読み込まない

というかなり不完全な状態。またここから完成度を上げるために勉強していかねば!