lisp - 写入文件 "is private to #<PROCESS worker( )"时出错

标签 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>

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

  • 我在 REPL 中打开了两个不同的文件,file-out1file-out2,当我尝试使用 C-c 从测试缓冲区写入它们时C-c,我收到错误消息说所有者是“worker(12)”。

  • 我用 C-c C-c 从测试缓冲区打开了 file-out1,当我试图从测试缓冲区或 REPL 或其他任何地方写入它时,我收到错误提示 owner是“ worker (30)”。

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

  • 我用 C-c C-k 一次运行了测试缓冲区(打开、写入和关闭文件),它成功了。

结论:

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

编辑:

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

最佳答案

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

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

关于lisp - 写入文件 "is private to #<PROCESS worker( )"时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18617925/

相关文章:

common-lisp - 在 Common Lisp 中,如何测试变量是否特殊?

emacs - 粘液 - 如何补偿最近可能发生的变化

lisp - emacs 粘液 : Whats the equivalent of the up arrow in shells?

list - LISP 函数总是返回 nil

lisp - 函数内的 DELETE + SETF

lisp - 如何检测输入流是否为空(但不是 EOF)?

unit-testing - Common Lisp 是否有模拟/ stub 框架?

common-lisp - 系列包中的#M派发功能如何使用?

lisp - 对排序的整数列表进行分组的惯用方法?

emacs - 史莱姆有什么好处?