Previous week Up Next week

Hello

Here is the latest Caml Weekly News, for the week of 19 to 26 October, 2004.

I will be in vacations with very limited internet access next week, so there will be no CWN.

  1. Polymorphic pretty printing
  2. OCaml NAE Reactive I/O Monad (iom-0.0)
  3. Focal version 0.2beta
  4. make
  5. OCaml-Win32 release 1.0
  6. ocamaweb release 6.01
  7. Amble, first public release
  8. set of sets ...
  9. Schoca-0.2.3 released
  10. Library for handling Gregorian date calculations
  11. COCANWIKI 1.3.3 released
  12. Felix 1.0.16 released
  13. ant 0.6
  14. Flare 1.0, a GTK2 search tool for Debian packages
  15. ExtLib 1.3 Release
  16. ML Seattle, next mtg Nov 3, 7pm
  17. new mailing list manager

Polymorphic pretty printing

Archive: http://caml.inria.fr/archives/200410/msg00175.html

Andrej Bauer asked:
This is a question for gurus.

I am contemplating writing an enhanced toplevel that could display
graphics as we well as text (the evil plan is to replace Mathematica).
The first step seems to be: how to install a pretty printer for a
_polymorphic_ type.

As an example, consider this:

  type 'a set = { elements : 'a list }

I want a value of this type to print out as

  {a, b, c, ... d}

instead of

  {elements = [a; b; c; ...; d]}

The trouble is, how to print out the elements a, b, c, ..., d
since they are of a polymorphic type.

According to the somewhat old message at

http://caml.inria.fr/archives/200201/msg00234.html

I should use Toplevel.print_out_value to do this. But, print_out_value
expects an arguments of type Outcometree.out_value, and it is not
clear to me where I will get it. Is there another function that converts
an arbitrary value (of an arbitrary type!) to an Outcometree.out_value?

Am I supposed to rewrite half of toplevel.ml to get this working?

It would be helpful if there were, somewhere in the world, a minimal and
_complete_ example of how one can actually write a polymorphic pretty
printer. This _must_ be an FAQ.
    
