Version française
Home     About     Download     Resources     Contact us    

This site is updated infrequently. For up-to-date information, please visit the new OCaml website at

Browse thread
Code-execution (evaluation) time
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: 2010-10-19 (19:54)
From: David Allsopp <dra-news@m...>
Subject: RE: [Caml-list] Code-execution (evaluation) time
Oliver Bandel wrote:
> Hello,
> I want to refresh my OCaml knowledge after I (again) paused for a while.
> I want to know, when certain parts of the code are executed,
> for example if I have more than one   let _ = ...
> statement in my code (for example in different comp0ilaion units each one
> of them).

Expressions (as in, things listed in are evaluated in the order in which they appear in a source file. If you have two files and which contain top-level statements, the order in which they execute will depend on the order in which you link the resulting .cmo or .cmx files (which should be left-to-right as passed to ocamlc/ocamlopt - don't know where that's specified).

As far as I can see, in pretty much all contexts within an expression where order of evaluation could matter including, but probably not limited to:

* Record initialisation (e.g. let i = ref 0 in {a = (incr i; !i); b = (incr i; !i)})
* Function application (similarly)
* let foo = _ and bar = _ in _

are intentionally left as unspecified (in practice, application and record initialisation are right-to-left and let x = _ and y = _ is left-to-right but the point is that you are never supposed to rely on that).

> I also found an old code snippet with the following parts:
> ==============================
> let fnames = Sys.argv)
> (* some more code *)
> let _ =
>    List.iter print_days_old fnames
> ==============================
> So, the value fnames contains the args from the command line and can be
> used in the first statement of the code.

[let fnames = ..] is a complete expression so it's evaluated before the [let _] further down.