2017-05-25 3 views
0

Le code suivant du chapitre 17 Real World OCaml: sérialisation de données avec la page S-expressions 339 n'est pas compilent sur utop:Se plaindre par défaut dans OCaml

type http_server_config = { web_root: string; 
port: int with default(80); 
addr: string with default("localhost"); 
} [@@deriving sexp] ;; 

Il se plaint de la with dans port: int with default(80);

Merci!

+3

Ceci n'est pas standard [ocaml] (http://caml.inria.fr/pub/docs/manual-ocaml/). Il y a un pré-traitement supplémentaire impliqué. 'default' n'est pas un mot-clé Ocaml. –

Répondre

3

Dans les versions récentes de la bibliothèque principale de Janestreet, toutes les extensions de syntaxe ont été converties des extensions camlp4 en extensions ppx. Par conséquent, vous devez malheureusement adapter la syntaxe de tous les exemples en utilisant des extensions de syntaxe dans Real World OCaml.

Heureusement, contrairement aux extensions camlp4, les extensions ppx ne peuvent pas modifier de manière folle la syntaxe OCaml. Tout au plus, ils peuvent utiliser une syntaxe légèrement étendue par rapport à OCaml vanille, qui ajoute des nœuds d'extension et des attributs.

En particulier, cela signifie que, puisque field:type with … n'est pas synctatiquement valide pour OCaml vanille, il ne s'agit pas non plus d'une syntaxe valide avec l'extension ppx_sexp_conv activée. Dans votre cas, l'annotation valeur par défaut doit être écrit comme un attribut des champs correspondants:

type http_server_config = { 
    web_root: string; 
    port: int [@default 80]; 
    addr: string [@default "localhost"]; 
} [@@deriving sexp] ;; 

Notez que pour travailler en utop vous devez d'abord avoir exigé l'extension ppx_sexp_conv et ouvert par défaut module d'exécution:

#require "ppx_sexp_conv";; 
open Sexplib.Std ;; 
type http_server_config = { 
    web_root: string; 
    port: int [@default 80]; 
    addr: string [@default "localhost"]; 
} [@@deriving sexp] ;; 
0

Les exemples dans Real World OCaml supposent que Core est installé, ce qui inclut certaines extensions de syntaxe. J'ai suivi les instructions d'installation here et je vois toujours le même problème que vous voyez.

Lorsque j'ai essayé d'installer le module extension syntaxe, j'ai vu ceci:

utop # #camlp4o;; 
utop was built without camlp4 support. 

Alors, je conclus qu'il est un peu difficile à mettre en place l'environnement que le monde réel OCaml attend.

Quoi qu'il en soit, @Basile_Starynkevitch est correct. Le code utilise des extensions de syntaxe qui ne sont pas supportées dans votre utop.