Yet another option is to use ocamlscript. The following works: $ cat script.ml #! /usr/bin/env ocamlscript Ocaml.ocamlflags := ["-thread"]; Ocaml.packs := ["sexplib.syntax"] -- open Sexplib.Std type t = int with sexp $ ./script.ml (* compiles without error *) On Wed, Jul 2, 2014 at 10:48 AM, Philippe Veber wrote: > Thanks Romain, I'll rather use Fabrice's suggestion, which handles > command-line argument more simply. > > Cheers, > > Philippe. > > > 2014-07-02 14:01 GMT+02:00 Romain Bardou : > > You could write a wrapper which start the ocaml process, sends a string >> containing something like: >> >> module Sys = >> struct >> include Sys >> let argv = ... (* fill this *) >> end >> >> to the ocaml process (replace the ... by the arguments given to the >> wrapper, using the array syntax, and don't forget that the first cell >> must contain the executable path), and then pass the contents of your >> script.ml. >> >> This does not work if your script uses other modules which themselves >> use Sys.argv. >> >> Cheers, >> >> -- Romain Bardou >> >> On 02/07/2014 13:48, Philippe Veber wrote: >> > Thanks Fabrice, this perfectly explains what I observe. Is this behavior >> > considered the right one? Reading from a pipe is regretfully not an >> > option for me, as my script has command line arguments. Hence when I >> type: >> > >> > cat script.ml | ocaml --foo --bar 1 >> > >> > the toplevel complains it knows nothing about the arguments foo and bar. >> > A "--" argument would be useful but it seems not available. If it's so, >> > I'll file a feature request on Mantis, since without it, there seems to >> > be no way to give a script to the toplevel that both takes command line >> > arguments and uses a syntax extension. >> > >> > Thanks again! >> > >> > >> > >> > 2014-07-02 10:08 GMT+02:00 Fabrice Le Fessant >> > >: >> > >> > If I remember well, I think "ocaml" has a different behavior >> > depending on what it reads from: >> > * From a pipe, it parses every sentence and execute each one >> > immediatly. >> > * From a file, it tries to parse the whole file, and then executes >> > everything. >> > >> > In the second case, it means it will only execute the load of the >> > syntax extension after parsing the whole file... which will fail, >> > since the syntax extension is needed for that. >> > >> > --Fabrice >> > INRIA & OCamlPro >> > >> > >> > >> > On Tue, Jul 1, 2014 at 7:06 PM, Philippe Veber >> > > wrote: >> > >> > Thanks David! >> > >> > The first call fails with a syntax error on "with sexp": >> > >> > [pbil:~ 18:58]$cat rien.ml >> > >> > let () = >> > try Topdirs.dir_directory (Sys.getenv "OCAML_TOPLEVEL_PATH") >> > with Not_found -> () >> > ;; >> > >> > #use "topfind";; >> > #camlp4o;; >> > #require " sexplib.syntax";; >> > >> > open Sexplib.Std;; >> > >> > type t = int with sexp;; >> > >> > [pbil:~ 18:58]$ocaml rien.ml >> > File "rien.ml ", line 12, characters 13-17: >> > Error: Syntax error >> > >> > It seems like the sexp syntax extension is not loaded when the >> > script is evaluated. But it's not really clear to me what going >> > wrong... >> > >> > Cheers! >> > ph. >> > >> > >> > >> > 2014-07-01 18:51 GMT+02:00 David Sheets > > >: >> > >> > On Tue, Jul 1, 2014 at 5:38 PM, Philippe Veber >> > > >> >> > wrote: >> > > Reposting this question here, just in case. >> > > >> > > ---------- Forwarded message ---------- >> > > From: Philippe Veber > > > >> > > Date: 2014-06-28 21:32 GMT+02:00 >> > > Subject: Toplevel and syntax extension. >> > > To: ocaml_beginners@yahoogroups.com >> > >> > > >> > > >> > > Dear camlers, >> > > >> > > Consider the following script: >> > > >> > > #use "topfind";; >> > > #camlp4o;; >> > > #require "sexplib.syntax";; >> > > >> > > open Sexplib.Std;; >> > > >> > > type t = int with sexp;; >> > > >> > > Saved as script.ml , the simple call: >> > > >> > > ocaml script.ml >> > > >> > > fails while the call: >> > > >> > > cat script.ml | ocaml >> > > >> > > succeeds. Any idea how I could fix the first call? >> > >> > How does the first call fail? A difference between the two >> > is that, in >> > the second, the .ocamlinit file is used. If you are using >> > opam with >> > ocamlfind installed via it, this file will contain your >> > Topdirs setup. >> > You can try: >> > >> > let () = >> > try Topdirs.dir_directory (Sys.getenv >> "OCAML_TOPLEVEL_PATH") >> > with Not_found -> () >> > ;; >> > >> > at the top of your script (after hashbang but before >> > directives). >> > >> > Hope this helps, >> > >> > David >> > >> > >> > >> > >> > >> > -- >> > Fabrice LE FESSANT >> > Chercheur en Informatique >> > INRIA Paris Rocquencourt -- OCamlPro >> > Programming Languages and Distributed Systems >> > >> > >> >> >