Types 字段评估为值(0.0),不是短浮点类型

Types 字段评估为值(0.0),不是短浮点类型,types,common-lisp,record,Types,Common Lisp,Record,我最近发现,可以向结构添加类型限制,但是无论出于何种原因,它不允许将0.0作为短浮点的法定默认值,但它确实允许100.0 当我试图运行make ship在CLisp中创建ship结构的实例时,出现以下错误: [4]> (make-ship) *** - THE: #:ENERGY evaluated to the values (0.0), not of type SHORT-FLOAT The following restarts are available: ABORT

我最近发现,可以向结构添加类型限制,但是无论出于何种原因,它不允许将
0.0
作为短浮点的法定默认值,但它确实允许
100.0

当我试图运行
make ship
在CLisp中创建
ship
结构的实例时,出现以下错误:

[4]> (make-ship)

*** - THE: #:ENERGY evaluated to the values (0.0), not of type SHORT-FLOAT
The following restarts are available:
ABORT          :R1      Abort main loop
有人能解释一下到底发生了什么,为什么不允许我使用0.0吗

以下是错误行为的代码:

(defstruct ship
  location ;; fields like these have an undecided type at the moment
  (energy 0.0 :type short-float)
  cargo
  crew
  shields
  (hull-integrity 100.0 :type short-float))

Common Lisp具有用于不同类型浮点的语法,如中所述。其中一个示例显示了如何将0作为短浮点写入:0s00.0s0两者都起作用。

CLisp似乎区分了
单浮点(
0.0
0.0e0
)和
短浮点(
0s0
)。因此,调用
(make ship)
失败。要修复:需要将
0.0
100.0
分别替换为
0s0
100s0
,或者将所有
短浮点
替换为
单浮点


PS:在SBCL和ECL中,示例都按原样工作,因为它们都不区分这些浮点数。

如果没有浮点数,或在指数标记处使用“e”,则读取的浮点数的类型由全局变量确定,该变量默认为,不一定是短浮点数。

不是完整的解释,但是你试过各种后缀吗,例如,
0.0d
,等等?@JoshuaTaylor我甚至不知道后缀是一种东西……看。我认为s应该可以工作。奇怪的是,我使用的代码是直接从HyperSpec中的结构示例中获取的。现在无法检查,但请查看默认的浮点格式等。我希望在未指定类型时,系统可以读取浮点的内容有一定的灵活性。因此,规范中的示例可能是合法的,但不是强制性的。