IMHO, this is the right behavior. When walking over strings, it is often practical to consider the position after the last character as legal position. So far I see, this is consistent in the String module, e.g. you can also do String.sub "abc" 3 0. It's a bit like considering 0 as natural number. Gerd Am Montag, den 12.08.2013, 12:55 +0200 schrieb Florent Monnier: > Hi, > > Is this the expected behavior? > > # let s = "012" ;; > val s : string = "012" > > # String.index_from s 1 '1' ;; > - : int = 1 > # String.index_from s 2 '2' ;; > - : int = 2 > # String.index_from s 3 '3' ;; > Exception: Not_found. > # String.index_from s 4 '4' ;; > Exception: Invalid_argument "String.index_from". > > (* ====================== *) > > # String.rindex_from s 1 '1' ;; > - : int = 1 > # String.rindex_from s 0 '0' ;; > - : int = 0 > # String.rindex_from s (-1) '#' ;; > Exception: Not_found. > # String.rindex_from s (-2) '#' ;; > Exception: Invalid_argument "String.rindex_from". > > (* ====================== *) > > # String.contains_from s 2 '2' ;; > - : bool = true > # String.contains_from s 3 '2' ;; > - : bool = false > # String.contains_from s 4 '2' ;; > Exception: Invalid_argument "String.contains_from". > > (* ====================== *) > > If yes, please just ignore this email. > > If no, here is a patch for the file "string.ml": > http://caml.inria.fr/cgi-bin/viewvc.cgi/ocaml/trunk/stdlib/string.ml?view=markup&pathrev=13748 > > ### return exception Invalid_argument instead of false or Not_found > ### when the index is out of bounds. > --- stdlib/string.ml.orig 2013-08-12 12:42:17.443013642 +0200 > +++ stdlib/string.ml 2013-08-12 12:43:24.973014347 +0200 > @@ -176,7 +176,7 @@ > > let index_from s i c = > let l = length s in > - if i < 0 || i > l then invalid_arg "String.index_from" else > + if i < 0 || i >= l then invalid_arg "String.index_from" else > index_rec s l i c;; > > let rec rindex_rec s i c = > @@ -186,12 +186,12 @@ > let rindex s c = rindex_rec s (length s - 1) c;; > > let rindex_from s i c = > - if i < -1 || i >= length s then invalid_arg "String.rindex_from" else > + if i < 0 || i >= length s then invalid_arg "String.rindex_from" else > rindex_rec s i c;; > > let contains_from s i c = > let l = length s in > - if i < 0 || i > l then invalid_arg "String.contains_from" else > + if i < 0 || i >= l then invalid_arg "String.contains_from" else > try ignore (index_rec s l i c); true with Not_found -> false;; > > let contains s c = contains_from s 0 c;; > (* ====================== *) > > > The behavior of these functions is then to raise > an Invalid_argument exception if the index is out of bounds: > > # let s = "012" ;; > val s : string = "012" > > # String.index_from s 3 '3' ;; > Exception: Invalid_argument "String.index_from". > > # String.rindex_from s (-1) '#' ;; > Exception: Invalid_argument "String.rindex_from". > > # String.contains_from s 3 '2' ;; > Exception: Invalid_argument "String.contains_from". > > (* ====================== *) > > -- > Best regards > florent > -- ------------------------------------------------------------ Gerd Stolpmann, Darmstadt, Germany gerd@gerd-stolpmann.de My OCaml site: http://www.camlcity.org Contact details: http://www.camlcity.org/contact.html Company homepage: http://www.gerd-stolpmann.de ------------------------------------------------------------