为何Let绑定*read-default-float-format*在Sly线程中无效?
关于Sly连接REPL时
*read-default-float-format*绑定失效的问题 问题详情
我在invistra包中将*read-default-float-format*绑定为'double-float。在终端启动的全新SBCL进程中加载该库后,可正常读取双精度浮点数。但通过Sly连接REPL并切换到该包时,出现如下类型错误:
The value 1.0 is not of type DOUBLE-FLOAT when binding INVISTRA::VALUE [Condition of type TYPE-ERROR]
这是否是因为Slynk运行在另一个线程导致的?我更希望仅在需要双精度计算的函数范围内用let绑定该变量,而非全局设置,但全局设置也可接受。
尝试的无效代码
我尝试了以下代码,但完全无效:
(in-package #:invistra) #+sbcl (declaim (sb-ext:disable-package-locks *read-default-float-format*)) (defun ensure-symbol (name &optional (package *package*)) (intern (string name) package)) (defmacro define-interface ((client-var client-class &optional intrinsic) &body body) (declare (ignore client-class)) (let* ((intrinsic-pkg (if intrinsic (find-package '#:common-lisp) *package*)) (format-func (ensure-symbol '#:format intrinsic-pkg)) (initialize-func (ensure-symbol '#:initialize-invistra)) (*read-default-float-format* 'double-float)) `(progn (defun ,format-func (control-string &rest args) (apply #'format ,client-var control-string args)) (defmacro ,(ensure-symbol '#:formatter intrinsic-pkg) (control-string) (formatter ,client-var control-string)) (define-compiler-macro ,format-func (&whole form control-string &rest args) (format-compiler-macro ,client-var form control-string args)) (defun ,initialize-func () ,@body))))
使用setf设置*read-default-float-format*是有效的,但每次通过Sly连接后都需要重新设置。
已解决的方案
在@coredump的提示下,我通过启动SBCL时添加参数解决了问题:
sbcl --noinform --eval "(setq *read-default-float-format* 'double-float)"
该方案符合我的使用需求。
内容的提问来源于stack exchange,提问作者myname
相关产品推荐
相关产品推荐

