次のCLコードのフラグメントは、SLIMEを実行しているCCLで期待したとおりに機能しません。最初にを使用してファイルをコンパイルしてロードし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)))
更新:プラットフォームとバージョンについて言及するのを忘れました。Debiansqueezex86を使用しています。SLIMEのバージョンはDebianunstableからのもの1:20120525-2
です。CCLは1.8リリースです。http://svn.clozure.com/publicsvn/openmcl/release/1.8/linuxx86/cclのアップストリームバイナリと、自分で作成したバイナリパッケージの両方で試しました。mentors.debian.netのパッケージcclを参照してください。結果はいずれの場合も同じでした。
この問題は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*)
直後のREPLで.を与えますDOUBLE-FLOAT
が、を生成します。*read-default-float-format*
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が同じように動作しないのかという疑問が残ります。