下面的CL代碼片段不能像我期望的那樣運行SLIME的CCL。如果我 第一編譯並加載使用C-c C-k
的文件,然後運行'eval-when'意外的行爲
(rdirichlet #(1.0 2.0 3.0) 1.0)
在淤泥/ 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
這樣的值。如果我在REPL中使用LOAD
將此文件加載到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 unstable,1:20120525-2
。 CCL是1.8版本。我試着用http://svn.clozure.com/publicsvn/openmcl/release/1.8/linuxx86/ccl的上游二進制文件和我創建的二進制包 - 參見Package ccl at mentors.debian.net。結果在每種情況下都是一樣的。
這個問題很可能是SLIME特有的。如果人們能評論他們是否看到這種行爲,這將是有幫助的。另外, SLIME中的C-c C-k
等效於什麼,如果在基本命令行模式下運行CCL? (LOAD filename)
,還是別的?或者,要問一個稍微不同的問題,呼叫什麼CCL功能是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*)
調用C-c C-k
產生DOUBLE-FLOAT
,但即使*read-default-float-format*
在REPL隨即給SINGLE-FLOAT
。
更新2:正如Rainer所說,它看起來像編譯發生在一個單獨的線程中。
每功能all-processes
在Threads Dictionary
使用抄送CK緩衝打印all-processes
給
(#<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的行爲不同。
奇怪,適合我 –
@VsevolodDyomkin:你使用什麼版本的SLIME和CCL? –
發生錯誤時'* read-default-float-format *'的實際值是多少? –