Re: Sys.argv with interpreter and compiler

From: Jacques GARRIGUE (
Date: Fri Jul 09 1999 - 04:25:16 MET DST

Subject: Re: Sys.argv with interpreter and compiler
In-Reply-To: Your message of "Thu, 8 Jul 1999 13:39:02 +0200"
Message-Id: <>
Date: Fri, 09 Jul 1999 11:25:16 +0900
From: Jacques GARRIGUE <>

From: Damien Doligez <>

> >From: Jacques GARRIGUE <>
> >Particularly, since there is no way to change the contents of
> >Sys.argv, this means that you cannot easily use the Arg module in a
> >caml script. Silly.
> Sys.argv is an array, so it is mutable like all other arrays and you
> can change its contents. What's harder to do is to change its length,
> although you could do it with Obj.truncate (not recommended in
> general, except for people who know what they're doing, as usual with
> Obj).

Woh, that's subtle.
I was not aware of this new Obj operation.

So this means that you can add the following code at the beginning of
your scripts, and they will then work both compiled or executed by the

let _ =
  let ofs = ref 1 in
  while !ofs < Array.length Sys.argv
     && String.length Sys.argv.(!ofs) > 0 && Sys.argv.(!ofs).[0] = '-'
  do if Sys.argv.(!ofs) = "-I" then ofs := !ofs + 2 else incr ofs done;
  if !Sys.interactive && !ofs < Array.length Sys.argv then begin
    Array.blit Sys.argv !ofs Sys.argv 0 (Array.length Sys.argv - !ofs);
    Obj.truncate (Obj.repr Sys.argv) (Array.length Sys.argv - !ofs);
    Sys.interactive := false

Any pitfall ?
(Except that this depends heavily on the code in
This could be a library function, Sys.script_compatible : unit -> unit.

Jacques Garrigue Kyoto University garrigue at
                <A HREF=>JG</A>

This archive was generated by hypermail 2b29 : Sun Jan 02 2000 - 11:58:23 MET