ldc和gdc是否支持D语言合同?
此代码包含一个合同:ldc和gdc是否支持D语言合同?,d,dmd,gdc,ldc,D,Dmd,Gdc,Ldc,此代码包含一个合同: 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 ",Tes
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)
最不发达国家说:
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;
请注意,目前的dlang.org文档中没有提到body,虽然可能已弃用,但仍然有效,并且对于早于[unknown version]的dmd编译器版本以及在[unknown version]之前使用dmd前端的任何gdc或ldc版本都是必需的。使用
body
,不do
。允许do
而不是body
是最近的事情(我甚至不知道这个更改已经被接受,尽管它是用当前的dmd编译的,所以我猜是这样)
dmd、ldc和gdc都共享同一个前端,但它们的版本不同。即使您使用的是最新的ldc,它也至少比dmd落后一个,也许是两个版本,除非您使用的是gdc的开发版本,否则它目前远远落后(它的IIRC为2.068,而DMD2.077.0目前处于测试阶段),尽管下一个版本最终应该与dmd相当接近(从C++到D的前端切换导致了它们的主要延迟)。 < P>使用代码>正文< /C> >,而不是<代码> do/COD>。允许<代码> do>代码>代替<代码>正文是一个很新的事情(我不知道这个改变甚至被接受,虽然它与当前DMD编译,所以我猜是这样)。< /P>
dmd、ldc和gdc都共享同一个前端,但它们的版本并不都相同。即使您使用的是最新的ldc,它也至少有一个,也许有两个版本落后于dmd,而且除非您使用的是gdc的开发版本,否则它目前远远落后(IIRC为2.068,而DMD2.077.0目前处于测试阶段)虽然下一个版本的发行版本应该相当接近DMD(前端交换机从C++到D导致了它们的主要延迟).是的,ldc和gdc都支持合同。这是最近的一次语言更改-将合同中的
do
替换为body
,并进行编译。您应该始终注意,您使用的是相同的D前端版本。ldc
显示为ldc2--version
。是的,ldc和gdc都支持端口合同。这是最近的一次语言更改-将合同中的do
替换为body
,然后进行编译。您应该始终注意,您使用的是相同的D前端版本。ldc
显示为ldc2--version
。谢谢。他们可能应该在文档p上显示body年龄-“23.合同编程”LDC可以处理body,GDC得到了一个关于uu va_list_tag的新错误一个不喜欢使用body
的人,当切换到do
并远离body
成为关键字的DIP被接受时,可能会急切地更新文档。我不知道GDC为什么会失败,但正如我所说的,除非你使用de开发版本,相当旧。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我正在Ubuntu 16.04上使用一个GDC,它来自通过Synaptic下载的GDC-5软件包。谢谢。它们可能应该在文档页面上显示正文-“23.合同编程”LDC可以处理body,GDC得到了一个关于uu va_list_tag的新错误一个不喜欢使用body
的人,当切换到do
并远离body
成为关键字的DIP被接受时,可能会急切地更新文档。我不知道GDC为什么会失败,但正如我所说的,除非你使用de开发版本,相当旧。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我在Ubuntu 16.04上使用一个GDC,它来自通过Synaptic下载的GDC-5软件包。它与LDC一起工作,但我在GDC(5.4.0 20160609)中遇到了一个不同的错误。我本应该尝试body,但“23.合同编程”只显示“do”。我认为“body”应重新添加。更改的原因如下:。我同意文档中应提及已弃用的body
关键字。这对LDC有效,但我在gdc(5.4.0 20160609)中遇到不同的错误。本应尝试body,但“23.合同编程”仅显示“do”。我认为“body”应该添加回来。更改的原因如下:。我同意文档中应该提到不推荐使用的body
关键字。ldc(0.17.5)对我有效,使用do
和notbody
。dmd(2.077.0)也有效,这并不奇怪。ldc(0.17.5)对我来说,使用do
和notbody
,dmd(2.077.0)也很有效,这并不奇怪。