Christophe Troestler answered and Andrej Bauer said:
> > Am I supposed to rewrite half of toplevel.ml to get this working?
>
> I am afraid that the awser is yes :(.  Let's see why:

Thanks for the hints.

I'd be willing to take a shot at writing a more flexible toplevel, one
that allows to install polymorphic pretty-printers in a sane way.

I am imagining something like this. A pretty printer may be registered
with #install_printer, as before. But we need to fiddle with the types
of printers to get things working. A printer pp for type t (where t may
be polymorphic) would have type

pp : Format.formatter -> t -> (Format.formatter -> 'a -> unit) -> unit

If you compare this with the current type, you'll notice the extra
argument of type (Format.formatter -> 'a -> unit). This is a helper
function which would be passed to pp by the toplevel. Then pp can use it
to print out any polymorphic value.

Does this sound like a sound plan? Or am I missing something? Perhaps
the ocaml developers secretly posses such a toplevel already.
    

OCaml NAE Reactive I/O Monad (iom-0.0)

Archive: http://caml.inria.fr/archives/200410/msg00181.html

James Woodyatt announced:
Announcing the release of the Iom-0.0 package in the OCaml NAE project.
For more details, see the SF.Net project page for OCaml NAE.

        http://sf.net/projects/ocnae/

===== OCaml NAE Reactive I/O Monad (iom) library =====

This distribution is the Objective Caml Network Application Environment
(NAE)
Reactive I/O Monad library, which implements I/O monad functions
designed to
facilitate writing of concurrent, reactive, single-threaded network
application
services in a functional style.

Note: see the ISSUES file for a list of open problems in this release.

===== Required Components =====

This library requires the following external components:

- Objective Caml (v3.07+2 or newer)
- Findlib (tested with v0.8.1 and v1.0.4)
- OCaml NAE Core Foundation (cf-0.4)

Principle development was on Mac OS X 10.3.  The final version of this
library also compiled successfully and passed all self-tests without
warnings on Suse Linux 9.0 for x86-32.  Other platforms with POSIX-like
environments should require only a minimal porting effort.
    

Focal version 0.2beta

Archive: http://caml.inria.fr/archives/200410/msg00182.html

Damien Doligez announced:
We are pleased to announce the release of Focal version 0.2beta.

Focal (formerly known as FoC) is a language for software-proof codesign.

In Focal, code, specifications, and proofs are developped together
in the same source files, using a novel object-oriented module system.
The compiler analyses the dependencies in order to ensure the
consistency of the source, then translates the code to Objective Caml,
and the proofs to Coq.

This is a beta release: there may be some bugs, and the documentation
needs (lots of) work.

This release contains the source code of the following:
- the focal compiler (focc)
- a library of Computer Algebra algorithms
- an automatic theorem prover (zenon)
- a documentation tool (focdoc)
- an emacs mode, etc.

It is available at < http://modulogic.inria.fr/focal/download/ >.

-- the Focal team
    
David Mentre added:
> We are pleased to announce the release of Focal version 0.2beta.

I have updated the list I try to maintain on free software tools for
formal developments: http://gulliver.eu.org/ateliers/fv-tools/index.html

Let me know if you have any addition/fix/...
    

make

Archive: http://caml.inria.fr/archives/200410/msg00183.html

Radu Grigore asked:
I have a problem with writing makefiles for OCaml and with compilation
order. Probably a FAQ.

Searching the caml-list archives I've found info about a tool by
Nicolas Cannesse (ocamake) that can be used to compile a set of ml
files into an executable or to generate a makefile such that a
subsequent make command will construct the executable. However this is
not quite what I want.

Using a makefile has the advantage that only necessary recompilations
are performed. So I want to use a makefile. If I add a source (ml)
file in the project directory then the generated makefile becomes
obsolete and needs to be regenerated. But... a regeneration might
overwrite any subsequent changes I've done.

What I'd love is an enhanced ocamldep that in addition to the
dependencies prints also a topologically sorted list of files, like
this:

---
$ocamldep main.ml parser.ml ast.ml lexer.ml
main.cmo: lexer.cmo parser.cmo
main.cmx: lexer.cmx parser.cmx
parser.cmo: ast.cmo
parser.cmx: ast.cmx
lexer.cmo: parser.cmo
lexer.cmx: parser.cmx
CMO_FILES=ast.cmo parser.cmo lexer.cmo main.cmo
CMX_FILES=ast.cmx parser.cmx lexer.cmx main.cmx
---

This way I would be able to write a kind of 'standard' makefile:

---
include .depend
all: $(CMO_FILES)
   ocamlc -o my_app $(CMO_FILES)

depend:
  ocamldep *.ml > .depend

%.cmo: %.ml
   ocamlc -c $<
---

Does such a tool exists? Does ocamldep already knows to do this and I
didn't found it in the docs? Thanks.
    
Nicolas Cannasse answered:
> I have a problem with writing makefiles for OCaml and with compilation
> order. Probably a FAQ.
>
> Searching the caml-list archives I've found info about a tool by
> Nicolas Cannesse (ocamake) that can be used to compile a set of ml
> files into an executable or to generate a makefile such that a
> subsequent make command will construct the executable. However this is
> not quite what I want.
[...]
> Does such a tool exists? Does ocamldep already knows to do this and I
> didn't found it in the docs? Thanks.

This is not a FAQ and still an open problem.
OCamldep is working at the syntax level but does not differenciate between
the usage of a module *type* (so a compilation dependency : the MLI of the
module need to be compiled first) and the usage of a module *value* ( so a
compilation + runtime dependency : the MLI needs to be compiled first AND
the module linked first). Thus unless you rewrite your ocamldep you cannot
get enough information to correctly sort the CMO into the good order.
However ocamake is applying some algorithms in order to "guess" which order
might be valid in cases of conflict . A case of conflict arise when we
reduce the ML+MLI ocamldep graph output into a CMO only graph, merging ML
and MLI nodes, and thus sometimes creating cycles while there *is* a valid
compilation order.
Instead of doing again the job you might try to use the Makefile generation
from ocamake, or simply tweak it in order to make it output the linkage
order it found.
    
Julien Signoles also answered:
> What I'd love is an enhanced ocamldep that in addition to the
> dependencies prints also a topologically sorted list of files, like
> this:

I think Ara's ocamldsort (mixed with ocamldep) is your friend. I quote the
beginning of the README file:

"The ocamldsort command scans a set of Objective Caml source files (.ml
and .mli files), sorts them according to their dependencies and prints the
sorted files in order to link their corresponding .cmo and .cmi files."

        http://www.eleves.ens.fr/home/ara/ocaml.html
    
Richard Jones said and Dimitri Ara answered:
> I tried out ocamldsort, and it seems to work well, *except* that
> there seems to be a strange bug involving directories

Thank you for your bug report. It is fixed in the 0.14.3 that I have
just released.
( ftp://quatramaran.ens.fr/pub/ara/ocamldsort/ocamldsort-0.14.3.tar.gz )
    

OCaml-Win32 release 1.0

Archive: http://caml.inria.fr/archives/200410/msg00193.html

Harry Chomsky announced:
I'm pleased to announce release 1.0 of OCaml-Win32, an OCaml library
providing direct access to the Win32 API.  Compared to the previous release
(0.02), this version adds support for many of the common dialog boxes and
common controls, improved mechanisms for processing notification messages,
and numerous small improvements and bug fixes.  I expect that future
upgrades will not change the architecture or introduce many
incompatibilities, so I am taking the liberty of calling this release 1.0,
the first "stable" release.  However, large parts of the library have not
been tested yet.

The library is made available under the LGPL license, at the following URL:

http://www.speakeasy.org/~hchomsky/ocaml-win32.html

I have also created a SourceForge project, ocaml-win32, which can allow
volunteers to help expand the library in the future.  Please notify me if
you are interested in becoming a developer for this project.
    

ocamaweb release 6.01

Archive: http://caml.inria.fr/archives/200410/msg00208.html

Charles-Albert Lehalle announced:
A new version (6.01) of OCAMAWEB is available at sourceforge :

http://sourceforge.net/project/showfiles.php?group_id=66639

It's a litterate programming tool written in ocaml and that can be used on
any language having comment marks of one character (I deeply think about
an upgrade to *any* language).
It is used for more that 2 years at MIRIAD Technologies, where it is used
to comment algorithmic code.
config files exist for awk and r-project languages, and I will soon tune
one for the SAS macro programming language.

feel free to use, read and comment the code (It is based on my first ocaml
experience, so I know that I should build a fully new version as soon as
possible : advices are welcome...).
    
David Brown asked and Charles-Albert Lehalle replied:
> >any language having comment marks of one character
> In other words, it can't be used with Ocaml, C, C++, Java, Ada, Haskell?
> So it is a literate tool for scripting languages such as sh, perl and
> python?

MATLAB, SAS and S-plus were the target of OCAMAWEB (for signal processing
and probability/statistics algorithms prototyping, in which it is very
valuable to include mathematical proofs into code), so I at the time I
developed ocamaweb, I did not think that it could be usefull for the
languages you cite.
Now that a lot of people use ocamaweb outside of MIRIAD, I will have to
extend it to any language...

Anyway, from my point of view, there is a lot of tools to comment code a
proper way (doxygen, ocamldoc, etc), and a lot of programming tasks do not
need "real" litterate programming (in java for instance, a "linear"
documentation tool like javadoc is mainly efficient).
The point is that when you develop code that implement some mathematical
results you obtain and when you want to share that code (and the
mathematics that support it) with other people (that's our case inside
MIRIAD), you need to be able to "reconfigure" your code to produce a
documentation including mathematical glyphs (using LaTeX is a good option)
: that's what ocamaweb allow to obtain. And a lot of people implement such
mathematical "adjustments" of existing results in signal processing and
statistics / probability ; those people mainly use MATLAB, S-plus (or R)
and SAS.

So ocamaweb primary goal is definitely not to comment sh, perl or awk
(even if now that it is on my computer, I use it with those languages) ;
it's to produce restructured documentation including mathematical proofs.
    

Amble, first public release

Archive: http://caml.inria.fr/archives/200410/msg00240.html

Olivier Pérès announced:
   Amble is a library that makes it easy to write distributed programs
in Objective Caml. It is primarily intended for teaching distributed
programming. Basically, you design communicating automata and network
topologies, and Amble takes care of the implementation details. It is a
"compile once run many" design in that the actual distribution of the
processes is specified at runtime. The source code, documentation and a
few demo programs are available here : http://home.gna.org/amble/
    

set of sets ...

Archive: http://caml.inria.fr/archives/200410/msg00261.html

Pietro Abate asked:
I'm trying to write an extensible data structure where I can add new
types with minimal effort, but I'm kinda stuck...

my goal is to have a mixed list as:

let a1 = (new set :> mixtype1 store);;
let a2 = new setofset;;
let a3 = (new intlist :> mixtype1 store);;
let l = [a1;a2;a3]

this doesn't work, but just to give you an idea...

this is my approach. Is there a better way of doing it ?

First I defined a virtual class and a couple of auxiliary types. The
mixtype should be user extensible and the ext_rep should give me a
uniform representation of all my objects in terms of lists.

type mixtype = [
    | `Int of int
]
;;

type 'el ext_rep =
    | El of 'el list
    | Cont of 'el ext_rep list
;;


class virtual ['mt] store =
    object(self : 'store)
        method virtual assign : 'store -> unit
        method virtual add : 'mt -> unit
        method virtual del : 'mt -> unit
        method virtual access : 'mt ext_rep
        method virtual copy : 'store
    end
;;

(* The first class is a int list and it's easy... *)

class intlist =
    object
        inherit [mixtype] store
        val mutable data = []

        method data = data
        method assign store = data <- store#data
        method add e = data <- e::data
        method del e = ()
        method access = El(data)
        method copy = {< data = data >}
    end
;;

(* now I want to have set of int: *)

module OriginalSet = Set

module Set = OriginalSet.Make (
        struct
            type t = mixtype
            let compare = compare
        end
);;

class set =
    object
        inherit [mixtype] store
        val mutable data = Set.empty

        method data = data
        method assign store = data <- store#data
        method add e = data <- Set.add e data
        method del e = ()
        method access = El(Set.elements data)
        method copy = {< data = data >}
    end
;;

(* now I want to extend my mixtype, add a new type to use the set of int
class and define a set of sets of ints... This should give a good deal
of flexibility as to add a new type I just need to subclass store and
add a new mixtype that is more general... *)

type mixtype1 = [
    |`Set of set
    |mixtype
];;

module SetofSet = OriginalSet.Make (
        struct
            type t = mixtype1
            let compare = compare
        end
);;

class setofset =
    object
        inherit [mixtype1] store
        val mutable data = SetofSet.empty

        method data = data
        method assign store = data <- store#data
        method add e = data <- SetofSet.add e data
        method del e = ()
        method access =
            Cont (
                List.map (function
                    |`Set e -> (e#access: mixtype ext_rep :> mixtype1 ext_rep)
                    |#mixtype -> failwith "wrong type"
                    ) (SetofSet.elements data)
                )
        method copy = {< data = data >}
    end
;;

(* so far, so good. Now I want to put these three objects in a list and downcast
them to the store class (using mixtype1 that should be a super-type of mixtype) *)

(* I tried many combinations, but with poor results... this doesn't work ....
It says:
Type mixtype = [ `Int of int ] is not compatible with type
  'b = [> `Int of int | `Set of set ]
The first variant type does not allow tag(s) `Set.
This simple coercion was not fully general. Consider using a double coercion.

But I don't understand why, as mixtype1 should be more general than mixtype...
*)

let a1 = (new set :> mixtype1 store);;
let a2 = new setofset;;
let a3 = (new intlist :> mixtype1 store);;

let l = [a1;a2;a3]
    
John Prevost answered:
In short, your problem is this:

Say you have two types, t1 and t2, and t1 is a subtype of t2.
Therefore, you can do (x : t1 :> t2) and coerce a value of type t1 to
a value of type t2.  You cannot do (x : t2 :> t1).  That's pretty
basic.  Let's make an example:

type t1 = [ `A ]
type t2 = [ `A | `B ]
let t1_to_t2 (x : t1) = (x :> t2)

let x1 = `A
let x2 = `B
let x3 = t1_to_t2 x1

There.  That's easy.  It all works and types okay.  The problem is at
the next level.  Let's look at the type of your "store" class:

class virtual ['a] store :
  object ('b)
    method virtual access : 'a ext_rep
    method virtual add : 'a -> unit
    method virtual assign : 'b -> unit
    method virtual copy : 'b
    method virtual del : 'a -> unit
  end

To see what the problem is, let's make some smaller examples with
similar features:

class ['a] c1 (v : 'a) =
  let x = ref v in
  object
    method get = !x
    method put v = x := v
  end

let o1t1 = new c1 x1
let o1t2 = new c1 x2
let o1t3 = new c1 x3

val o1t1 : t1 c1 = <obj>
val o1t2 : t2 c1 = <obj>
val o1t3 : t2 c1 = <obj>

Okay.  So that's working well.  Now--we know we can cast t1 to t2.
Can we cast (t1 c1) to (t2 c2)?  Let's see:

# let o1t1_t2 = (o1t1 :> t2 c1);;
This expression cannot be coerced to type
  t2 c1 = < get : t2; put : t2 -> unit >;
it has type t1 c1 = < get : t1; put : t1 -> unit > but is here used with type
  < get : t1; put : ([> t2 ] as 'a) -> unit; .. >
Type t1 = [ `A ] is not compatible with type 'a = [> `A | `B ]
The first variant type does not allow tag(s) `B

Looks like no.  Why not?  Well, let's think about it.  What happens if
we get a value out of this object?  The value is going to be `A,
because the initial object contains type t1.  That's fine--if we give
`A to something that expects `A or `B, it can handle it.  What happens
if we put a value into this object?  Well, we can only put `A into it.
 Aha!  Here is the problem!

You can't use the value `B in a spot where only `A is expected to be!
Because the "put" method of o2 c1 takes `A|`B, and the "put" method of
o1 c1 only takes `A, we cannot cast a value of type (o1 c1) to (o2
c1)--if we did, we could give the object to code that wants to put `B
into it.  This is called "contravariance", and you can identify it by
looking at the type signature.  If a type argument appears on the
right side of the arrow (or there is no arrow), that type is
"covariant", and behaves as you were expecting.  But if the type
argument appears on the left side of an arrow, it is
"contravariant"--it works the opposite way from what you were
expecting.  If in a single type it is on *both* sides of the arrow,
then it is *invariant*.  That is the case here.

With c1, look at the type:

class ['a] c1 : 'a -> object
  method get : 'a
             (* ^^ this indicates covariance, 'a is on the right *)
  method put : 'a -> unit
             (* ^^ this indicates contracariance, 'a is on the left *)
end

Because c1 is invariant in the type argument 'a, it doesn't matter
that t1 is a subtype of t2.  The rules are like this:

If 'a is covariant in class c, then (t1 <: t2) implies (t1 c <: t2 c)
If 'a is contravariant in class c, then (t1 <: t2) implies (t2 c <: t1 c)
If 'a is invariant in class c, then neither holds, unless t1 = t2.

To make things a little more clear, let's break that down:

class ['a] covariant (x : 'a) = object  method get = x  end
class ['a] contravariant = object  method put (x : 'a) = ()  end

class ['a] covariant : 'a -> object method get : 'a end
class ['a] contravariant : object method put : 'a -> unit end

Let's make some covariant objects and cast them:

let covariant_t1 = new covariant x1 (* OK *)
let covariant_t2 = new covariant x2 (* OK *)
let covariant_t1_as_t2 = (covariant_t1 :> t2 covariant) (* OK *)
let covariant_t2_as_t1 = (covariant_t2 :> t1 covariant) (* Error *)

t2 covariant is not a subtype of t1 covariant, so that last is an
error.  Now we look at contravariant:

let contravariant_t1 = (new contravariant : t1 contravariant) (* OK *)
let contravariant_t2 = (new contravariant : t2 contravariant) (* OK *)
let contravariant_t1_as_t2 = (contravariant_t1 :> t2 contravariant) (* Error *)
let contravariant_t2_as_t1 = (contravariant_t2 :> t1 contravariant) (* OK *)

So here, the other case holds.  And above, in the sample class c1,
both constraints were there, and things didn't work out.

As a final note, you can cast out the offending methods to get around
this.  For example, if you use casting to remove the contravariant
methods from an object of your store class, you can then use the
resulting object covariantly (only reading data out of the object.)
If you use casting to remove the covariant methods from an object of
your store class, you can then use the resulting object
contravariantly (only writing data into the object.)
    

Schoca-0.2.3 released

Archive: http://caml.inria.fr/archives/200410/msg00262.html

Christoph Bauer announced:
Schoca is an implementation of the Scheme language. The primary
purpose of Schoca is the use as an embedded extension language in
OCaml applications.

The new release 0.2.3 fixes a lot of bugs and the interpreter is
now faster. scmTypes.mli lists all scheme-data specific functions.

An init file for slib is included (example/schoca.init). (slib:report)
works but not much more. This will be improved.

The new location of Schoca's  homepage is

http://home.arcor.de/chr_bauer/schoca.html

Have fun with functional programming,
Christoph Bauer

P.S.:

Changes for 0.2.3
   o (define (f) 1)-Bug is fixed
   o wrong parsing of a the string like "...\\" is fixed
   o no termination of schoca shell when an exception occurs
   o getenv returns #f on unset vars
   o a lot of string functions (which uses string_of_datum instead od string_of_scm_string) are fixed
   o (load (...)) is fixed (missing eval)
   o parsing of symbols (or numbers) starting with a dot (`.') is fixed
   o examples/schoca.init for slib is included
           (install slib 3a1,
            setenv SCHEME_LIBRARY_PATH
            run (load "schoca.init"))
   o cond bugs are fixed
   o scm_eval (evaluation of arguments) is fixed

Changes for 0.2.2:
   o much faster function calls (ack.scm 8.3s -> 5.9s)

Changes for 0.2.1 (not released)

   o Fix for eq? on numbers.
   o `truncate' is added
   o documentation for ScmTypes
   o some functions are renamed
    

Library for handling Gregorian date calculations

Archive: http://caml.inria.fr/archives/200410/msg00269.html

Richard Jones announced:
I'm pleased to announce GregorianDate, which is a pure Objective CAML
library for handling calculations on the Gregorian calendar.

http://www.merjis.com/developers/gregorian_date

This is version 1.0.0, which is mature, stable and widely used (by
me).  The library is released under the GNU LGPL with OCaml linking
exception.

Example:

$ ocaml -I +gregoriandate
        Objective Caml version 3.08.1

# #load "gregorianDate.cma";;
# open GregorianDate;;
# days_in_year 2004;;
- : int = 366
# business_of_standard (2004, 10, 24);;
- : (int * int) * int = ((2004, 43), 7)
# easter_sunday 2005;;
- : int * int * int = (2005, 3, 27)
# day_of_week (2004, 10, 24);;
- : int = 7
# nth_weekday_of_month (2004, 10) 7 4;;
- : int * int * int = (2004, 10, 24)
# add_delta_days (2004, 10, 24) 100;;
- : int * int * int = (2005, 2, 1)

etc.
    
William Lovas asked and Richard Jones answered:
William Lovas wrote:
> Richard Jones wrote:
> > I'm pleased to announce GregorianDate, which is a pure Objective CAML
> > library for handling calculations on the Gregorian calendar.
>
> This looks cool, but i have a few suggestions.  First, it needs some online
> documentation (beyond the examples), preferrably in ocamldoc format.

Yes, you're right, but I'm quite busy at the moment.  There is
ocamldoc documentation in the tarball itself, and for an online
reference you should look at:

http://search.cpan.org/dist/Date-Calc/Calc.pod#DESCRIPTION

The API is pretty much identical, except that I have omitted Steffen's
time functions which really don't belong in this library.

> In
> particular, the following examples weren't transparent to me (a date
> non-specialist):
>
> > # business_of_standard (2004, 10, 24);;
> > - : (int * int) * int = ((2004, 43), 7)
[Sunday (7) in week 43 of year 2004.]
> > # nth_weekday_of_month (2004, 10) 7 4;;
> > - : int * int * int = (2004, 10, 24)
[Calculate the 4th Sunday (7) in October 2004.]
>
> I don't know what a "business" date is, and 10-24-2004 isn't a weekday.
> Actually, i think i just understood "nth_weekday_of_month", but
> documentation would certainly have been helpful.

For reference, business weeks are defined in ISO 8601, and you can
find a synopsis here:

http://www.cl.cam.ac.uk/~mgk25/iso-time.html

> > # day_of_week (2004, 10, 24);;
> > - : int = 7
> > etc.
>
> Also, you might consider enriching the interface with some types: i'd say
> at least that day of the week ought to be a variant.  This not only makes
> thing safer, but also makes the intended behavior of functions like
> "nth_weekday_of_month" more apparent.
    
James Woodyatt said:
Similar functions [with different signatures] are also available in the
Cf_date module, along with lots of other goodies, distributed in the
"cf" package of the OCaml Network Application Environment
(http://sf.net/projects/ocnae/).

The Cf package is distributed under a 2-clause BSD license, and it
comes with Ocamldoc generated HTML pages.  Download from the
SourceForge site.
    
Julien Signoles also replied to the original announcement:
What are the differences with the module Date of the "calendar" library ?

        http://www.lri.fr/~signoles/prog.en.html

This library is also a pure OCaml library and released under the GNU
LGLP.
The aims of both libraries seem to be identical. An ocamldoc documentation
of calendar is available at:

        http://www.lri.fr/~signoles/calendar/doc
    

COCANWIKI 1.3.3 released

Archive: http://caml.inria.fr/archives/200410/msg00272.html

Richard Jones announced:
I'm pleased to announce a substantial new release of COCANWIKI, the
wiki and content management system written in Objective CAML.  It is
released under the GNU General Public License (GPL).

http://sandbox.merjis.com/

You can find a list of the features and differences over the previous
version here:

http://sandbox.merjis.com/features
http://sandbox.merjis.com/features/diff?version=5614

Debian packages are available:

http://sandbox.merjis.com/debian_packages

This is the page to use if you wish to try out editing:

http://sandbox.merjis.com/sandbox
http://sandbox.merjis.com/sandbox/edit
    

Felix 1.0.16 released

Archive: http://caml.inria.fr/archives/200410/msg00288.html

John Skaller announced:
Felix version 1.0.16 is now released under BSD style FFAU licence.
You can obtain it from

http://felix.sf.net/download

or from Gerd's Godi archive. Ocaml 3.0.8.1 or CVS version plus
Python and some kind of C++ compiler are required. It should
build on any Unix like platform including OSX and Cygwin.
[I need help to get a native Win32 version to build]

Felix is an Algol like language aimed at the C++ market,
but uses an ML style type system. The compiler is written
in Ocaml, and generates ISO C++. There is a heavy emphasis
on retaining C/C++ compatibility at both object and source
levels. It supports compile time parametric polymorphism,
overloading, recursive types, variants, first class
function closures, lexical scoping, garbage collection,
and type deduction for variables and function returns
(but no inference of arguments). It also provides
standard support for heavy microthreading (cooperative
multi-tasking with O(1) context switching), and features
a non-side effecting functional subsystem separated
from procedural code with support from the type system.

This release contains a freestanding FISh 1.6 implementation,
which I may integrate more closely later. FISh 1 is a
polyadic array procesing language capable of
outperforming C by up to 2:1 (with a C backend :).

Also new is support for STL built into the standard
distribution.

Optimisation is still flaky, however Felix is outperforming
Ocaml bytecode interpreter in the Alioth shootout.
    

ant 0.6

Archive: http://caml.inria.fr/archives/200410/msg00292.html

Achim Blumensath announced:
I'm pleased to announce the release of ant version 0.6. The archive can
be found at

  http://www-mgi.informatik.rwth-aachen.de/~blume/Download.html

ant is a typesetting system inspired by TeX. It does not aim at complete
compatibility with TeX but focusses instead on a flexible, clean, and
modular design.

This version of ant finally implements all major parts of TeX. But there
are still a lot of small things missing. New features include:

  o an improved page layout algorithm with support for floats and
    footnotes
  o an integrated scripting language

Achim

PS: Yes, I do know about Apache Ant.
    

Flare 1.0, a GTK2 search tool for Debian packages

Archive: http://caml.inria.fr/archives/200410/msg00293.html

Berke Durak announced:
Debian users might be interested in Flare which allows to do boolean
regexp searches on the Debian package database in a LablGTK2 GUI.

It was based on ara (which is available via APT) but includes much
better syntax and fixes some database issues (ie ara in its current
version does not scan properly all package database files).

Flare is not yet available via APT but can be downloaded in source
form at

  http://abaababa.ouvaton.org/ara/

Feel free to send all comments and suggestions for some final fixes
before inclusion in Debian.
    

ExtLib 1.3 Release

Nicolas Cannasse announced:
ExtLib 1.3 is available through Sourceforge : http://ocaml-lib.sf.net

ExtLib is a project aiming at providing a complete - yet small - standard
library for the OCaml programming langage. The purpose of this library is to
add new functions to OCaml Standard Library modules, to modify some
functions in order to get better performances or more safety
(tail-recursive) but also to provide new modules which should be useful for
the average OCaml programmer.

Changes for 1.3 :
- new module OptParse (by Bardur Arantsson) : GNU [getopt(3)]-style command
line parsing
- new module Dllist (by Jesse Guardiani and Brian Hurt) : A mutable,
imperative, circular, doubly linked list
- fixed bugs in Bitset and IO modules
- and some minor other changes...
    
Nicolas Cannasse added:
The TGZ have just been updated, the previous one was missing some file, if
you just downloaded it please retry.
Sorry for the inconvenience,
Ah and yes : ExtLib is LGPL with linking exemption, the same license as
Ocaml uses for its libraries :)
    

ML Seattle, next mtg Nov 3, 7pm

Jeff Henrikson announced:
ML Seattle will meet next  Wednesday Nov. 3 at 7pm at the Stumbling Monk in
Capitol Hill.

The Seattle ML SIG will be moving its regular meeting announcements off
caml-list.  Our wiki and mailing list are available with those of the SF Bay
Area SIG:

http://www.mlsig.org

We meet every three weeks.  The wiki will post our next scheduled meeting when
we have scheduled it.

For the sake of new residents or visitors to Seattle, and those in Seattle
finding caml-list, we will continue to broadcast announcements at less
frequent, unscheduled intervals.  If practical, we will attempt to coordinate
with the other area SIGs to minimize caml-list traffic.  For those who do not
and never will have interest about users in Seattle, our apologies.  We promise
to be mindful of the greater good.
    

new mailing list manager

Xavier Leroy announced:
Dear caml-list subscribers,

After many years of using Majordomo on our old server (pauillac), the
caml-list mailing list is now managed by the Mailman software running
on our new server (yquem).

Mailman gives subscribers more flexibility to handle the list
traffic.  For instance, you can elect to receive the list as a daily
digest.  All options can be controlled via the Web interface at
http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list

You should have received yesterday an individual e-mail giving more
detailed instructions, including your actual subscription address.

Unlike what this e-mail says, messages to the list can (and should)
still be sent to caml-list@inria.fr.

Since one of you asked: yquem is named after Château Yquem, a famous
dessert white wine from the Bordeaux area.
    

Using folding to read the cwn in vim 6+

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}$'?'&lt;1':1
zM

If you know of a better way, please let me know.


Old cwn

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.


Alan Schmitt