2016-07-16 9 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. Я думаю, что он должен работать. –

ответ

4

Common Lisp имеет синтаксис для различных видов поплавков, описанных в 2.3.2.2 Syntax of a Float. один из примеров показывает, как писать 0 в виде короткого поплавка: 0s0 и 0.0s0 обе произведение.

+0

Странно, что код, который я использовал, берется прямо из примеров структуры в гиперссылке –

+1

Не могу проверить прямо сейчас, но взгляните на стандартные форматы float и т. Д. Я ожидаю, что есть определенная гибкость в отношении того, что система может читать float in, когда тип не указан. Таким образом, пример в спецификации может быть законным, но не обязательным. –

2

Оказывается, что CLISP различает SINGLE-FLOAT (0.0 или 0.0e0) и SHORT-FLOAT (0s0). Таким образом, вызов (make-ship) терпит неудачу. Исправить: либо необходимо заменить 0.0 и 100.0 на 0s0 и 100s0 соответственно, либо заменить все SHORT-FLOAT на SINGLE-FLOAT.

PS: как в SBCL, так и в ECL пример работает так же, как и они оба не различают эти поплавки.

3

Когда нет exponent marker, или «е» используются при показателе маркерах, то тип числа с плавающей запятой читать определяются глобальной переменной *READ-DEFAULT-FLOAT-FORMAT*, который по умолчанию SINGLE-FLOAT, который не обязательно является КОРОТКИМ -FLOAT.