Hello
Here is the latest Caml Weekly News, for the week of April 25 to May 9, 2006.
Archive: http://thread.gmane.org/gmane.comp.lang.caml.general/32828/focus=32828
Martin Jambon announced:Col is a syntax library for the conversion between lists of records and CSV files with header. CSV (Comma-Separated Values) is a text format supported by spreadsheet programs. "records" are represented as OCaml records, tuples or objects, all being available and interconvertible. main URL: http://martin.jambon.free.fr/ocaml.html#col development/discussion wiki: http://ocaml.pbwiki.com/Col For a demonstration of what the syntax can do, see http://martin.jambon.free.fr/col-doc.html Here is a short example which defines a list of 2 records and saves them: (* File test.ml *) type col t = { x : float; y : float; title "The Title" : string = "no title" } let data = let x = 1. in [ T.create ~x ~y:2. (); T.create ~y:4. ~x ~title:"line2" () ] let _ = T.save_csv "data.csv" data (* end *) $ ocamlfind ocamlopt -o testcol test.ml -syntax camlp4o -package col -linkpkg $ ./testcol $ cat data.csv x,y,"The Title" 1.,2.,"no title" 1.,4.,line2 $ This package is not well-documented but I have been using it intensively with openoffice.org and gnuplot, and it is stable. My largest record type has 49 fields and is still growing!
Archive: http://thread.gmane.org/gmane.comp.lang.caml.general/32825/focus=32825
Sam Steingold asked and Richard Jones answered:> is there a way to access the top-level printing facilities from a program? > > e.g., ocaml toploop will print a complex structure nicely: > # let x = make_my_huge_struct ();; > val x : my_huge_struct = > {a = 1; b = 2; c = 3; ...} > > how do I access this from a program? > e.g., if I have an array of my_huge_struct, I want to be able to examine > a part of it: > > let show_part arr p1 p2 = > for i = p1 to p2 do > ocaml_toploop_print (Array.get arr i) > done > > # show_part array_of_huge_structs 100 105;; > > (in lisp I would do > (loop :for i :from p1 :to p2 :do (print (aref array_of_huge_structs i)))) Have a look at this thread: http://caml.inria.fr/pub/ml-archives/caml-list/2005/03/656798aa05be7a035311a2ecb0eac80d.en.html There's also a library around which allows you to access Toploop, but I'm afraid my Google-fu is failing me today and I can't find it.Lukasz Stafiniak also answered:
Recently announced (needs MetaOCaml): http://caml.inria.fr/pub/ml-archives/caml-list/2006/04/0736adcbad82194c50b04de1b3422b1c.en.html http://pobox.com/~oleg/ftp/ML/gprint/
Archive: http://thread.gmane.org/gmane.comp.lang.caml.general/32831/focus=32831
Peter Sewell announced:We are pleased to announce a preliminary release of HashCaml, an extension of the OCaml bytecode compiler with support for type-safe marshalling and related naming features. This makes the core type-safe and abstraction-safe marshalling constructs from the Acute prototype language available within OCaml. Some OCaml features are not supported (including marshalling of polymorphic variants and objects), and this is very much an alpha release - there may well be serious problems in the implementation. Nonetheless, it should be usable for nontrivial experiments, and any feedback and comment would be most welcome. Further details, including a draft paper, the README, examples, and the full distribution can be found at http://www.cl.cam.ac.uk/users/pes20/hashcaml Peter for the HashCaml team: John Billings, Peter Sewell, Mark Shinwell, Rok Strnisa
Archive: http://thread.gmane.org/gmane.comp.lang.caml.general/32841/focus=32841
Oliver Bandel asked and Mikhail Gusarov answered:> is there RSS-software writen in OCaml? > > Complete RSS-Reader or a Library for imlementing own clients? There is rss.jabber.ru jabber transport written in OCaml. You may ask in conference devel@conference.jabber.ru for details.Maxence Guesdon also answered:
You can have a look at ocaml-rss: http://www.nongnu.org/ocamlrss/ It reads and writes RSS 2.0. If you want to contribute, you're welcome.Richard Jones also answered:
Pure OCaml software is always preferable, but just in case this doesn't work out for you (want to support Atom?), then it is also possible to use a Perl module such as Plagger (http://plagger.org/) via Perl4Caml (http://merjis.com/developers/perl4caml/)
Archive: http://thread.gmane.org/gmane.comp.lang.caml.general/32847/focus=32847
Dmitri Boulytchev announced:this is to announce yet another parser combinators library and camlp4 syntax extension to embed parser expressions into plain OCaml code: http://oops.tepkom.ru/projects/ostap
Archive: http://thread.gmane.org/gmane.comp.lang.caml.general/32855/focus=32855
At the end of this thread, Jeremy Yallop said:Thanks for all the replies. My current understanding is as follows: Given the types type f = [`A] type g = [f | `C] then the following function is not acceptable let k (x:f) = (x:g) because f and g are not unifiable: they are "closed rows" with different fields. There are a number of ways to "open" the row, however: let k (#f as x:f) = (x:g) This one is acceptable because the pattern "#f" means "an open row that includes all the tags in f". (That's its type on the rhs, anyway. The pattern (and the function) will accept exactly those tags in the type "f"). The type annotation on the parameter doesn't affect the type of "x", although the compiler does check that the type of the annotation and of the pattern can be unified. The case where all the tags (only one in this case) are enumerated is treated identically: let k (`A as x:f) = (x:g) Finally, the explicit coercion (:>). Like the acceptable patterns, this "opens" the row, allowing it to be unified with "g" (or, indeed, with any other row type whose tag parameters don't clash with those of "f"). How does that sound?
Archive: http://thread.gmane.org/gmane.comp.lang.caml.general/32879/focus=32879
Ingo Bormuth asked and Xavier Leroy answered:> ocamlagrep produces strange results in my hands: > > let p = Agrep.pattern "test" ;; > let s = "Hello test world." ;; > let l = String.length s ;; > > Agrep.errors_substring_match p s ~numerrs:0 ~pos:0 ~len:l > > ==> returns 0 ( as expected ) > > Agrep.errors_substring_match p s ~numerrs:3 ~pos:0 ~len:l > > ==> returns 3 ( why ??? Should be 0 !!! ) > > I tried many other combinations and do not get what's going on. It's been a long time since I wrote this library, but AFAIK Agrep stops at the first (approximate) match found. So, in your example with numerrs=0 it scans s all the way to "test" and reports success; and in your example with numerrs=3 it stops at "Hell" (a 3-error match) and reports success. In other terms, the integer returned by errors_substring_match is not the minimal number of errors for a match over the whole text. If that's what you want, you can obtain that number by repeated calls to errors_substring_match using binary search on the value of numerrs.
Here is a quick trick to help you read this CWN if you are viewing it using vim (version 6 or greater).
:set foldmethod=expr
:set foldexpr=getline(v:lnum)=~'^=\\{78}$'?'<1':1
zM
If you know of a better way, please let me know.
If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a look at the archive or the RSS feed of the archives.
If you also wish to receive it every week by mail, you may subscribe online.