2017-10-21 7 views
1

Ce code avec un contrat:Est-ce que ldc et gdc supportent les contrats en langage 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; 
} 

compile, et fonctionne avec DMD (v2.076.0-sale), mais pas ldc (0.17.1) ou gdc (5.4.0 20160609).

ldc dit:

contracts.d(12): Error: declaration expected, not 'do' 
contracts.d(15): Error: unrecognized declaration 

et gdc dit:

contracts.d:12:1: error: declaration expected, not 'do' 
do 
^ 
contracts.d:15:1: error: unrecognized declaration 
} 

Edit: Compiler avec "corps" au lieu de "faire", par la réponse réussit avec PMD. gdc obtient une nouvelle compilation erreur:

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

Notez que à l'heure actuelle la documentation dlang.org pour contract programming ne mentionne pas que corps, tandis que dépréciée probablement, fonctionne toujours, et il est nécessaire pour les versions de la DMD compilateur plus tôt que [version inconnue] et toutes les versions de gdc ou ldc qui utilisent un frontal dmd avant la version [version inconnue].

+0

ldc (0.17.5) a fonctionné pour moi, en utilisant 'do' et non' body'. Et dmd (2.077.0) a également fonctionné, ce qui n'est pas une surprise. – Eljay

Répondre

2

Utilisez body, et non do. Permettre do au lieu de body est une chose très récente (je ne savais pas que ce changement avait même été accepté, bien qu'il compile avec le dmd actuel, donc je suppose que c'était le cas). Dmd, ldc et gdc partagent tous le même frontend, mais ils n'ont pas tous la même version. Même si vous utilisez ldc le plus récent, il existe au moins un, peut-être deux versions derrière dmd, et à moins que vous n'utilisiez une version de développement de gdc, il est chemin derrière (il est à 2.068 IIRC, alors que dmd 2.077. 0 est en version bêta pour le moment), même si la prochaine version devrait finalement être assez proche de dmd (le changement de frontend de C++ à D a causé des retards importants pour eux).

+0

Merci. Ils devraient probablement montrer le corps sur la page de documentation - "23. Programmation de contrat". LDC peut gérer le corps, GDC obtient une nouvelle erreur sur __va_list_tag – Scooter

+0

Quelqu'un qui n'a pas aimé utiliser 'body' a probablement mis à jour la documentation avec impatience quand le DIP pour passer à' do' et s'éloigner de 'body' étant un mot clé était accepté. Je ne sais pas pourquoi gdc échoue, mais comme je l'ai dit, à moins que vous n'utilisiez une version de développement, c'est plutôt vieux. –

+0

gdc (5.4.0 20160609). Ce numéro de version suggère que vous utilisez une version binaire de gdcproject.org? Alors les sources druntime ne devraient pas être situées dans/usr/include/d/noyau/stdc/stdarg.d et appartiennent probablement à LDC ou DMD. GDC recherche toujours des fichiers D supplémentaires dans '/ usr/include/d', donc vous ne devriez pas y placer de fichiers d'inclusion spécifiques au compilateur (druntime, phobos). – jpf

2

Oui, ldc et gdc prennent tous deux en charge les contrats. Ceci est un changement de langue récent - remplacez do par body dans le contrat et il compile. Vous devriez toujours faire attention à ce que vous utilisez la même version D frontend. ldc le montre avec ldc2 --version, par exemple.

+1

Cela fonctionne avec LDC, mais j'obtiens une erreur différente avec gdc (5.4.0 20160609). Aurait essayé corps, mais "23. Contract Programming" montre seulement "faire". Je pense que "corps" devrait être ajouté. – Scooter

+2

Les raisons de la modification sont indiquées ici: https://github.com/dlang/DIPs/blob/master/DIPs/DIP1003.md. Je suis d'accord que la documentation devrait mentionner le mot-clé 'body' comme obsolète. –