Поддерживают ли 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, например.

Другие вопросы по тегам