2017-09-14 5 views

Répondre

0

Voici les lignes problématiques qui sont à l'origine de la syntaxe d'erreur :

i --> [give (expr1 OE?) name (id-ref1 symbol?) in (expr2 OE?)] 
ii --> [(string-literal string?)] 
iii --> [(id-ref2 symbol?)] 

Comme indiqué dans le docs, define-type a la structure

(define-type type-id variant ...) 

variant = (variant-id (field-id contract-expr) ...) 

Donc, chaque variante doit avoir un variant-id, et chaque ID-champ doit avoir un contrat associé. La violation de ceci est la cause de l'erreur de syntaxe.

Dans le cas de (i), les deux contrats nom et à manque, donc une solution possible est d'ajouter des contrats dans les champs, en tant que tel (en utilisant string? comme un contrat par exemple):

[give (expr1 OE?) (name string?) (id-ref1 symbol?) (in string?) (expr2 OE?)] 

les deux (ii) et (iii) manque variante ids, afin de les ajouter vont résoudre le problème:

[some-variant-id (string-literal string?)] 
[some-other-variant-id (id-ref2 symbol?)] 

est ici une ré-écriture possible du type, avec des modifications proposées:

(define-type OE 
    (group (expr1 OE?) (expr2 OE?)) 
    (sequentially (expr1 OE?) (expr2 OE?)) 
    (together (expr1 OE?) (expr2 OE?)) 
    (join (expr1 OE?) (expr2 OE?)) 
    (arrive (expr OE?)) 
    (give (expr1 OE?) (name string?) (id-ref1 symbol?) (in string?) (expr2 OE?)) 
    (some-variant-id (string-literal string?)) 
    (some-other-variant-id (id-ref2 symbol?))) 
+0

Cela est logique, je vous remercie beaucoup! – thehammerstein