2017-10-21 18 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は、新しいコンパイルエラーを取得しますコンパイラは[未知のバージョン]より前のコンパイラと、バージョン[未知のバージョン]よりも前にdmdフロントエンドを使用するgdcまたはldcのすべてのバージョンです。

+0

ldc(0.17.5)は、私のために 'do'を使って動作し、' body'は使用しませんでした。 dmd(2.077.0)もうまくいきました。驚くことではありません。おかげさまで – Eljay

答えて

2

bodyではなく、doを使用してください。最近のことはbodyの代わりにdoを許可することです(私はその変更が受け入れられたことに気づいていませんでしたが、それは現在のdmdとコンパイルされているためです)。

dmd、ldc、およびgdcはすべて同じフロントエンドを共有しますが、すべて同じバージョンではありません。最新のldcを使用していても、dmdの後ろに少なくとも1つ、おそらくは2つのリリースがあります。開発バージョンのgdcを使用していない限り、現在の方法(2.068 IIRC、dmd 2.077)です。 0は現時点ではベータ版です)、次回のリリースでは最終的にdmd(C++からDへのフロントエンドスイッチは大きな遅延を引き起こしました)にかなり近いはずです。

+0

彼らはおそらく、ドキュメンテーションページの "23. Contract Programming"の本文を表示しなければなりません。 LDCはbodyを扱うことができますが、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個の追加ファイルを探しますので、そこにコンパイラ固有のインクルードファイル(druntime、phobos)を置いてはいけません。 – jpf

2

はい、ldcとgdcはどちらも契約をサポートしています。これは最近の言語変更です。dobodyに置き換えてコンパイルします。あなたは常に同じDフロントエンドバージョンを使用していることに注意する必要があります。 ldcは、例えばldc2 --versionと表示されます。

+1

これはLDCで動作しますが、gdc(5.4.0 20160609)とは異なるエラーが発生します。体を試してみましたが、 "23. Contract Programming"は "do"しか表示しません。私は "身体"を取り戻すべきだと思う。 – Scooter

+2

変更理由は次のとおりです:https://github.com/dlang/DIPs/blob/master/DIPs/DIP1003.md。ドキュメンテーションは、 'body'キーワードが非難されたものとして言及すべきであることに同意します。 –

関連する問題