私はCLを始めたばかりで、Windows XP64のEmacs v24でCCL + Slimeを使用しています。次の問題が発生しています。
これらの 3 つの式を REPL に入力すると、意図した結果、"Something" というテキストを含むファイルが得られます。
(defparameter *file-out*
(open "e:/test.txt"
:direction :output
:if-exists :supersede
:if-does-not-exist :create))
(write-line "Something" *file-out*)
(close *file-out*)
しかし、同じコードがテキスト バッファーにあり、Cc Cc を使用して式を 1 つずつ評価すると、(write ...) ステートメントを評価するときに次のエラーが発生します。
Stream #<BASIC-FILE-CHARACTER-OUTPUT-STREAM ("e:/test.txt"/2616 UTF-8) #x2180C0A06D> is private to #<PROCESS worker(46) [Reset] #x2180BB558D>
[Condition of type SIMPLE-ERROR]
原因は何ですか?ご協力いただきありがとうございます。
編集:
バックトレースでこれを見つけたので、エラーは (CCL::CHECK-IOBLOCK-OWNER ...) から発生しているようで、所有者は「PROCESS Worker(31)」です:
0: (CCL::CHECK-IOBLOCK-OWNER #S(CCL::FILE-IOBLOCK :STREAM #<BASIC-FILE-CHARACTER-OUTPUT-STREAM ("e:/apps/gcj/2008-0-A-large-practice.out"/1600 UTF-8) #x2180AA709D> :UNTYI-CHAR NIL :INBUF ...))
Locals:
IOBLOCK = #S(CCL::FILE-IOBLOCK :STREAM #<BASIC-FILE-CHARACTER-OUTPUT-STREAM ("e:/apps/gcj/2008-0-A-large-practice.out"/1600 UTF-8) #x2180AA709D> :UNTYI-CHAR NIL :INBUF ...)
OWNER = #<PROCESS worker(31) [Reset] #x2180AA2B5D>
ファイル ストリームの所有者を確認するために、次のテストを行いました。
REPL から file -out1とfile-out2の2 つの異なるファイルを開き、Cc Cc を使用してテスト バッファーからそれらに書き込もうとすると、所有者が "worker(12)" であるというエラーが表示されます。
Cc Cc を使用してテスト バッファーからfile-out1を開きました。テスト バッファーまたは REPL またはその他の場所からファイルに書き込もうとすると、所有者が "worker(30)" であるというエラーが表示されます。
Cc Cc を使用してテスト バッファーからfile-out2を開きました。テスト バッファーまたは REPL またはその他の場所からファイルに書き込もうとすると、所有者が "worker(31)" であるというエラーが表示されます。
Cc Ck で一度にテスト バッファ (ファイルのオープン、書き込み、およびクローズ) を実行したところ、動作しました。
結論:
REPL には変更されないワーカー プロセス ID がありますが、別のバッファー (Cc Cc または Cc Ck) から発行された評価は、毎回新しいワーカー プロセスを生成します。誰かが「ワーカープロセス」全体を説明できますか?
編集:
Linuxで再テストしたところ、Windowsと同じ動作が得られました。混乱を避けるために、Linuxに関する部分を削除しました