From: Brian B. <bri...@gm...> - 2005-10-25 00:39:49
|
Hi, thanks for extlib! ExtString.String.slice doesn't live up to its documentation of never raising an exception. It fails to check if ~last is out of range, and crashes in String.sub. Is it best to report bugs here, or in the tracker? -- Bri...@it...____Wit____Disclaimer____!Shortsig_rules! |
From: Amit D. <ami...@gm...> - 2005-10-25 09:50:20
|
I see the problem. I think there may be another problem if first < -(length s). Is it best to fix these bugs, or change the documentation? -Amit On 10/25/05, Brian Brunswick <bri...@gm...> wrote: > > Hi, thanks for extlib! > > ExtString.String.slice doesn't live up to its documentation of never > raising an exception. It fails to check if ~last is out of range, and > crashes in String.sub. > > Is it best to report bugs here, or in the tracker? > > -- > Bri...@it... > ____Wit____Disclaimer____!Shortsig_rules! > > > ------------------------------------------------------- > This SF.Net email is sponsored by the JBoss Inc. > Get Certified Today * Register for a JBoss Training Course > Free Certification Exam for All Training Attendees Through End of 2005 > Visit http://www.jboss.com/services/certification for more information > _______________________________________________ > ocaml-lib-devel mailing list > oca...@li... > https://lists.sourceforge.net/lists/listinfo/ocaml-lib-devel > |
From: Brian B. <bri...@gm...> - 2005-10-25 11:19:07
|
On 25/10/05, Amit Dubey <ami...@gm...> wrote: > I see the problem. I think there may be another problem if first < -(len= gth > s). Is it best to fix these bugs, or change the documentation? > My opinion would be fix the problem, since we already have String.sub to throw exceptions. Generally, I reckon its nice to have both exception and non-exception versions of things. Eg on the project I used String.slice in, I wanted a version of List.combine, but with the spec of Haskell zip, ie just discarding extra length. It might be reasonable to add that family too. -- Bri...@it...____Wit____Disclaimer____!Shortsig_rules! |
From: Amit D. <ami...@gm...> - 2005-10-25 12:07:31
|
On 10/25/05, Brian Brunswick <bri...@gm...> wrote: > > On 25/10/05, Amit Dubey <ami...@gm...> wrote: > > I see the problem. I think there may be another problem if first < > -(length > > s). Is it best to fix these bugs, or change the documentation? > > > > My opinion would be fix the problem, since we already have String.sub > to throw exceptions. OK, but this raises two questions: (1) what would be the behaviour when (length s) <=3D i < 2 * (length s). Similar to when 0 > i > -1 * (length s) (i.e. substact length s)? (2) what about when i < -2 * (length s) or i >=3D 2 * (length s)? (Where i =3D first/last) Eg on the project I used String.slice in, I wanted a version of > List.combine, but with the spec of Haskell zip, ie just discarding > extra length. It might be reasonable to add that family too. What about meeting halfway and adding a function like truncate pair: let truncate_pair xl yl =3D let rec aux accu_x accu_y xl yl =3D match xl,yl with | x::xs, y::ys -> aux (x::accu_x) (y::accu_y) xs ys | _, _ -> (rev accu_x, rev accu_y) in aux [] [] xl yl -Amit |
From: skaller <sk...@us...> - 2005-10-25 13:50:45
|
On Tue, 2005-10-25 at 13:07 +0100, Amit Dubey wrote: > On 10/25/05, Brian Brunswick <bri...@gm...> wrote: > On 25/10/05, Amit Dubey <ami...@gm...> wrote: > > I see the problem. I think there may be another problem if > first < -(length > > s). Is it best to fix these bugs, or change the > documentation? > > > > My opinion would be fix the problem, since we already have > String.sub > to throw exceptions. > > > OK, but this raises two questions: > (1) what would be the behaviour when (length s) <= i < 2 * (length > s). Similar to when 0 > i > -1 * (length s) (i.e. substact length s)? > (2) what about when i < -2 * (length s) or i >= 2 * (length s)? > (Where i = first/last) > What Python does. See the Python reference manual. -- John Skaller <skaller at users dot sf dot net> Felix, successor to C++: http://felix.sf.net |
From: Brian B. <bri...@gm...> - 2005-10-25 12:38:36
|
On 25/10/05, Amit Dubey <ami...@gm...> wrote: > On 10/25/05, Brian Brunswick <bri...@gm...> wrote: > > On 25/10/05, Amit Dubey <ami...@gm...> wrote: > > > I see the problem. I think there may be another problem if first < > -(length > > > s). Is it best to fix these bugs, or change the documentation? > > > > > > > My opinion would be fix the problem, since we already have String.sub > > to throw exceptions. > > > OK, but this raises two questions: > (1) what would be the behaviour when (length s) <=3D i < 2 * (length s)= . > Similar to when 0 > i > -1 * (length s) (i.e. substact length s)? > (2) what about when i < -2 * (length s) or i >=3D 2 * (length s)? > (Where i =3D first/last) > > I'll continue inflicting my opinion on the list:-) I would say no, it shouldn't wrap again. I think its useful behaviour to have endpoints that silently truncate, and not useful to have ones that wrap around. The wrapping at zero is useful because it gives a reference relative to the end of the string, and not because it wraps. I'll wager that people practically never have code that generates some positive and some negative offsets by arithmetic for the same argument= . So we do: let i =3D if i>=3D0 then min i len else max 0 (len - i) for both first and last, and then if last<first "" else .... > What about meeting halfway and adding a function like truncate pair: > > let truncate_pair xl yl =3D > let rec aux accu_x accu_y xl yl =3D match xl,yl with > | x::xs, y::ys -> aux (x::accu_x) (y::accu_y) xs ys > | _, _ -> (rev accu_x, rev accu_y) > in > aux [] [] xl yl > > -Amit > Yes, we want that as well. I'd still be tempted to add most of the Haskell list ones too, simply on the basis that people might be familiar with them. -- Bri...@it...____Wit____Disclaimer____!Shortsig_rules! |
From: Brian B. <bri...@gm...> - 2005-10-25 12:37:55
|
On 25/10/05, Brian Brunswick <bri...@gm...> wrote: > So we do: let i =3D if i>=3D0 then min i len else max 0 (len - i) > for both first and last, and then if last<first "" else .... Spot the deliberate mistake :-) above.... -- Bri...@it...____Wit____Disclaimer____!Shortsig_rules! |
From: Brian H. <bh...@sp...> - 2005-10-25 15:04:14
|
On Tue, 25 Oct 2005, Brian Brunswick wrote: > I'll continue inflicting my opinion on the list:-) Ditto :-) > > I would say no, it shouldn't wrap again. I think its useful behaviour > to have endpoints that silently truncate, and not useful to have ones > that wrap around. Wrapping also brings up the possibility of the substring operation returning a string that is *longer* than the original string. Consider the case where I ask for the substring going from index -2 to (String.length s) - 1 inclusive. How long of a string should this return? One possible returns a string of length 2 (containing characters -2 and -1 inclusive), and another says it should return a string of length (String.length s) + 2, with characters -2 and -1 duplicated twice, once at the begining of the string and once at the end. Now, what happens when I ask for the string going from -(String.length s) - 2 to 2*(String.length s)? And so on. Brian |
From: Bardur A. <sp...@sc...> - 2005-11-15 16:26:08
|
Brian Brunswick wrote: > Hi, thanks for extlib! > > ExtString.String.slice doesn't live up to its documentation of never > raising an exception. It fails to check if ~last is out of range, and > crashes in String.sub. > > Is it best to report bugs here, or in the tracker? > > -- I notice there's been no commit to the CVS with a fix for this even though the bug was reported quite a long time ago, so I'm going to commit this cleaned up and corrected version later today/tomorrow if there are no objections: let clip _min _max x = max _min (min _max x) ;; let slice ?(first=0) ?(last=Sys.max_string_length) s = let i = clip 0 (length s) (if (first<0) then (length s) + first else first) and j = clip 0 (length s) (if (last<0) then (length s) + last else last) in if i>=j || i=length s then create 0 else sub s i (j-i) Btw, John Skaller is correct in that the behavior was intended to be exactly like Python's slice operator. -- Bardur Arantsson <ba...@im...> <ba...@sc...> - And the best part? I didn't learn a thing. |
From: Bardur A. <sp...@sc...> - 2005-11-16 18:12:39
|
Bardur Arantsson wrote: > Brian Brunswick wrote: > >> Hi, thanks for extlib! >> >> ExtString.String.slice doesn't live up to its documentation of never >> raising an exception. It fails to check if ~last is out of range, and >> crashes in String.sub. >> >> Is it best to report bugs here, or in the tracker? >> >> -- > > > I notice there's been no commit to the CVS with a fix for this even > though the bug was reported quite a long time ago, so I'm going to > commit this cleaned up and corrected version later today/tomorrow if > there are no objections: > > let clip _min _max x = > max _min (min _max x) > ;; > > let slice ?(first=0) ?(last=Sys.max_string_length) s = > let i = > clip 0 (length s) > (if (first<0) then > (length s) + first > else > first) > and j = > clip 0 (length s) > (if (last<0) then > (length s) + last > else > last) > in > if i>=j || i=length s then > create 0 > else > sub s i (j-i) > > > Btw, John Skaller is correct in that the behavior was intended to be > exactly like Python's slice operator. > I've committed the above version; with slightly less "spacy" syntax. -- Bardur Arantsson <bardurREMOVE@THISimada.sdu.dk> <bardurREMOVE@THISscientician.net> - Me? The 13th Duke of Wimbourne? In a student nurse's hall of residence at three in the morning? With my reputation? ... Bingo! The 13th Duke of Wimbourne, 'The Fast Show' |