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 <Fabrice.Le_fessant@inria.fr>:
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 <philippe.veber@gmail.com> 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 <sheets@alum.mit.edu>:

On Tue, Jul 1, 2014 at 5:38 PM, Philippe Veber <philippe.veber@gmail.com> wrote:
> Reposting this question here, just in case.
>
> ---------- Forwarded message ----------
> From: Philippe Veber <philippe.veber@gmail.com>
> 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