2017-10-21 28 views
1

계약이 코드 :ldc 및 gdc는 D 언어 계약을 지원합니까?

import std.stdio; 

int TestContract(int a) 
in 
{ 
    assert(a > 0); 
} 
do 
{ 
    return a + 1; 
} 

int main(string[] args) 
{ 
    auto a = 2; 
    try 
    { 
     writeln(a," + 1 is ",TestContract(a)); 
     a = -2; 
     writeln(a," + 1 is ",TestContract(a)); 
    } 
    catch (Exception e) 
    { 
     writeln(e); 
    } 
    return 0; 
} 

컴파일 및 DMD (v2.076.0 더러운),하지만 LDC (0.17.1) 또는 GDC (5.4.0 20160609)로 실행됩니다.

LDC는 말한다 :

contracts.d(12): Error: declaration expected, not 'do' 
contracts.d(15): Error: unrecognized declaration 

및 GDC는 말한다 :

contracts.d:12:1: error: declaration expected, not 'do' 
do 
^ 
contracts.d:15:1: error: unrecognized declaration 
} 

편집 : "몸"로 컴파일 대신 대답은 LDC와 성공에 따라, "할". 현재로서는 contract programming에 대한 dlang.org 문서 가능성이되지 않는 동안 가 여전히 작동하는지 언급하지 않으며, DMD의 버전 필요하다고

/usr/include/d/core/stdc/stdarg.d:48:5: error: undefined identifier __va_list_tag 
    alias __va_list = __va_list_tag; 

참고 : GDC는 새로운 컴파일 오류를 가져옵니다 [unknown version] 이전의 컴파일러와 dmd 프론트 엔드를 사용하는 gdc 또는 ldc의 모든 버전 (unknown 버전 이전).

+0

ldc (0.17.5)는'do'를 사용하고'body'를 사용하지 않고 나를 위해 일했습니다. dmd (2.077.0)도 효과가 있었으며 놀랄 일도 아닙니다. – Eljay

답변

2

body이 아니라 do을 사용하십시오. body 대신 do을 허용하는 것은 매우 최근의 일입니다. (현재의 dmd로 컴파일 되긴하지만, 그 변화가 받아 들여 졌음도 몰랐습니다.)

dmd, ldc 및 gdc는 모두 동일한 프런트 엔드를 공유하지만 모두 동일한 버전은 아닙니다. 가장 최근의 ldc를 사용하고 있어도 dmd 뒤에 적어도 하나의 릴리스가있을 수 있습니다. gdc의 개발 버전을 사용하지 않는 한 현재 way 뒤에 있습니다 (2.068 IIRC, dmd 2.077). 0이 현재 베타 버전 임), 다음 릴리스에서는 마침내 dmd (C++에서 D 로의 프론트 엔드 스위치가 주요 지연을 유발 함)에 상당히 근접해야합니다.

+0

감사합니다. 그들은 아마도 문서 페이지 - "23. 계약 프로그래밍"에 시체를 보여 주어야합니다. LDC가 본문을 처리 할 수 ​​있습니다. GDC가 __va_list_tag에 대한 새로운 오류를 가져옵니다. – Scooter

+0

'body '를 사용하지 않아도되는 사용자는'do '로 전환하고'body '에서 벗어나는 DIP가 키워드 인 경우 문서를 열심히 업데이트했습니다. 받아 들였다. 나는 왜 gdc가 실패하고 있는지 모르지만, 말했듯이, 개발 버전을 사용하지 않는다면 오히려 오래된 버전입니다. –

+0

gdc (5.4.0 20160609). 이 버전 번호는 gdcproject.org의 바이너리 버전을 사용하고 있음을 나타냅니다. 그런 다음 druntime 소스는'/ usr/include/d/core/stdc/stdarg.d'에 있지 않아야하며 아마도 LDC 또는 DMD에 속해야합니다. GDC는 항상'/ usr/include/d'에있는 추가 D 파일을 검색하므로 거기에 컴파일러 관련 include 파일 (druntime, phobos)을 두어서는 안됩니다. – jpf

2

예, ldc 및 gdc 모두 계약을 지원합니다. 최근 언어 변경입니다. dobody으로 바꾸면 컴파일됩니다. 항상 같은 D 프론트 엔드 버전을 사용하고 있다는 것에 주목해야한다. ldc은 예를 들어 ldc2 --version으로 표시합니다.

+1

LDC에서 작동하지만 gdc (5.4.0 20160609)와는 다른 오류가 발생합니다. 시체를 시도했지만 "23. 계약 프로그래밍"은 "할 일"만을 보여줍니다. 나는 "몸"을 다시 추가해야한다고 생각합니다. – Scooter

+2

변경 사유는 https://github.com/dlang/DIPs/blob/master/DIPs/DIP1003.md에서 확인할 수 있습니다. 나는 문서가'body' 키워드를 deprecated로 언급해야한다는 것에 동의한다. –