2017-06-12 2 views
0

Je reçois cette erreur de syntaxe bizarre dans le niveau supérieur OCaml.OCaml Erreur de double point-virgule dans Toplevel

# #use "ex_8_4.ml";; 
type blob = { 
    get : unit -> float * float; 
    area : unit -> float; 
    set : float * float -> unit; 
    move : float * float -> unit; 
} 
val new_rectangle : float -> float -> float -> float -> blob = <fun> 
# let rect1 = new_rectangle 0.0 0.0 1.0 1.0 in 
    let rect2 = {rect1 with set = (fun _ ->())};; 
Error: Syntax error 

La copie n'a pas réussi à inclure que les points-virgules sont soulignés dans l'erreur.

Répondre

5

Cela arrive parce que le toplevel attend un mot-clé in au lieu de points-virgules:

> let a = 1 in let b = 2;; 
Error: Syntax error 

Une solution serait d'ajouter un in à la fin:

> let a = 1 in let b = 2 in a + b;; 
- : int = 3 

Mais le plus simple serait de terminer chaque liaison avec des points-virgules:

> let a = 1;; 
val a : int = 1 
> let b = 2;; 
val b : int = 2 
> a + b;; 
- : int = 3 
+0

me arrive tout le temps. Je souhaite que les erreurs de syntaxe d'OCaml soient un peu plus expressives. – RichouHunter

+0

@RichouHunter Je vous entends. J'ai récemment commencé à utiliser OCaml et j'ai été fondamentalement choqué que "Erreur de syntaxe" soit le message d'erreur complet que nous donnons quand quelque chose ne va pas avec la syntaxe. Et celui-ci en particulier avec un jeton «in» manquant est odieux. J'ai récemment perdu 10 minutes à traquer une telle erreur. –

+0

Juste un petit commentaire pour vous remercier, Ionut, d'avoir édité les tags sur https://stackoverflow.com/questions/44470095/further-refining-the-signature-of-a-nested-module-in-the-signature- of-the-parent/44470369 # 44470369 (Je ne savais pas où mettre mes remerciements ailleurs, mais je vais supprimer ce commentaire après un certain temps ;-)) – Lhooq

0

Ionuţ G. Stan la réponse est correcte si ce que vous voulez définir rect1 pour une utilisation future, ou si cela ne vous dérange pas qu'il est défini. Si vous vouliez rect1 à définir uniquement pour une utilisation locale dans la définition rect2, vous pouvez utiliser cette méthode:

# type ints = {a : int; b : int};; 
(* type ints = { a : int; b : int; } *) 
# let y = 
    let x = {a = 1; b = 2} in 
    {x with b = 5};; 
(* val y : ints = {a = 1; b = 5} *) 
# x;; 
(* Error: Unbound value x *)