对于运行 SLIME 的 CCL,以下 CL 代码片段无法正常工作。如果我首先使用 编译和加载文件C-c C-k
,然后运行
(rdirichlet #(1.0 2.0 3.0) 1.0)
在 SLIME/CCL REPL 中,我收到错误
value 1.0 is not of the expected type DOUBLE-FLOAT.
[Condition of type TYPE-ERROR]
它适用于 SBCL。我希望(setf *read-default-float-format* 'double-float))
允许我使用像1.0
. LOAD
如果我使用REPL将此文件加载到 CCL 中,它可以工作。我错过了什么?
(eval-when (:compile-toplevel :load-toplevel :execute)
(require :asdf) (require :cl-rmath) (setf *read-default-float-format* 'double-float))
(defun rdirichlet (alpha rownum)
;;(declare (fixnum rownum))
(let* ((alphalen (length alpha))
(dirichlet (make-array alphalen :element-type '(double-float 0.0 *) :adjustable nil :fill-pointer nil :displaced-to nil)))
(dotimes (i alphalen)
(setf (elt dirichlet i) (cl-rmath::rgamma (elt alpha i) rownum)))
;; Divide dirichlet vector by its sum
(map 'vector #'(lambda (x) (/ x (reduce #'+ dirichlet))) dirichlet)))
更新:我忘了提及我的平台和版本。我正在使用 Debian 挤压 x86。SLIME 的版本来自 Debian 不稳定,1:20120525-2
. CCL 是 1.8 版本。我尝试了来自http://svn.clozure.com/publicsvn/openmcl/release/1.8/linuxx86/ccl的上游二进制文件和我创建的二进制包 - 请参阅package ccl at advisors.debian.net。结果在每种情况下都是相同的。
这个问题似乎很可能是特定于 SLIME 的。如果人们可以评论他们是否看到这种行为,那将会很有帮助。C-c C-k
另外,如果在基本命令行模式下运行 CCL,那么在 SLIME中的等价物是什么?(LOAD filename)
, 或者是其他东西?或者,问一个稍微不同的问题,调用什么 CCL 函数C-c C-k
?
我注意到调用C-c C-k
以下代码
(eval-when (:compile-toplevel :load-toplevel :execute)
(require :asdf) (require :cl-rmath) (setf *read-default-float-format* 'double-float))
(print *read-default-float-format*)
产生DOUBLE-FLOAT
,尽管*read-default-float-format*
在 REPL 之后立即给出SINGLE-FLOAT
。
更新 2:正如 Rainer 所说,看起来编译发生在一个单独的线程中。
根据线程字典all-processes
中的函数
all-processes
使用 Cc Ck 从缓冲区打印给出
(#<PROCESS worker(188) [Active] #x18BF99CE> #<PROCESS repl-thread(12) [Semaphore timed wait] #x187A186E> #<PROCESS auto-flush-thread(11) [Sleep] #x187A1C9E> #<PROCESS swank-indentation-cache-thread(6) [Semaphore timed wait] #x186C128E> #<PROCESS reader-thread(5) [Active] #x186C164E> #<PROCESS control-thread(4) [Semaphore timed wait] #x186BE3BE> #<PROCESS Swank Sentinel(2) [Semaphore timed wait] #x186BD0D6> #<TTY-LISTENER listener(1) [Active] #x183577B6> #<PROCESS Initial(0) [Sleep] #x1805FCCE>)
CL-USER> (all-processes)
在 REPL 中给出
(#<PROCESS repl-thread(12) [Active] #x187A186E> #<PROCESS auto-flush-thread(11) [Sleep] #x187A1C9E> #<PROCESS swank-indentation-cache-thread(6) [Semaphore timed wait] #x186C128E> #<PROCESS reader-thread(5) [Active] #x186C164E> #<PROCESS control-thread(4) [Semaphore timed wait] #x186BE3BE> #<PROCESS Swank Sentinel(2) [Semaphore timed wait] #x186BD0D6> #<TTY-LISTENER listener(1) [Active] #x183577B6> #<PROCESS Initial(0) [Sleep] #x1805FCCE>)
所以似乎#<PROCESS worker(188) [Active] #x18BF99CE>
是正在编译的线程。当然,仍然存在为什么这些变量是线程本地的,以及为什么 SBCL 的行为方式不同的问题。