You can subscribe to this list here.
2003 |
Jan
|
Feb
(81) |
Mar
(97) |
Apr
(88) |
May
(80) |
Jun
(170) |
Jul
(9) |
Aug
|
Sep
(18) |
Oct
(58) |
Nov
(19) |
Dec
(7) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2004 |
Jan
(22) |
Feb
(9) |
Mar
(28) |
Apr
(164) |
May
(186) |
Jun
(101) |
Jul
(143) |
Aug
(387) |
Sep
(69) |
Oct
(14) |
Nov
(8) |
Dec
(99) |
2005 |
Jan
(10) |
Feb
(34) |
Mar
(24) |
Apr
(7) |
May
(41) |
Jun
(20) |
Jul
(3) |
Aug
(23) |
Sep
(2) |
Oct
(26) |
Nov
(41) |
Dec
(7) |
2006 |
Jan
(6) |
Feb
(3) |
Mar
(11) |
Apr
|
May
|
Jun
(5) |
Jul
(8) |
Aug
(20) |
Sep
|
Oct
(6) |
Nov
(5) |
Dec
|
2007 |
Jan
|
Feb
(1) |
Mar
|
Apr
(3) |
May
(2) |
Jun
|
Jul
|
Aug
(1) |
Sep
(7) |
Oct
(6) |
Nov
(19) |
Dec
(11) |
2008 |
Jan
|
Feb
(7) |
Mar
(9) |
Apr
(21) |
May
(42) |
Jun
(27) |
Jul
(28) |
Aug
(26) |
Sep
(16) |
Oct
(32) |
Nov
(49) |
Dec
(65) |
2009 |
Jan
(35) |
Feb
(20) |
Mar
(36) |
Apr
(42) |
May
(111) |
Jun
(99) |
Jul
(70) |
Aug
(25) |
Sep
(15) |
Oct
(29) |
Nov
(3) |
Dec
(18) |
2010 |
Jan
(10) |
Feb
(4) |
Mar
(57) |
Apr
(63) |
May
(71) |
Jun
(64) |
Jul
(30) |
Aug
(49) |
Sep
(11) |
Oct
(4) |
Nov
(2) |
Dec
(3) |
2011 |
Jan
(1) |
Feb
(1) |
Mar
|
Apr
|
May
|
Jun
(1) |
Jul
(1) |
Aug
(2) |
Sep
|
Oct
|
Nov
|
Dec
(1) |
2012 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
(1) |
Sep
|
Oct
|
Nov
|
Dec
|
2013 |
Jan
|
Feb
(1) |
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2014 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
(2) |
Jul
|
Aug
|
Sep
(1) |
Oct
|
Nov
(1) |
Dec
|
2015 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
(1) |
Sep
|
Oct
|
Nov
|
Dec
|
2021 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
(1) |
Oct
|
Nov
|
Dec
|
2022 |
Jan
|
Feb
(1) |
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2023 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
(1) |
Oct
|
Nov
|
Dec
(1) |
2024 |
Jan
(1) |
Feb
(3) |
Mar
(6) |
Apr
(2) |
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
(1) |
2025 |
Jan
(2) |
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
(1) |
Aug
(1) |
Sep
(5) |
Oct
|
Nov
|
Dec
|
From: Richard J. <ri...@an...> - 2004-09-10 18:13:27
|
Not really sure I understand it from a user's point of view. For me what really matters is that I could write something like: if string =3D~ /(a+)(b*)/ then ... The regular expression (Perl-compatible, please!) ought to be compiled and checked at compile time, and the compiler should handle caching compiled expressions containing variables. Actually, the example syntax above isn't really great. I'd need some way to bind captures. The Pcre module has good and bad features. Good: It uses Perl- compatible regexps with fairly minimal fuss. Bad: All checking/ compilation is done at runtime; the syntax for accessing captures is very clunky. The camlp4 regexp module [1] looks much better, but the regexps aren't fully Perl compatible, and I'm not sure if compilation happens at compile time or runtime and how it handles caching. How will your proposal actually work (as in, how will it actually be used: can you give some example code)? Rich. [1] http://web.yl.is.s.u-tokyo.ac.jp/~oiwa/pub/caml/regexp-pp-0.9.3/README.= match-regexp --=20 Richard Jones. http://www.annexia.org/ http://www.j-london.com/ Merjis Ltd. http://www.merjis.com/ - improving website return on investment PTHRLIB is a library for writing small, efficient and fast servers in C. HTTP, CGI, DBI, lightweight threads: http://www.annexia.org/freeware/pthrli= b/ |
From: Richard J. <ri...@an...> - 2004-09-10 16:57:25
|
(Repost: original was apparently tagged as sp*m). Not really sure I understand it from a user's point of view. For me what really matters is that I could write something like: if string =3D~ /(a+)(b*)/ then ... The regular expression (Perl-compatible, please!) ought to be compiled and checked at compile time, and the compiler should handle caching compiled expressions containing variables. Actually, the example syntax above isn't really great. I'd need some way to bind captures. The Pcre module has good and bad features. Good: It uses Perl- compatible regexps with fairly minimal fuss. Bad: All checking/ compilation is done at runtime; the syntax for accessing captures is very clunky. The camlp4 regexp module [1] looks much better, but the regexps aren't fully Perl compatible, and I'm not sure if compilation happens at compile time or runtime and how it handles caching. How will your proposal actually work (as in, how will it actually be used: can you give some example code)? Rich. [1] http://web.yl.is.s.u-tokyo.ac.jp/~oiwa/pub/caml/regexp-pp-0.9.3/README.= match-regexp --=20 Richard Jones. http://www.annexia.org/ http://www.j-london.com/ Merjis Ltd. http://www.merjis.com/ - improving website return on investment MOD_CAML lets you run type-safe Objective CAML programs inside the Apache webserver. http://www.merjis.com/developers/mod_caml/ |
From: skaller <sk...@us...> - 2004-09-10 16:42:13
|
On Sat, 2004-09-11 at 01:02, Jesse Guardiani wrote: > skaller wrote: > > > I'm playing with my regexp package and I'd like > > to discuss architecture. > > [...] > > > The goal is a simple, powerful, in Caml regular matching > > facility, written entirely in Ocaml, and obsoleting Str, PCRE, > > and Ocamllex. > > > 3.) Do you have some code we can play with? I'd be able to comment > on the interface if I could compile something... Attached. dfa.ml and dfa.mli contain the basic engine. test_dfa.ml is a sample test routine, unfinished. The engine isn't necessarily the most efficient code, but it seems to work. No attempt is made to minimise the number of states. This engine only accepts one type of character: int. There are no other intrinsic limitations, however some of the data structures might get big. For large character sets, like Unicode, the engine as it stands will probably use all your memory and take too long to be practical. To fix this problem, we need character classes: typically, many characters are equivalent. This is done by a function classify : int -> int which maps a character to a class index which is then fed to the driver. The regexps also need to be built in terms of class indices. One way may be to add a regexp term `REGEXP_in_range (a,b) however, this does require some fiddling. EG if you have a range A-Z and a keyword 'IS' then actually you have 5 classes. It may be useful to change the character type from int to int * 'b where 'b is the actual character, and int is its class. The automaton only uses the class. However if you're processing a stream, and want to extract groups, you want an array of 'b, not an array of class indicies. Similarly condider a regexp for a decimal integer: {`Start} (9 {`Digit}) * where `Start sets a variable to 0, and `Digit multiples by 10 and adds the digit minus '0', thus computing the numeric value as an attribute for a some token. Clearly a class of 0-9 won't do even if 0-9 are equivalent, we need the actual character for the computation. -- John Skaller, mailto:sk...@us... voice: 061-2-9660-0850, snail: PO BOX 401 Glebe NSW 2037 Australia Checkout the Felix programming language http://felix.sf.net |
From: Jesse G. <je...@wi...> - 2004-09-10 15:03:11
|
skaller wrote: > I'm playing with my regexp package and I'd like > to discuss architecture. [...] > The goal is a simple, powerful, in Caml regular matching > facility, written entirely in Ocaml, and obsoleting Str, PCRE, > and Ocamllex. > > Any comments appreciated. 1.) I DEFINATELY think O'Caml needs a 100% pure O'Caml regex module. I've wished for this a number of times myself, and if we got it then we could remove the dependency on PCRE for things like Dbi's postgresql driver. 2.) I know next to nothing about regex implementations. I am simply a user. 3.) Do you have some code we can play with? I'd be able to comment on the interface if I could compile something... -- Jesse Guardiani, Systems Administrator WingNET Internet Services, P.O. Box 2605 // Cleveland, TN 37320-2605 423-559-LINK (v) 423-559-5145 (f) http://www.wingnet.net |
From: skaller <sk...@us...> - 2004-09-09 20:29:39
|
I'm playing with my regexp package and I'd like to discuss architecture. (1) ENGINE The engine accepts a regular expression of the following type: type 'a regexp_t = [ | `REGEXP_char of int | `REGEXP_seq of 'a regexp_t * 'a regexp_t (** concatenation *) | `REGEXP_alt of 'a regexp_t * 'a regexp_t (** alternation *) | `REGEXP_aster of 'a regexp_t (** Kleene closure *) | `REGEXP_epsilon (** epsilon: null string *) | `REGEXP_code of 'a (** associated code *) ] You will note a 'character' is a fixed type, namely int, and that there is a user determined 'code' constructor whose purpose will be explained below. It returns (a) The alphabet, being a Set of int denoting each character which is recognized. (b) A count n of the number of states, which are numbered 0 to n-1. (c) A partial mapping from states to codes, represented by a hashtable, explained below. (d) A partial mapping from character * state pairs to states, represented by a hashtable, called the transition matrix. Here is the interface: val compile_regexp : 'a regexp_t -> CharSet.t * (* alphabet *) int * (* state count *) (int, 'a) Hashtbl.t * (* terminal codes *) (CharSet.elt * int, int) Hashtbl.t (* transition matrix *) If the code mapping fails, there is no code for that state. If the matrix lookup fails, the transition is to the 'error' state. Now for the fun part :) Most regexp systems include some weird notion of 'groups'. The engine above is not only much simpler, it is also better. Basically, a 'code' is a marked epsilon transition. By tacking codes after a regular expression, the terminal state for that expression is marked with an 'accepting' code. Whilst driving the matrix with a matcher, lexer, or other driver loop, you can check whether you have encountered a marked state, and if so, which one. Consider: \(1*\)-\(2*\) We will convert the groups to plain marks: {`m 1}1*{`m 2}-{`m 3}2{`m 4} and create an int option array of length 4 initialised to None. Whenever we get a marked state m1-m4 we store the string index into the array in the right slot. When we're finished .. hey presto, we have our groups. To implement this we could also use the code type: type code_t = [`Left of int | `Right of int] Another use of marks is for classification: 1*{`Ones}|2*{`Twos} When we get a match, we also know which alternative matched. Of course you can do this with groups too. The big difference between marks and groups is that the marks are an arbitrary (comparable) user defined type, and, what you do when you encounter one is up to you. Note groups and marks are equivalent -- regexp engines implement groups with marks, and marks can always be replaced by groups. However groups use a positional notation (counting brackets), whereas marks actually return an arbitrary code. Using a positional group encoding like Cameleon: string option array option isn't nearly as good as marks: in a production lexer with 50 tokens you'd have to search for Some string, and then translate the array index into a token (if you can remember that position 45 is the keyword 'match' for example .. :) In particular this regexp engine *automagically* supports 'in Caml' tokenisers which are are actually more expressive than Ocamllex. In my test engine I have written this: let digit = regexp_of_charset "0123456789" let lower = regexp_of_charset "abcdefghijklmnopqrstuvwxyz" let upper = regexp_of_charset "ABCDEFGHIJKLMNOPQRSTUVWXYZ" let letter = alt upper lower let underscore = regexp_of_char '_' let idstart = alt letter underscore let idrest = alt idstart digit let space = regexp_of_char ' ' let white = many space let ident = seq idstart (aster idrest) let num = many digit let code x = `REGEXP_code x let tk_ident = seq ident (code `Ident) let tk_num = seq num (code `Num) let tk_white = seq white (code `White) let re = alt tk_ident (alt tk_num tk_white) let res = many re I'm using obvious named functions for combinators seq a b = `REGEXP_seq (a,b) etc, you could also define infix operators for alt and seq. Of course you can also do: fold_left seq epsilon [a;b;c;d] etc. Note this isn't Ocamllex code -- its pure Ocaml! Although the engine creates a Hashtbl, for which lookup isn't efficient, you can always transform it into an array and pay the extra space cost. Also, if you want to avoid the cost of compiling a regexp, you can write a pure ocaml program which does the conversion, and either prints out the matrix as Ocaml code, or simply Marshall it to disk. (2) DRIVERS To actually use the engine, we need some drivers such as 'match' and 'lex', and some convenient mark processing utilities. (3) PARSERS We actually use Ocaml as the parser. We can 'sugar' the syntax with any kind of function. For example we can create a type of regexp with groups instead of marks, and just translate the groups into appropriate marks. In order to provide Posix and Emacs looking regexps, we actually write a parser function that produces a regexp. There is a lot more work to produce usable sugar for this engine -- eg actually implement groups. I don't yet have everything because I'm not yet sure exactly what is needed. The goal is a simple, powerful, in Caml regular matching facility, written entirely in Ocaml, and obsoleting Str, PCRE, and Ocamllex. Any comments appreciated. -- John Skaller, mailto:sk...@us... voice: 061-2-9660-0850, snail: PO BOX 401 Glebe NSW 2037 Australia Checkout the Felix programming language http://felix.sf.net |
From: Richard J. <ri...@an...> - 2004-09-09 17:39:04
|
On Thu, Sep 09, 2004 at 01:35:17PM -0400, Jesse Guardiani wrote: > Richard Jones wrote: >=20 > > On the subject of dates and times again, someone with a clue *did* > > scratch their itch and implement an interesting time module: >=20 > Well, I think that may depend on whether or not Dan Bernstein has a clue. >=20 > I use TAI64 with multilog, but I certainly don't know if it's a sane time > format or not. I generally like Dan's work, but I've never heard much abo= ut > TAI64 outside Qmail... Very true ... Rich. --=20 Richard Jones. http://www.annexia.org/ http://www.j-london.com/ Merjis Ltd. http://www.merjis.com/ - improving website return on investment C2LIB is a library of basic Perl/STL-like types for C. Vectors, hashes, trees, string funcs, pool allocator: http://www.annexia.org/freeware/c2lib/ |
From: Jesse G. <je...@wi...> - 2004-09-09 17:35:32
|
Richard Jones wrote: > On the subject of dates and times again, someone with a clue *did* > scratch their itch and implement an interesting time module: Well, I think that may depend on whether or not Dan Bernstein has a clue. I use TAI64 with multilog, but I certainly don't know if it's a sane time format or not. I generally like Dan's work, but I've never heard much about TAI64 outside Qmail... -- Jesse Guardiani, Systems Administrator WingNET Internet Services, P.O. Box 2605 // Cleveland, TN 37320-2605 423-559-LINK (v) 423-559-5145 (f) http://www.wingnet.net |
From: Richard J. <ri...@an...> - 2004-09-09 16:34:52
|
On the subject of dates and times again, someone with a clue *did* scratch their itch and implement an interesting time module: http://cvs.sourceforge.net/viewcvs.py/ocnae/src/cf/cf_tai64.mli?rev=3D1.2&v= iew=3Dmarkup http://cvs.sourceforge.net/viewcvs.py/ocnae/src/cf/cf_stdtime.mli?rev=3D1.2= &view=3Dmarkup I didn't check very closely whether the license was compatible. Rich. --=20 Richard Jones. http://www.annexia.org/ http://www.j-london.com/ Merjis Ltd. http://www.merjis.com/ - improving website return on investment C2LIB is a library of basic Perl/STL-like types for C. Vectors, hashes, trees, string funcs, pool allocator: http://www.annexia.org/freeware/c2lib/ |
From: Jesse D. G. <je...@wi...> - 2004-09-09 05:54:16
|
Nicolas Cannasse wrote: >>Nicolas Cannasse wrote: >> >> >> >>>What about the two newest data structures dllist and index tree ? >>>Is there final implementation proposal available somewhere to include in >>>ExtLib ? >>> >>> >>Gimme a day or two to finalize Dllist. I had planned to work on it this >>past weekend (Monday was a Holiday and all), but instead I took a little >>road trip with my wife and son. I'll try to work on it tonight and maybe >>have something final by tommorrow. >> >> > >It's ok you don't need to hurry that much :) > > New version available here: http://www.wingnet.net/~jesse/ocaml/dllist/index.html Changes: - merge -> splice - jump -> skip - enums reimplemented - added rev_enum function My sourceforge ID is 'trevarthan'. I'll be the maintainer. Thanks! -- Jesse Guardiani, Systems Administrator WingNET Internet Services, P.O. Box 2605 // Cleveland, TN 37320-2605 423-559-LINK (v) 423-559-5145 (f) http://www.wingnet.net |
From: Brian H. <bh...@sp...> - 2004-09-08 21:52:09
|
I'd like to submit this module for inclusion into extlib. This is module formerly known as Prince, er, Funarr. On reflection, I decided I liked 'index tree' as a name better too. General notes: - Changed name - Everything from Funarr still supported - I stuck with a weight balanced tree. Chris Okasaki's Random Access Lists are interesting, but they're geared towards list replacement, not array replacement. For example, I can't figure out how to delete elements in the middle of a random access list- I can with a weight balanced tree. - added append, to append two indexed trees in O(log N) time. The returned tree is balanced. - added splice, return a subset of an indexed tree. This takes either O(log N) where N is the length of the source tree, or O((log M)^2) where M is the length of the returned tree. I can't think of a better way of doing this- suggestions welcomed. - Added list, array, and enum conversions. - Added rev function to reverse an indexed tree - I realized that I could do a binary search on the indexed tree in the same amount of time it takes me to get a single element. So I added two binary search functions- search, which returns the found element, and find_index, which returns the index of the found element. Note that with these functions it now becomes possible to implement a threaded map structure, by combining an index tree with a map. - Haven't tested it yet. -- "Usenet is like a herd of performing elephants with diarrhea -- massive, difficult to redirect, awe-inspiring, entertaining, and a source of mind-boggling amounts of excrement when you least expect it." - Gene Spafford Brian |
From: Bardur A. <oca...@sc...> - 2004-09-08 14:56:15
|
On Wed, Sep 08, 2004 at 04:47:34PM +0200, Bardur Arantsson wrote: [sorry about replying to myself. I know, it's bad form...] I just realized that the interface doc states that operations are "at most" O(something). This is of course redundant, at I'll change it to "This operation is O(...)". -- Bardur Arantsson <ba...@im...> <ba...@sc...> If it looks like a duck, quacks like a duck, and walks like a duck it's probably just a tool of the conspiracy. Kallahan | http://slashdot.org |
From: Bardur A. <oca...@sc...> - 2004-09-08 14:48:03
|
Hi all, I've written an efficient circular (character) buffer module for a network-related application I'm developing, and I was wondering if there might be interest in including it in ExtLib? The highlights: - All but two operations are O(1), the only exceptions are blit and grow (for obvious reasons). - No superfluous string copying. - No string allocation except when creating or growing. - Interface is very convenient for impementing buffering with Unix.read, Unix.write/single_write, or IO.input/output and similar functions. (It basically uses the same pattern that the ocamlnet/netstring Netbuffer module uses for add_inplace which is about as convenient as it gets). I've attached the interface file which contains everything *I* need, I'm open to suggestions for additions, however. Any interest at all...? Cheers, -- Bardur Arantsson <ba...@im...> <ba...@sc...> All warfare is based on deception. Sun Tzu | The Art of War |
From: Richard J. <ri...@an...> - 2004-09-07 23:03:55
|
On Tue, Sep 07, 2004 at 10:48:43AM +0200, Nicolas Cannasse wrote: > What about the two newest data structures dllist and index tree ? > Is there final implementation proposal available somewhere to include in > ExtLib ? I wasn't intending it for inclusion, but I have a very complete CSV (comma-separated-values) library which could go in. http://www.merjis.com/developers/csv/ Any licensing changes necessary can be incorporated. Rich. --=20 Richard Jones. http://www.annexia.org/ http://www.j-london.com/ Merjis Ltd. http://www.merjis.com/ - improving website return on investment Learning Objective CAML for C, C++, Perl and Java programmers: http://www.merjis.com/richj/computers/ocaml/tutorial/ |
From: Nicolas C. <war...@fr...> - 2004-09-07 18:07:55
|
> I have need for split & nsplit functions that honor (in > other words, ignore the text between) double quote characters. > Is anyone interested in something like this for extlib? I think this is too much particular to be used for ExtLib, and also not so much efficient. A Regexp/Lexer would fit better here. Regards, Nicolas Cannasse |
From: Jesse G. <je...@wi...> - 2004-09-07 17:57:27
|
I have need for split & nsplit functions that honor (in other words, ignore the text between) double quote characters. Is anyone interested in something like this for extlib? For example, I have a text file that uses the following format: key:field1:name0=value0,name1=value1 This file is compiled into a CDB hash using Dustin Sallings CDB module, then I access it using the key. If a match is found, the value returned is everything after the first colon character up to a newline. It is then my job to parse the value further into field1 and a list of name=value pairs. This can all be accomplished with split and nsplit, unless you need to embed a comma character in one of your values, like this: mykey:myfield:FOO="BAR0,BAR1,BAR2",SHELL="/bin/sh" With my current parsing scheme (based on split and nsplit) this would be broken down as follows: field1=myfield FOO="BAR0 BAR1= BAR2= SHELL="/bin/sh" So I need to implement a split and nsplit that honor quotation characters. Here's what I've got right now (it's ugly, but it works): exception Invalid_quote of char;; (** [qfind ~quote:['"'] s x] returns the starting index of the string [x] within the string [s], ignoring characters enclosed in any of the characters passed to the [quote] argument. @raise Invalid_string if [x] is not a substring of [s]. @raise Invalid_quote if a character in the [quote] list appears in [s], but is not terminated properly. @param quote List of characters inside which we don't look for [sep]; defaults to '"'. *) let qfind ?(quote=['"']) str sub = let sublen = ExtString.String.length sub in if sublen = 0 then 0 else let found = ref 0 in let len = ExtString.String.length str in try let i = ref 0 in while !i <= len - sublen do begin let j = ref 0 in i := if List.mem (String.unsafe_get str (!i)) quote then begin incr j; let q = String.unsafe_get str (!i) in (* skip quoted characters *) while not (List.mem (String.unsafe_get str (!i + !j)) quote) do incr j; if (!i + !j) > len - sublen then raise (Invalid_quote q) done; !i + !j end else !i; while String.unsafe_get str (!i + !j) = String.unsafe_get sub !j do incr j; if !j = sublen then begin found := !i; raise Exit; end; done; incr i; end done; raise ExtString.String.Invalid_string with Exit -> !found ;; (** [qsplit ~quote:['"'] s sep] splits the string [s] between the first occurrence of [sep], ignoring characters enclosed in any of the characters passed to the [quote] argument. @raise Invalid_string if the separator is not found. @raise Invalid_quote if a character in the [quote] list appears in [s], but is not terminated properly. @param quote List of characters inside which we don't look for [sep]; defaults to '"'. *) let qsplit ?(quote=['"']) str sep = let p = qfind ~quote:quote str sep in let len = ExtString.String.length sep in let slen = ExtString.String.length str in String.sub str 0 p, String.sub str (p + len) (slen - p - len) ;; (** [nqsplit ~quote:['"'] s sep] splits the string [s] into a list of strings which are separated by [sep], ignoring characters enclosed in any of the characters passed to the [quote] argument. @raise Invalid_quote if a character in the [quote] list appears in [s], but is not terminated properly. @param quote List of characters inside which we don't look for [sep]; defaults to '"'. *) let rec nqsplit ?(quote=['"']) str sep = try let s1 , s2 = qsplit ~quote:quote str sep in s1 :: nqsplit ~quote:quote s2 sep with ExtString.String.Invalid_string -> [str] ;; Any interest? -- Jesse Guardiani, Systems Administrator WingNET Internet Services, P.O. Box 2605 // Cleveland, TN 37320-2605 423-559-LINK (v) 423-559-5145 (f) http://www.wingnet.net |
From: Brian H. <bh...@sp...> - 2004-09-07 15:34:22
|
On Tue, 7 Sep 2004, Jesse Guardiani wrote: > Nicolas Cannasse wrote: > > > What about the two newest data structures dllist and index tree ? > > Is there final implementation proposal available somewhere to include in > > ExtLib ? > > Gimme a day or two to finalize Dllist. I had planned to work on it this > past weekend (Monday was a Holiday and all), but instead I took a little > road trip with my wife and son. I'll try to work on it tonight and maybe > have something final by tommorrow. > > > I too have been distracted by life. I'll try to get something akin to a release out today. -- "Usenet is like a herd of performing elephants with diarrhea -- massive, difficult to redirect, awe-inspiring, entertaining, and a source of mind-boggling amounts of excrement when you least expect it." - Gene Spafford Brian |
From: Nicolas C. <war...@fr...> - 2004-09-07 13:06:12
|
> Nicolas Cannasse wrote: > > > What about the two newest data structures dllist and index tree ? > > Is there final implementation proposal available somewhere to include in > > ExtLib ? > > Gimme a day or two to finalize Dllist. I had planned to work on it this > past weekend (Monday was a Holiday and all), but instead I took a little > road trip with my wife and son. I'll try to work on it tonight and maybe > have something final by tommorrow. It's ok you don't need to hurry that much :) Nicolas |
From: Jesse G. <je...@wi...> - 2004-09-07 12:52:07
|
Nicolas Cannasse wrote: > What about the two newest data structures dllist and index tree ? > Is there final implementation proposal available somewhere to include in > ExtLib ? Gimme a day or two to finalize Dllist. I had planned to work on it this past weekend (Monday was a Holiday and all), but instead I took a little road trip with my wife and son. I'll try to work on it tonight and maybe have something final by tommorrow. -- Jesse Guardiani, Systems Administrator WingNET Internet Services, P.O. Box 2605 // Cleveland, TN 37320-2605 423-559-LINK (v) 423-559-5145 (f) http://www.wingnet.net |
From: Nicolas C. <war...@fr...> - 2004-09-07 08:49:55
|
What about the two newest data structures dllist and index tree ? Is there final implementation proposal available somewhere to include in ExtLib ? Nicolas Cannasse |
From: Bardur A. <oca...@sc...> - 2004-08-31 20:04:10
|
On Tue, Aug 31, 2004 at 01:46:45PM +0200, Nicolas Cannasse wrote: > > Fair enough. :) > > > > But then IO.nread is subject to a similar problem: It will > > busy-wait on a non-blocking input until more input becomes > > available instead of returning the string read so far. > > > > I fixed that and added two more really_... functions which > > do exactly the same as their regular counterparts except > > that they raise an exception if unable to read/write the > > requested amount. > > > > I've attached the patch I intend to apply to add the > > functions > > > > really_nread > > really_input > > really_output > > > > and to fix IO.nread when used on non-blocking IO. > > > > Any objections? (Obviously, I'll add declarations and > > documentation to IO.mli if accepted.) > > Looks ok for me. > Committed. -- Bardur Arantsson <ba...@im...> <ba...@sc...> - Leela, you've got mail! - (sighs) - It's not spam! Computer and Leela | Futurama |
From: Bardur A. <oca...@sc...> - 2004-08-31 16:13:30
|
Hi all, I've added a "set" function to the Opt module so that you can now set the value of an option programmatically. This can be quite useful if you want to provide e.g. three distinct options where value of the third can be computed from any other two. An example from network benchmarking would be: 1) number of packets, 2) packet size, and 3) total number of bytes to send. Instead of having to declaring three more variables to hold the "filled-in" values, you can just set the missing option's value directly and proceed as normal. Unfortunately it couldn't be implemented without a _tiny_ amount of breakage, but you will _only_ see this if you've implemented your own option types... and even then you only have to provide one more trivial closure for the option definition. Since almost nobody is affected by this change I decided to commit immediately. The diff is attached. Cheers, -- Bardur Arantsson <ba...@im...> <ba...@sc...> Who is General Failure, and why is he reading my disk? |
From: Nicolas C. <war...@fr...> - 2004-08-31 11:47:46
|
> Fair enough. :) > > But then IO.nread is subject to a similar problem: It will > busy-wait on a non-blocking input until more input becomes > available instead of returning the string read so far. > > I fixed that and added two more really_... functions which > do exactly the same as their regular counterparts except > that they raise an exception if unable to read/write the > requested amount. > > I've attached the patch I intend to apply to add the > functions > > really_nread > really_input > really_output > > and to fix IO.nread when used on non-blocking IO. > > Any objections? (Obviously, I'll add declarations and > documentation to IO.mli if accepted.) Looks ok for me. Nicolas |
From: Bardur A. <oca...@sc...> - 2004-08-31 10:29:07
|
On Tue, Aug 31, 2004 at 09:49:01AM +0200, Nicolas Cannasse wrote: > > > This will cause an infinite loop on non-blocking IO (r = 0). > > > You might want to raise Sys_blocked_io in this case. > > > > > > > Hmm... the ***channel adapter*** uses Pervasives.input to read. > > Yes, but not other adapters... Please have a look at specification here : > http://www.ocaml-programming.de/rec/IO-Classes.html > > Nicolas > > Fair enough. :) But then IO.nread is subject to a similar problem: It will busy-wait on a non-blocking input until more input becomes available instead of returning the string read so far. I fixed that and added two more really_... functions which do exactly the same as their regular counterparts except that they raise an exception if unable to read/write the requested amount. I've attached the patch I intend to apply to add the functions really_nread really_input really_output and to fix IO.nread when used on non-blocking IO. Any objections? (Obviously, I'll add declarations and documentation to IO.mli if accepted.) -- Bardur Arantsson <ba...@im...> <ba...@sc...> On a posted sign: "Bill stickers will be prosecuted!" Written next to it: "Bill Stickers is innocent!" |
From: Nicolas C. <war...@fr...> - 2004-08-31 08:12:50
|
> I think I found a bug in IO.read_i32 implementation. The current > implementation is (roughly): Thanks for the report, this is now fixed on CVS. Regards, Nicolas Cannasse |
From: Nicolas C. <war...@fr...> - 2004-08-31 07:50:09
|
> > This will cause an infinite loop on non-blocking IO (r = 0). > > You might want to raise Sys_blocked_io in this case. > > > > Hmm... the ***channel adapter*** uses Pervasives.input to read. Yes, but not other adapters... Please have a look at specification here : http://www.ocaml-programming.de/rec/IO-Classes.html Nicolas |