[cwn] Attn: Development Editor, Latest Caml Weekly News
Alan Schmitt
alan.schmitt at polytechnique.org
Tue Jul 5 02:08:55 PDT 2005
Hello,
Here is the latest Caml Weekly News, for the week of 28 June to 05
July, 2005.
1) Caml type rules
2) ARM or MIPS?
3) toplevels / bytecode interpreter
4) New location for OCaml tutorial
5) How to find out free diskspace?
========================================================================
1) Caml type rules
Archive: <http://thread.gmane.org/gmane.comp.lang.caml.general/29449>
------------------------------------------------------------------------
** Swaroop Sridhar asked and Jacques Garrigue answered:
> Is there a document that contains all of the type-inference rules of
> Ocaml? If so, I would appreciate a reference.
No document contains all the rules.
(It would be soon obsolete, due to the speed of changes :)
But most of the type system is accounted for in papers and technical
reports.
The following list may not be 100% accurate, nor complete, but it
should give you most of the type system:
Core language = HM type inference + algebraic datatypes:
Any good textbook on ML.
For the module system:
Applicative functors and fully transparent higher-order modules.
Xavier Leroy, POPL'95.
For objects and classes:
Objective ML: An effective object-oriented extension to ML.
Didier Remy and Jerome Vouillon, POPL'97.
For polymorphic variants and object typing:
Simple Type Inference for Structural Polymorphism
Jacques Garrigue, FOOL'2002.
For the typing of imperative features:
Relaxing the value restriction. Jacques Garrigue, FLOPS'04.
You can also find various papers on more specific aspects on
developpers' home pages.
Note however that some experimental features lack a detailed
presentation. For instance, recursive modules seem to be in this
category.
========================================================================
2) ARM or MIPS?
Archive: <http://thread.gmane.org/gmane.comp.lang.caml.general/29452>
------------------------------------------------------------------------
** Leszek Holenderski asked and Eric Cooper answered:
> Has OCaml been ported to ARM? If so, is the port really usable?
Yes, it's part of the standard distribution (see asmcomp/arm). I
hacked it into a cross-compiler a while ago so I could run OCaml
programs on a Sharp Zaurus. I haven't used it extensively, but both
byte-code and native-code programs worked fine.
========================================================================
3) toplevels / bytecode interpreter
Archive: <http://thread.gmane.org/gmane.comp.lang.caml.general/29498>
------------------------------------------------------------------------
** Jonathan Roewen asked and Jean-Marc Eber answered:
> Can the OCaml bytecode interpreter be embedded in C programs? For
> example, a C program that mimics the top-level to a simpler degree.
>
> I'm thinking of changing DST so that it runs a bytecode
interpreter on
> the bare metal instead of native code. Although, I'm sure I'd need a
> lot more libc underneath to get it working compared to native code :)
>
> I was also thinking the toplevel might be a good place to start
> (though, don't exactly need the shell-like interface...).
>
> Some pointers on general directions to take would be great.
Nive work has been done by Clément Capel on this topic:
<http://www.pps.jussieu.fr/~capel/eng/toplevel/toplevel.html>
Many hacks that were necessary at this time are no more needed due to
cleanup
work and necessary extensions done by Xavier before the release of
ocaml 3.08, I
think.
But definitively, its possible, yes.
** Clément Capel also answered:
yes, you can. I've developed that embedded interpreter you look for :)
At current time, It only works on ocaml 3.06, but the modifications to
perform are quite simple (i think) to make it works with the 3.08.
some links:
<http://caml.inria.fr/pub/ml-archives/caml-list/2004/04/
f3e4b58960169844f52a582c850028e9.en.html>
<http://www.pps.jussieu.fr/~capel/eng/toplevel/toplevel.html>
========================================================================
4) New location for OCaml tutorial
Archive: <http://thread.gmane.org/gmane.comp.lang.caml.general/29509>
------------------------------------------------------------------------
** Richard Jones announced:
I'm in the process of moving the OCaml tutorial to an open wiki here:
<http://www.ocaml-tutorial.org/>
========================================================================
5) How to find out free diskspace?
Archive: <http://thread.gmane.org/gmane.comp.lang.caml.general/29505>
------------------------------------------------------------------------
** Bernd Kuhls asked and Richard Jones answered:
> I am looking for some Ocaml code (or C bindings which work on
> Linux/Solaris/Cygwin) to get the amount of free diskspace on a
volume.
> The function should receive a string and return an int64 value or
> something similar.
The attached files have only been very lightly tested, but they appear
to work. You can work out the amount of free disk space by
multiplying the f_bfree and f_bsize fields.
Note the functions as they stand assume that Unix.file_descr = int and
don't throw a useful Unix error if the underlying call fails.
Rich.
----------------------------------------------------------------
statfs.ml
type statfs = {
f_type : int64;
f_bsize : int64;
f_blocks : int64;
f_bfree : int64;
f_bavail : int64;
f_files : int64;
f_ffree : int64;
f_fsid : unit; (* See note in statfs(2) *)
f_fnamelen : int64;
}
external statfs : string -> statfs = "statfs_statfs"
external fstatfs : Unix.file_descr -> statfs = "statfs_fstatfs"
----------------------------------------------------------------
statfs_c.c
#include <errno.h>
#include <string.h>
#include <sys/vfs.h>
#include <caml/alloc.h>
#include <caml/fail.h>
#include <caml/memory.h>
#include <caml/mlvalues.h>
static value
copy_statfs (struct statfs *buf)
{
CAMLparam0 ();
CAMLlocal1 (bufv);
bufv = caml_alloc (9, 0);
caml_modify (&Field (bufv, 0), copy_int64 (buf->f_type));
caml_modify (&Field (bufv, 1), copy_int64 (buf->f_bsize));
caml_modify (&Field (bufv, 2), copy_int64 (buf->f_blocks));
caml_modify (&Field (bufv, 3), copy_int64 (buf->f_bfree));
caml_modify (&Field (bufv, 4), copy_int64 (buf->f_bavail));
caml_modify (&Field (bufv, 5), copy_int64 (buf->f_files));
caml_modify (&Field (bufv, 6), copy_int64 (buf->f_ffree));
caml_modify (&Field (bufv, 7), Val_unit);
caml_modify (&Field (bufv, 8), copy_int64 (buf->f_namelen));
CAMLreturn (bufv);
}
CAMLprim value
statfs_statfs (value pathv)
{
CAMLparam1 (pathv);
CAMLlocal1 (bufv);
const char *path = String_val (pathv);
struct statfs buf;
if (statfs (path, &buf) == -1)
caml_failwith (strerror (errno));
bufv = copy_statfs (&buf);
CAMLreturn (bufv);
}
CAMLprim value
statfs_fstatfs (value fdv)
{
CAMLparam1 (fdv);
CAMLlocal1 (bufv);
int fd = Int_val (fdv);
struct statfs buf;
if (fstatfs (fd, &buf) == -1)
caml_failwith (strerror (errno));
bufv = copy_statfs (&buf);
CAMLreturn (bufv);
}
** Damien Doligez then said:
> static value
> copy_statfs (struct statfs *buf)
> {
> CAMLparam0 ();
> CAMLlocal1 (bufv);
> bufv = caml_alloc (9, 0);
> caml_modify (&Field (bufv, 0), copy_int64 (buf->f_type));
> [...]
>
There's a nasty bug lurking in this code. Depending on your
C compiler, you might be computing &Field (bufv, 0) before
the call to copy_int64, which can trigger a GC and change the
value of bufv, hence invalidating the address you've just
computed.
You should do it this way:
static value
copy_statfs (struct statfs *buf)
{
CAMLparam0 ();
CAMLlocal1 (bufv, v);
bufv = caml_alloc (9, 0);
v = copy_int64 (buf->f_type); caml_modify (&Field (bufv, 0), v);
v = copy_int64 (buf->f_bsize); caml_modify (&Field (bufv, 1), v);
v = copy_int64 (buf->f_blocks); caml_modify (&Field (bufv, 2), v);
v = copy_int64 (buf->f_bfree); caml_modify (&Field (bufv, 3), v);
v = copy_int64 (buf->f_bavail); caml_modify (&Field (bufv, 4), v);
v = copy_int64 (buf->f_files); caml_modify (&Field (bufv, 5), v);
v = copy_int64 (buf->f_ffree); caml_modify (&Field (bufv, 6), v);
caml_modify (&Field (bufv, 7), Val_unit);
v = copy_int64 (buf->f_namelen); caml_modify (&Field (bufv, 8), v);
CAMLreturn (bufv);
}
========================================================================
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
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
(alan.schmitt at polytechnique.org) and I'll mail it to you, or go take
a look at
the archive (<http://sardes.inrialpes.fr/~aschmitt/cwn/>) or the RSS
feed of the
archives (<http://sardes.inrialpes.fr/~aschmitt/cwn/cwn.rss>). If you
also wish
to receive it every week by mail, you may subscribe online at
<http://lists.idyll.org/listinfo/caml-news-weekly/> .
========================================================================
Alan Schmitt, <http://sardes.inrialpes.fr/~aschmitt/>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: PGP.sig
Type: application/pgp-signature
Size: 186 bytes
Desc: =?ISO-8859-1?Q?Ceci_est_une_signature_=E9lectronique_PGP?=
Url : http://lists.idyll.org/pipermail/caml-news-weekly/attachments/20050705/35ca9c99/PGP.bin
More information about the caml-news-weekly
mailing list