2016-07-16 50 views
2

我最近发现可以向结构添加类型限制,但无论出于何种原因,它不允许0.0作为合法默认值短浮动,但它确实允许100.0字段评估为值(0.0),而不是类型SHORT-FLOAT

我收到以下错误,当我尝试运行make-ship做出ship结构的实例在CLISP:

[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)) 
+0

不是一个完整的解释,但你有没有尝试各种后缀,例如'0.0d'等? –

+0

@JoshuaTaylor我不知道后缀是什么东西... –

+0

请参阅http://www.lispworks.com/documentation/HyperSpec/Body/02_cbb.htm。我认为s应该工作。 –

回答

4

Common Lisp中有不同类型的彩车,在2.3.2.2 Syntax of a Float描述语法。其中一个示例显示如何将0写为短浮点数:0s00.0s0都可以。

+0

奇怪的是,我使用的代码直接来自于hyperspec中的结构示例 –

+1

现在无法检查,但可以查看默认的浮点格式等。我期望系统可以读取的内容具有一定的灵活性当没有指定类型时浮动。所以规范中的例子可能是合法的,但不是强制性的。 –

2

似乎CLISP SINGLE-FLOAT0.00.0e0)和SHORT-FLOAT0s0)之间进行区分。因此,致电(make-ship)失败。要解决:或者需要分别替换0.0100.0分别用0s0100s0或用SINGLE-FLOAT替换全部SHORT-FLOAT的s。 PS:在SBCL和ECL中都是这样的,因为它们都不区分这些浮点数。

相关问题