ldc和gdc支持D语言契约吗?

Do ldc and gdc support D language contracts?

此代码带有合约:

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-dirty) 编译和运行,但不使用 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
 }

编辑:使用 "body" 而不是 "do" 进行编译,根据 ldc 的成功答案。 gdc 得到一个新的编译错误:

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

请注意,目前 contract programming 的 dlang.org 文档没有提到 body,虽然可能已弃用,但仍然有效,并且是必要的对于早于 [未知版本] 的 dmd 编译器版本和任何使用版本 [未知版本] 之前的 dmd 前端的 gdc 或 ldc 版本。

使用 body,而不是 do。允许 do 而不是 body 是最近发生的事情(我不知道该更改甚至已被接受,尽管它使用当前的 dmd 编译,所以我猜它是)。

dmd、ldc 和 gdc 都共享相同的前端,但它们的版本不同。即使您使用的是最新的 ldc,它至少比 dmd 落后一个,也许两个版本,除非您使用的是 gdc 的开发版本,否则它目前落后 way(它是在 2.068 IIRC,而 dmd 2.077.0 目前处于测试阶段),尽管他们所做的下一个版本最终应该相当接近 dmd(从 C++ 到 D 的前端切换对他们造成了重大延迟)。

是的,ldc 和 gdc 都支持合约。这是最近的语言更改 - 在合同中将 do 替换为 body 并进行编译。您应该始终注意您使用的是相同的 D 前端版本。例如ldcldc2 --version表示。