Поддерживают ли 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-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 для программирования по контракту не упоминает это тело, хотя оно, вероятно, устарело, все еще работает и необходимо для версий компилятора dmd, более ранних, чем [неизвестная версия], и любых версий gdc или ldc, которые используйте интерфейс dmd до версии [неизвестная версия].
2 ответа
Использование body
не do
, позволяющий do
вместо body
это очень недавняя вещь (я не знал, что это изменение было даже принято, хотя оно компилируется с текущим dmd, так что, я думаю, это было).
Все dmd, ldc и gdc имеют один и тот же внешний интерфейс, но не все имеют одинаковую версию. Даже если вы используете самый последний ldc, он стоит как минимум один, может быть, два выпуска за dmd, и если вы не используете версию gdc для разработки, в настоящее время он сильно отстает (это 2.068 IIRC, тогда как dmd 2.077.0 в бета-версии на данный момент), хотя следующий выпуск, который они делают, должен, наконец, быть довольно близок к dmd (переключение внешнего интерфейса с C++ на D вызвало у них большие задержки).
Да, ldc и gdc поддерживают контракты. Это недавнее изменение языка - заменить do
с body
в договоре и он компилируется. Вы всегда должны обращать внимание на то, что вы используете одну и ту же версию D-интерфейса. ldc
показывает это с ldc2 --version
, например.