You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 02:27:02