2016-07-16 4 views
2

최근에 구조체에 타입 제한을 추가 할 수 있다는 것이 밝혀졌지만 어떤 이유로 든 0.0을 합법적 인 기본값으로 허용하지 않습니다. 짧은 수레, 아직 그것은 100.0을 허용합니다.필드가 SHORT-FLOAT 타입이 아닌 값 (0.0)으로 평가되었습니다.

은 내가 CLISP에서 ship 구조의 인스턴스를 만들 make-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)) 
+0

전체 설명이 아니지만 '0.0d' 등 다양한 접미사를 사용해 보셨습니까? –

+0

@ JoshuaTaylor 접미사도 알지 못했습니다 ... –

+0

http://www.lispworks.com/documentation/HyperSpec/Body/02_cbb.htm을 참조하십시오. 나는 일해야한다고 생각해. –

답변

4

커먼 리스프는 2.3.2.2 Syntax of a Float에 설명 된 수레의 다른 종류에 대한 구문 :

다음은 무례한 행동 코드입니다. 예제 중 하나는 0을 짧은 부동 소수점으로 쓰는 방법을 보여줍니다. 0s00.0s0 모두 작동합니다.

+0

이상한 점은 내가 사용한 코드가 하이퍼 스펙의 구조체 예제에서 바로 취해 졌다는 것입니다. –

+1

지금은 확인할 수 없지만 기본 부동 소수점 형식 등을 살펴보십시오. 시스템에서 읽을 수있는 것에 유연성이있을 것으로 기대합니다. 타입이 지정되어 있지 않은 경우의 float 따라서 사양의 예는 합법적 일 수 있지만 필수는 아닙니다. –

2

이 CLISP가 SINGLE-FLOAT (0.0 또는 0.0e0) 및 SHORT-FLOAT (0s0)를 구별하는 것이 나타난다. 따라서 (make-ship) 호출에 실패합니다. 수정하려면 0.0100.0을 각각 0s0100s0으로 대체하거나 SHORT-FLOATSINGLE-FLOAT으로 바꿔야합니다.

추 신 : SBCL과 ECL 둘 다에서 예제는 두 가지 부동 체를 구분하지 않기 때문에 작동합니다.