Previous week Up Next week


Here is the latest Caml Weekly News, for the week of September 12 to 19, 2006.

  1. Seeking functional programmer for commercial position - Galois Connections
  2. Passing class type as parameter?
  3. SafeUnmarshal: questions/problems/timings
  4. On cmxa files
  5. version 3.09.3 is out

Seeking functional programmer for commercial position - Galois Connections


isaac jones announced:
I hope this posting is appropriate for the email list.  I got some 
advice on the #ocaml IRC channel that it would be fine :) 
Galois is seeking a full-time candidate for software development and 
systems integration in the field of high assurance computing.  A 
successful candidate should have a good understanding of the 
inner workings of databases, good development skills in a number of 
languages, including at least one functional language (preferably 
Haskell), and web development.  The candidate should have excellent 
Linux and Unix skills.  If the candidate does not know Haskell, they 
should be good at learning new programming languages, and can 
reasonably expect to be fluent in Haskell within a few months. 

 * Database analysis 
 * Python and PHP web development 
 * Learning and adapting Linux-related technologies including Xen, 
   SELinux, and Knoppix 
 * Creating or modifying Debian packages 
 * Haskell development 

 * Databases implementation internals 
 * Web development, Services-Oriented Architectures 
 * Fluent in Haskell or other functional languages 
 * Grounding in computer security 
 * XML 
 * Linux and Unix 

 * Extreme Programming (XP) development experience 
 * Experience deploying software products 
 * Open source software development experience 
 * Ability to get US security clearance 

 * Masters degree or equivilent experience 

Please respond with a resume and a cover letter explaining your fit to  Feel free to forward to interested parties.

Passing class type as parameter?


Jeremy Cowgar asked and Jacques Garrigue answered:
> Can I do something like: 
> class base_model = object(self) 
>    method from_array ary = ... 
> end ;; 

> class user = object(self) 
>    inherit base_model 
>    ... 
> end ;; 

> let finder sql class_type = 
>    query_database sql ; 
>    let res = new class_type in 
>      res#from_array res ;; 

> let users = finder "SELECT * FROM users" user in 
>    xxx yyy ;; 

> Ok. That is not working code, prob has syntax errors as well, but you   
> get my idea. The problem I am having is passing the class to the   
> generic finder method. 

No, you can't, but you can pass the class constructor in place, which 
is just equivalent. 
let finder sql class_new = 
   query_database sql ; 
   let res = class_new () in 
     res#from_array res ;; 

let users = finder "SELECT * FROM users" (fun () -> new user) in 
   xxx yyy ;; 

Note that in general the class constructor takes arguments, so you 
don't need the above anonymous function.

SafeUnmarshal: questions/problems/timings


Hendrik Tews said:
Here is the promised followup with more details on the slow safe 
unmarshalling. On you can 
download 281 KB of marshalled data. On my machine it takes 23 
seconds to check with native code. 

The data is of type 

  annotated translationUnit_type = annotated * annotated topForm_type list 

You can test it with the following piece of code: 

open Cc_ast_gen_type 
open Ast_annotation 

let file = "/home/tews/src/elsa/elsa/in/big/nsUnicodeToTeXCMRt1.i.oast" 

    [^ annotated translationUnit_type ^] 
    (open_in file); 
  print_endline "OK" 
  | _ -> print_endline "FAIL" 

compile with 

        ocamlopt.opt safeUnmarshal.cmxa \ 

The additional files are from Olmar, get them here:

To produce graphs like 
you need to download Olmar, compile it and then 
- ./regrtest -ocaml  in subdir elsa 
- ./regtest-oast | grep time >data in subdir asttools 
- gnuplot plot 

where the plot file is something like 


set grid 
unset mouse 
set terminal x11 persist 
#set terminal postscript enhanced color 

set xlabel "size (Bytes)" 
set ylabel "time (s)" 
set key left 

z = 2.1 

plot "data" using 6:3 title "SafeUnmarshal user time", \ 
        (0.000017088 * x) ** 2.1

On cmxa files


Chris King asked and Jacques Garrigue answered:
> I remember hearing somewhere that by exposing .cmx files, the compiler 
> is able to inline across module boundaries, and thus distributing .cmx 
> files is desirable.  Is this just a myth?  It seems redundant since 
> the .cmx files are included in the .cmxa anyway. 

This is a frequent confusion. The .cmxa does not contain all the 
information from the .cmx, in particular not the inlining 
information. This is natural if you think of it: when you compile a 
module, you have no way to know in which library are its dependencies, 
so you can only look for .cmx's, not for .cmxa's. The .cmxa's are only 
used at link time. 
You can still compile without the .cmx's, but you loose the 

version 3.09.3 is out


Damien Doligez announced:
It is our pleasure to announce the release of OCaml version 3.09.3. 
This is mainly a bug-fix release, see the list of changes below. 

It is available at the following URL: 

Happy hacking, 

-- Damien Doligez for the OCaml team. 

Objective Caml 3.09.3: 

Bug fixes: 
- ocamldoc: -using modtype constraint to filter module elements   
     in doc PR#4016 
- ocamldoc: error in merging of top dependencies of modules PR#4007 
- ocamldoc: -dot-colors has no effect PR#3981 
- ocamdloc: missing crossref in text from intro files PR#4066 
- compilers: segfault with recursive modules PR#4008 
- compilers: infinite loop when compiling objects PR#4018 
- compilers: bad error message when signature mismatch PR#4001 
- compilers: infinite loop with -rectypes PR#3999 
- compilers: contravariance bug in private rows 
- compilers: unsafe cast with polymorphic exception PR#4002 
- native compiler: bad assembly code generated for AMD64 PR#4067 
- native compiler: stack alignment problems on MacOSX/i386 PR#4036 
- stdlib: crash in marshalling PR#4030 
- stdlib: crash when closing a channel twice PR#4039 
- stdlib: memory leak in Sys.readdir PR#4093 
- C interface: better definition of CAMLreturn PR#4068 
- otherlibs/unix: crash in gethostbyname PR#3043 
- tools: subtle problem with unset in makefile PR#4048 
- camlp4: install pa_o_fast.o PR#3812 
- camlp4: install more modules PR#3689 

New features: 
- ocamldoc: name resolution in cross-referencing {!name}: if name is not 
     found, then it is searched in the parent module/class, and in   
the parent 
     of the parent, and so on until it is found. 
- ocamldoc: new option -short-functors to use a short form to display 
     functors in html generator PR#4017 
- ocamlprof: added "-version" option

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}$'?'<1':1

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