Macro WITH-OPEN-FILE

UP


Macro WITH-OPEN-FILE

Macro WITH-OPEN-FILE

構文

with-open-file ( stream filespec options* ) declaration* form* => result

引数と戻り値

stream - 変数
filespec - パス名指定子
options – フォーム。評価されます。
declaration - 宣言式。評価されません。
form - 暗黙のprogn
result - formによる返却値

定義

with-open-fileは、openを使い filespecによって名前付けられたファイルの ファイルストリームを作成します。 filespecは開かれるファイルの名前です。 optionsopenのキーワード引数として使われます。

stream変数に束縛されるストリームオブジェクトは 動的エクステントを持っており、 その範囲はフォームから退出が行われたときに終了します。

with-open-fileは、 openの返却値をstreamに束縛して、 formを暗黙のprognとして評価します。

通常の場合か普通ではない方法(例えばthrowの使用によるもの)のどちらかで ボディ部から制御が出るとき、 ファイルは自動的にクローズされます。 もし新しい出力ファイルが書き込みを始めてから 制御が普通ではない方法で退出したとき、 そのファイルは中断され、 ファイルシステムを可能な限り そのファイルがオープンされていなかったかのようにします。

:if-exists nil:if-does-not-exist nilを使用することで、 streamnilを束縛することができます。 ユーザーが:if-does-not-exist nilを使うときは、 ストリームが有効かどうかチェックする必要があります。

stream変数に代入を仕様とした結果は定義されていません。 もしそのような試行を検出したとき、 コンパイラーは警告を出力するかもしれません。

例文

(setq p (merge-pathnames "test"))
=>  #<PATHNAME :HOST NIL :DEVICE device-name :DIRECTORY directory-name
   :NAME "test" :TYPE NIL :VERSION :NEWEST>
(with-open-file (s p :direction :output :if-exists :supersede)
   (format s "Here are a couple~%of test data lines~%")) =>  NIL
(with-open-file (s p)
   (do ((l (read-line s) (read-line s nil 'eof)))
       ((eq l 'eof) "Reached end of file.")
    (format t "~&*** ~A~%" l)))
>>  *** Here are a couple
>>  *** of test data lines
=>  "Reached end of file."
;; 通常はこのように不明瞭なことを意図的には実行しません。
;; しかし例の通り:IF-DOES-NOT-EXIST NILをうっかり
;; 使ってしまうことがないように注意してください。
(with-open-file (foo "no-such-file" :if-does-not-exist nil)
  (read foo))
>>  hello?
=>  HELLO? ;この値はterminalからreadしたもので、ファイルではない!

;; ここにも避けるべきバグがあります。
(with-open-file (foo "no-such-file" :direction :output :if-does-not-exist nil)
  (format foo "Hello"))
=>  "Hello" ;FORMATは引数にNILを受け取る!

副作用

filespecによる名前のファイルへのストリームを作成し(入るとき)、 そのストリームをクローズします(退出するとき)。 ある実装では、ファイルを開いている間に 何らかの方法でロックするかもしれません。 もしストリームが出力ストリームのとき、ファイルは作成されます。

影響

ホストコンピューターのファイルシステム

例外

open関数をご確認ください。

参考

open, close, pathname, logical-pathname, 19.1.2. ファイル名としてのパス名

備考

なし。


TOP, Github