2017-02-13 1 views
3

Je prépare un projet d'introduction OCaml pour une classe CS et une partie de celui-ci implique la mise en œuvre des opérations de liste. Je veux qu'ils puissent utiliser Pervasives, mais pas List ou tout autre module de bibliothèque standard. Existe-t-il un moyen de configurer ocamlbuild pour qu'il ne soit lié qu'à des Pervasives dans la bibliothèque standard?Ne liez pas tous les modules bibliothèque standard lorsque vous compilez OCaml

Répondre

1

Je vois deux possibilités: soit retirer le module directement à partir de la bibliothèque standard OCaml ou les masquer par une surcharge avec un module avec signature différente (éventuellement vide).

La première variante nécessite la distribution OCaml d'édition Makefile. Avec l'opam et ce n'est pas si effrayant, en fait, car vous pouvez facilement corriger OCaml et distribuer chaque OCaml corrigé en tant que compilateur séparé. Pour supprimer le module de l'archive stdlib, vous devez modifier stdlib/Makefile.shared, stdlib/StdlibModules et stdlib.mllib. Une fois que vous avez supprimé les modules inutiles, vous pouvez le faire:

./configure 
make world.opt 
make install 

Une autre option consiste à (ab) utilisez l'argument de ligne de commande -open de ocamlc. Lorsque cette option est spécifiée avec le nom d'un module, ce module sera automatiquement ouvert dans le programme compilé. Par exemple, vous pouvez écrire votre propre superposition sur une bibliothèque standard, qui a l'interface suivante (minimal.mli):

module List = sig end (* or whatever you want to expose *) 

et vous pouvez compiler soit avec ocamlc -open minimal ..., ou, avec ocamlbuild: ocamlbuild -cflags -open,minimal ... (vous pouvez aussi utiliser _tags fichier pour passer le drapeau ouvert, ou écrire un plugin ocamlbuild).

+0

Je pense que pour nos besoins, cacher le module List avec une signature de module vide est une solution parfaite! Je ne sais pas pourquoi je n'y ai pas pensé. Merci beaucoup! – SaxSalute

2

Vous pouvez utiliser l'option -nostdlib des compilateurs, mais qui se cacheront à la fois Pervasives et List.

Ce que vous voulez est difficile à réaliser puisque les deux unités de compilation font partie de la même archive bibliothèque à savoir stdlib.cma.

Vous pourriez peut-être essayer de compiler votre propre copie de Pervasives et utiliser le drapeau ci-dessus.

+0

Bonne réponse. @SaxSalute: assurez-vous de mettre pervasives.cm [oi] dans le répertoire de travail, mais ne mettez pas le .ml. Vous ne voulez vraiment pas que vos élèves regardent ce code. – PatJ