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 前端版本。例如ldc
用ldc2 --version
表示。
此代码带有合约:
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 前端版本。例如ldc
用ldc2 --version
表示。