写入文件时出错“是私有的#

时间:2013-09-04 15:28:49

标签: lisp common-lisp slime ccl

我刚开始使用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*)

但是如果相同的代码在文本缓冲区中并且我使用C-c C-c逐个评估表达式,那么在评估(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>

我做了以下测试,看看谁拥有文件流:

  • 我尝试从带有Cc的测试缓冲区写入两个不同的文件,从REPL打开两个不同的文件 file-out1 file-out2 抄送,我得到的错误是所有者是“工人(12)”。

  • 我用Cc Cc从测试缓冲区打开 file-out1 ,当试图从测试缓冲区或REPL或其他任何地方写入它时,我收到错误说明所有者是“工人(30)”。

  • 我用Cc Cc从测试缓冲区打开 file-out2 ,当试图从测试缓冲区或REPL或其他任何地方写入它时,我收到错误说明所有者是“工人(31)”。

  • 我使用C-c C-k一次运行测试缓冲区(打开,写入和关闭文件)并且它有效。

结论:

REPL具有不会更改的工作进程ID,但是从单独的缓冲区(C-c C-c或C-c C-k)发出的评估每次都会生成一个新的工作进程。有人可以解释整个“工人流程”的东西吗?

修改

我在Linux中重新测试并获得与Windows相同的行为,以避免混淆,我删除了有关Linux的部分

1 个答案:

答案 0 :(得分:3)

我从comp.lang.lisp中的 RG 得到了答案:CCL中(open ...)的默认行为是将流的所有权提供给首次尝试的流程I / O操作就可以了。这可以使用参数:sharing:lock 覆盖。这在http://ccl.clozure.com/ccl-documentation.html#CCL-Stream-Extensions中有记录。

我测试过,现在按预期工作了。