我刚开始使用 CL,我在 Windows XP64 中使用 CCL+Slime 和 Emacs v24。我遇到以下问题:
如果我在 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 逐一评估表达式,则在评估 (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,当我尝试使用 Cc Cc 从测试缓冲区写入它们时,我收到错误消息,指出所有者是“worker(12)”。
我使用 Cc Cc 从测试缓冲区打开file-out1,当尝试从测试缓冲区或 REPL 或其他任何地方写入文件时,我收到错误消息,指出所有者是“worker(30)”。
我使用 Cc Cc 从测试缓冲区打开file-out2,当尝试从测试缓冲区或 REPL 或其他任何地方写入文件时,我收到错误消息,指出所有者是“worker(31)”。
我用 Cc Ck 一次运行了测试缓冲区(打开、写入和关闭文件),它工作了。
结论:
REPL 有一个不会更改的 Worker 进程 ID,但从单独的缓冲区(Cc Cc 或 Cc Ck)发出的评估每次都会生成一个新的 Worker 进程。有人可以解释整个“工人进程”吗?
编辑:
我在 Linux 中重新测试并获得与 Windows 相同的行为,为避免混淆,我删除了有关 Linux 的部分