% 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は開かれるファイルの名前です。
optionsはopenのキーワード引数として使われます。
stream変数に束縛されるストリームオブジェクトは 動的エクステントを持っており、 その範囲はフォームから退出が行われたときに終了します。
with-open-fileは、
openの返却値をstreamに束縛して、
formを暗黙のprognとして評価します。
通常の場合か普通ではない方法(例えばthrowの使用によるもの)のどちらかで
ボディ部から制御が出るとき、
ファイルは自動的にクローズされます。
もし新しい出力ファイルが書き込みを始めてから
制御が普通ではない方法で退出したとき、
そのファイルは中断され、
ファイルシステムを可能な限り
そのファイルがオープンされていなかったかのようにします。
:if-exists nilか:if-does-not-exist nilを使用することで、
streamにnilを束縛することができます。
ユーザーが: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. ファイル名としてのパス名
なし。