2

I have hello.ml that has a length function:

let rec length l = 
    match l with
        [] -> 0
    | h::t -> 1 + length t ;;

call.ml that uses the function:

#use "hello.ml" ;; 

print_int (length [1;2;4;5;6;7]) ;;

In interpreter mode (ocaml), I can use ocaml call.ml to get the results, but when I tried to compile it with ocamlc or ocamlbuild, I got compilation error.

File "call.ml", line 1, characters 0-1:
Error: Syntax error

Then, how to modify the caller, callee, and build command to compile the code into executables?

Pascal Cuoq
  • 79,187
  • 7
  • 161
  • 281
prosseek
  • 182,215
  • 215
  • 566
  • 871

2 Answers2

3

The #use directive only works in the toplevel (the interpreter). In compiled code you should use the module name: Hello.length.

I'll show how to build the program from a Unix-like command line. You'll have to adapt this to your environment:

$ ocamlc -o call hello.ml call.ml
$ ./call
6
Jeffrey Scofield
  • 65,646
  • 2
  • 72
  • 108
3

hello.ml

let rec length l = 
    match l with
        [] -> 0
    | h::t -> 1 + length t ;;

call.ml

open Hello

let () = print_int (Hello.length [1;2;4;5;6;7]) ;;

Build

ocamlc -o h hello.ml call.ml   

or

ocamlbuild call.native 
prosseek
  • 182,215
  • 215
  • 566
  • 871
  • Why do you declare a module `Hello` inside your `Hello` module? It's useless and quite confusing... – PatJ Feb 27 '15 at 11:47