Re: [Caml-list] Embedding the ocaml runtime in a shared library on amd64/x86_64

2009-12-03 Thread Joost Yervante Damad
On Wednesday 02 December 2009 23:37:51 Stefano Zacchiroli wrote:
 On Wed, Dec 02, 2009 at 04:51:16PM +, Richard Jones wrote:
  On Wed, Dec 02, 2009 at 01:33:11PM +0100, Joost Yervante Damad wrote:
   I think compiling with -fPIC by default on the amd64/x86_64 arch
   would be a good start to making it more usable for embedding.
 
  I think this is also a very good idea.
 
 Seconded.
 
  We went through this already with libcamlrun.a:
  http://caml.inria.fr/mantis/view.php?id=3866
 
 Just to clarify a bit more for who did not follow that bug: what we did
 there was not precisely what Joost asked for (i.e. build libasmrun.a
 with -fPIC). Rather the patch offers two different libraries:
 libcamlrun.a (no -fPIC) and libcamlrun_shared.so (-fPIC). The reason was
 a performance penalty in using the -fPIC version.

Reading up on this, I don't think using -fPIC on amd64 has a performance 
penalty since it has the %rip register. Also it appears that gcc by default 
uses indirect addressing via %rip in the generated asm.

 Both in Debian and Fedora package you now have both libraries.
 
 That said, I share Rich's suggestion: please file a bug (with patch
 would be even better :)), that enable building 2 different versions of
 libcamlrun, one built with -fPIC, the other as it is now.

I'm first working out the details for a larger application to make sure that 
also works.
I'll file a bug when I have a fully working solution.

greetings, Joost Damad

-- 
Joost Yervante Damad - http://damad.be/joost/

___
Caml-list mailing list. Subscription management:
http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list
Archives: http://caml.inria.fr
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
Bug reports: http://caml.inria.fr/bin/caml-bugs


Re: [Caml-list] Random questions

2009-12-03 Thread AUGER
Le Wed, 18 Nov 2009 11:59:08 +0100, Daniel Bünzli  
daniel.buen...@erratique.ch a écrit:



I know little about PRGN and unfortunately in a lot of cases the
functions in the Random module don't provide me the right
interface. Could anybody tell me if the following functions preserve
the quality of the underlying PRGN and/or if there's a better way to
achieve that :



(* preliminary function: negate_minus_1 : int - int : n |- -n-1 *)
let negate_minus_1 = (lor) (-(max_int/2)-1) (* or inline the constant *)



1) Generate an arbitrary int

let rint () = Random.bits () lor ((Random.bits () land 1) lsl 30)

It seems ok to me even if this variant seems slightly more efficient,
since we don't have to bother with making a single bit;
note the use of the xor instead of the or, which keeps the probability of  
one bit to 1/2
(in your example, this probability was kept since one of the bit was  
forced to be 0):


let rint () = (Random.bits () lsl 1) lxor (Random.bits ());;

-or-

let rint () = let r = Random.bits () in
	  if Random.bool () then negate_minus_1 r (* or inline negate_minus_1  
*)

  else r

note these functions don't rely on the fact ints are on 31 bits
if Random.bool is more efficient than Random.bits, the latter seems the  
best; to be benchmarked...





2) Generate an arbitrary int in [0;max] (bounds included)

let random_uint ?(max = max_int) =
  if max  0 then invalid_arg negative max else
  if max = max_int then Random.bits else
  let bound = max + 1 in
  fun () - Random.int bound


Seems correct.
I don't know if use of exception is more efficient or not, it is to try:

let random_uint ?(max = max_int) () =
 try if max = max_int then Random.bits () else Random.int (max + 1)
 with Invalid_argument Random.int - invalid_arg negative max




3) Generate an arbitrary int in [-max;max] (bounds included)

let random_int ?(max = max_int) =
  if max  0 then invalid_arg negative max else
  if max = max_int then
let rec aux () =
  let v = rint () in if v = min_int then aux () else v in
  aux
  else
let bound = (2 * max) + 1 in
if 0  bound  bound  max_int then
  fun () - -max + Random.int bound
else
  let bound = Int32.add (Int32.mul 2l (Int32.of_int max)) 1l in
  let min = Int32.of_int (-max) in
  fun () - Int32.to_int (Int32.add min (Random.int32 bound))




I think it is better to use the bool trick;
simpler and doesn't use Int32:

let random_int ?(max = max_int) =
   if max  0 then invalid_arg negative max else
   if max = 0 then 0 else
   if Random.bool ()
   then if max = max_int then Random.bits ()
else Random.int max
   else negate_minus_1 (Random.int (max - 1)) (* inline? *)


5) Generate an arbitrary float in [0;max] (bounds included)

let after_one = 1. +. epsilon_float
let random_ufloat ?(max = max_float) =
  if max  0. then invalid_arg negative max else
  fun () - (Random.float after_one) *. max

This function is less interesting than Random.float:
only less or as many as values as floats in [0.;1.] can be generated
so you will miss many values only to be able to produce max
(for example, you cannot 1+eps if you try random_ufloat ~max:2. ())

The best would be to have a succ function for floats



6) Generate an arbitrary float in [-max;max] (bounds included)

let after_one = 1. +. epsilon_float
let random_float ?(max = max_float) =
  if max  0. then invalid_arg negative max else
  fun () - (-1. +. (Random.float after_one) *. 2.) *. max


same remark


Thanks for your answers,

Daniel

___
Caml-list mailing list. Subscription management:
http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list
Archives: http://caml.inria.fr
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
Bug reports: http://caml.inria.fr/bin/caml-bugs



--
Cédric AUGER

Univ Paris-Sud, Laboratoire LRI, UMR 8623, F-91405, Orsay

___
Caml-list mailing list. Subscription management:
http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list
Archives: http://caml.inria.fr
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
Bug reports: http://caml.inria.fr/bin/caml-bugs


Re: [Caml-list] Embedding the ocaml runtime in a shared library on amd64/x86_64

2009-12-03 Thread Alain Frisch

Joost Yervante Damad wrote:
Reading up on this, I don't think using -fPIC on amd64 has a performance 
penalty since it has the %rip register. Also it appears that gcc by default 
uses indirect addressing via %rip in the generated asm.


I did some benchmarks when switching the ocamlopt AMD64 code generator 
to generate PIC code by default (in order to support Dynlink on native 
code): the slowdown was indeed very small (in the order of a few percent 
for micro benchmarks). Modern processors seem very good for optimizing 
indirect calls.



Alain


___
Caml-list mailing list. Subscription management:
http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list
Archives: http://caml.inria.fr
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
Bug reports: http://caml.inria.fr/bin/caml-bugs


Re: [Caml-list] Embedding the ocaml runtime in a shared library on amd64/x86_64

2009-12-03 Thread Stefano Zacchiroli
On Thu, Dec 03, 2009 at 11:56:59AM +0100, Joost Yervante Damad wrote:
 Reading up on this, I don't think using -fPIC on amd64 has a performance 
 penalty since it has the %rip register. Also it appears that gcc by default 
 uses indirect addressing via %rip in the generated asm.

I duly notice that OCaml is not only compiler on modern processors.
So, a solution that does not offer the non-fPIC solution might be more
than appropriate on amd64 processors, but maybe not as much appropriate
on other architectures (Debian, for instance, support about 10 other
architectures in addition to amd64; even if we restrict to architecture
having ocamlopt, there is more than plain amd64).

Note: I haven't checked whether there is a difference on all such
architectures for what concerns libasmrun, but there were difference for
such archs for libcamlrun.

Given the negligible cost (both in term of patch preparation and of
solution complexity) of supporting the build of both kind of libraries,
I don't see why we should simply switch to the -fPIC library, trashing
the other.

Thanks for your work on this!
Cheers.

-- 
Stefano Zacchiroli -o- PhD in Computer Science \ PostDoc @ Univ. Paris 7
z...@{upsilon.cc,pps.jussieu.fr,debian.org} -- http://upsilon.cc/zack/
Dietro un grande uomo c'è ..|  .  |. Et ne m'en veux pas si je te tutoie
sempre uno zaino ...| ..: | Je dis tu à tous ceux que j'aime

___
Caml-list mailing list. Subscription management:
http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list
Archives: http://caml.inria.fr
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
Bug reports: http://caml.inria.fr/bin/caml-bugs


Re: [Caml-list] Random questions

2009-12-03 Thread Daniel Bünzli
Hello Cedric,

Thanks for your comments. Comments on your comments.

 let rint () = (Random.bits () lsl 1) lxor (Random.bits ());;

That was actually my first version. However I dropped it because I
thought that generating a new random number by the interaction of the
bits of two successive PRN could somehow change the underlying quality
of the generator. Any thought ?

 if Random.bool is more efficient than Random.bits, the latter seems the
 best; to be benchmarked

Random.bool is Random.bits () land 0 = 1.

 2) Generate an arbitrary int in [0;max] (bounds included)

 let random_uint ?(max = max_int) =
  if max  0 then invalid_arg negative max else
  if max = max_int then Random.bits else
  let bound = max + 1 in
  fun () - Random.int bound

 Seems correct.
 I don't know if use of exception is more efficient or not, it is to try:

 let random_uint ?(max = max_int) () =
  try if max = max_int then Random.bits () else Random.int (max + 1)
  with Invalid_argument Random.int - invalid_arg negative max

You lose the ability to partially apply random_uint with the max and
avoid the if on each call.


 I think it is better to use the bool trick;
 simpler and doesn't use Int32:

 let random_int ?(max = max_int) =
   if max  0 then invalid_arg negative max else
   if max = 0 then 0 else
   if Random.bool ()
   then if max = max_int then Random.bits ()
        else Random.int max
   else negate_minus_1 (Random.int (max - 1)) (* inline? *)


Yes, thanks. Your version can also be reordered to be partially applicable.

It should also be noted that all our functions for [int]s don't work
with the intended semantics on 64 bits platforms.

 5) Generate an arbitrary float in [0;max] (bounds included)

 let after_one = 1. +. epsilon_float
 let random_ufloat ?(max = max_float) =
  if max  0. then invalid_arg negative max else
  fun () - (Random.float after_one) *. max

 This function is less interesting than Random.float:
 only less or as many as values as floats in [0.;1.] can be generated
 so you will miss many values only to be able to produce max
 (for example, you cannot 1+eps if you try random_ufloat ~max:2. ())

The point you make maybe valid but unfortunately that's also the case
for Random.float as this is the way it is implemented (generate a
number in [0;1[ and scale it).

Best,

Daniel

___
Caml-list mailing list. Subscription management:
http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list
Archives: http://caml.inria.fr
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
Bug reports: http://caml.inria.fr/bin/caml-bugs


Re: [Caml-list] Random questions

2009-12-03 Thread AUGER
Le Thu, 03 Dec 2009 15:48:37 +0100, Daniel Bünzli  
daniel.buen...@erratique.ch a écrit:



Hello Cedric,

Thanks for your comments. Comments on your comments.


let rint () = (Random.bits () lsl 1) lxor (Random.bits ());;


That was actually my first version. However I dropped it because I
thought that generating a new random number by the interaction of the
bits of two successive PRN could somehow change the underlying quality
of the generator. Any thought ?


If it is the case, then the generation is of bad quality...
If you can predict the generated values of such combinations,
 then it is easy to predict the values of the base generator;
 which is then a bad generator.
(What I say is not valid for non reversible combination, such as or or  
and,

 even if it implies that generator is of poor quality too;
 and not valid for complex operation, such as emulating the generator  
itself).
I am not expert in this domain, so it is better to directly ask on  
specialists.





if Random.bool is more efficient than Random.bits, the latter seems the
best; to be benchmarked


Random.bool is Random.bits () land 0 = 1.

ok, so this function is not as interessant as I thought.




2) Generate an arbitrary int in [0;max] (bounds included)

let random_uint ?(max = max_int) =
 if max  0 then invalid_arg negative max else
 if max = max_int then Random.bits else
 let bound = max + 1 in
 fun () - Random.int bound


Seems correct.
I don't know if use of exception is more efficient or not, it is to try:

let random_uint ?(max = max_int) () =
 try if max = max_int then Random.bits () else Random.int (max + 1)
 with Invalid_argument Random.int - invalid_arg negative max


You lose the ability to partially apply random_uint with the max and
avoid the if on each call.



I think it is better to use the bool trick;
simpler and doesn't use Int32:

let random_int ?(max = max_int) =
  if max  0 then invalid_arg negative max else
  if max = 0 then 0 else
  if Random.bool ()
  then if max = max_int then Random.bits ()
   else Random.int max
  else negate_minus_1 (Random.int (max - 1)) (* inline? *)



Yes, thanks. Your version can also be reordered to be partially  
applicable.


It should also be noted that all our functions for [int]s don't work
with the intended semantics on 64 bits platforms.


I noticed it, but I may have forgot to write it down.




5) Generate an arbitrary float in [0;max] (bounds included)

let after_one = 1. +. epsilon_float
let random_ufloat ?(max = max_float) =
 if max  0. then invalid_arg negative max else
 fun () - (Random.float after_one) *. max


This function is less interesting than Random.float:
only less or as many as values as floats in [0.;1.] can be generated
so you will miss many values only to be able to produce max
(for example, you cannot 1+eps if you try random_ufloat ~max:2. ())


The point you make maybe valid but unfortunately that's also the case
for Random.float as this is the way it is implemented (generate a
number in [0;1[ and scale it).
Ok, in fact it is reasonnable to do it since generating a random bit  
sequence (uniformly)
won't lead to a uniform law on floats, taking the exposant in  
consideration, will result in

more fine grained generator, but at a rather high cost.
and between 0 and 1 you can use int generation.

Furthermore, use of generated random floats is often done in [0;1] (as it  
is a probability).




Best,

Daniel

___
Caml-list mailing list. Subscription management:
http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list
Archives: http://caml.inria.fr
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
Bug reports: http://caml.inria.fr/bin/caml-bugs



--
Cédric AUGER

Univ Paris-Sud, Laboratoire LRI, UMR 8623, F-91405, Orsay

___
Caml-list mailing list. Subscription management:
http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list
Archives: http://caml.inria.fr
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
Bug reports: http://caml.inria.fr/bin/caml-bugs


[Caml-list] Hoogle for Ocaml

2009-12-03 Thread Matthias Görgens
Hi,

Is there an equivalent to Haskell's Hoogle for Ocaml?

Matthias.

___
Caml-list mailing list. Subscription management:
http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list
Archives: http://caml.inria.fr
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
Bug reports: http://caml.inria.fr/bin/caml-bugs


Re: [Caml-list] Hoogle for Ocaml

2009-12-03 Thread Richard Jones
On Thu, Dec 03, 2009 at 04:08:08PM +, Matthias Görgens wrote:
 Is there an equivalent to Haskell's Hoogle for Ocaml?

Not really ..  I have been meaning for several years to implement
something like *CPAN* for OCaml.  CPAN is much more than what people
here seem to think it is.

Rich.

-- 
Richard Jones
Red Hat

___
Caml-list mailing list. Subscription management:
http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list
Archives: http://caml.inria.fr
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
Bug reports: http://caml.inria.fr/bin/caml-bugs


Re: [Caml-list] Hoogle for Ocaml

2009-12-03 Thread Tom Hutchinson

This might be what you're looking for:

http://docs.camlcity.org/docs/index.html

You can search through the files in all of the GODI packages. It's not  
just function names and type signatures so you might get more results  
than you want.


Tom

On Dec 3, 2009, at 5:08 PM, Matthias Görgens wrote:


Hi,

Is there an equivalent to Haskell's Hoogle for Ocaml?

Matthias.

___
Caml-list mailing list. Subscription management:
http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list
Archives: http://caml.inria.fr
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
Bug reports: http://caml.inria.fr/bin/caml-bugs


___
Caml-list mailing list. Subscription management:
http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list
Archives: http://caml.inria.fr
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
Bug reports: http://caml.inria.fr/bin/caml-bugs


Re: [Caml-list] Random questions

2009-12-03 Thread AUGER
Le Thu, 03 Dec 2009 17:01:18 +0100, Damien Doligez  
damien.doli...@inria.fr a écrit:




On 2009-12-03, at 12:00, AUGER wrote:


(* preliminary function: negate_minus_1 : int - int : n |- -n-1 *)
let negate_minus_1 = (lor) (-(max_int/2)-1) (* or inline the constant *)


You probably mean this:

let negate_minus_1 = (lxor) (-1);;

-- Damien


You are right



___
Caml-list mailing list. Subscription management:
http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list
Archives: http://caml.inria.fr
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
Bug reports: http://caml.inria.fr/bin/caml-bugs



--
Cédric AUGER

Univ Paris-Sud, Laboratoire LRI, UMR 8623, F-91405, Orsay

___
Caml-list mailing list. Subscription management:
http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list
Archives: http://caml.inria.fr
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
Bug reports: http://caml.inria.fr/bin/caml-bugs


Re: [Caml-list] Hoogle for Ocaml

2009-12-03 Thread rixed
 Not really ..  I have been meaning for several years to implement
 something like *CPAN* for OCaml.  CPAN is much more than what people
 here seem to think it is.

Out of curiosity, what's in CPAN that's not in GODI ?

___
Caml-list mailing list. Subscription management:
http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list
Archives: http://caml.inria.fr
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
Bug reports: http://caml.inria.fr/bin/caml-bugs


What is CPAN? (was: Re: [Caml-list] Hoogle for Ocaml)

2009-12-03 Thread Richard Jones
On Thu, Dec 03, 2009 at 05:51:00PM +0100, ri...@happyleptic.org wrote:
  Not really ..  I have been meaning for several years to implement
  something like *CPAN* for OCaml.  CPAN is much more than what people
  here seem to think it is.
 
 Out of curiosity, what's in CPAN that's not in GODI ?

OK, I knew I'd have to answer this question :-)

CPAN is:

(1) A network of redundant mirrors which means you can always get the
tarball you need, even when the original site is down:

http://mirrors.geoexpat.com/cpan/authors/id/R/RW/RWMJ/
http://mirror.unej.ac.id/cpan/authors/id/R/RW/RWMJ/
http://mirrors.ucr.ac.cr/CPAN/authors/id/R/RW/RWMJ/
(more: http://search.cpan.org/mirror)

(2) CPAN unpacks each tarball and makes the source and documentation
available in a browsable way:

http://search.cpan.org/~rwmj/Net-FTPServer-1.122/lib/Net/FTPServer.pm
http://cpansearch.perl.org/src/RWMJ/Net-FTPServer-1.122/lib/Net/FTPServer.pm

(3) An excellent search tool:

http://search.cpan.org/search?query=IO%3A%3Astringymode=all

(4) A central namespace registry for Perl modules.  Once someone has
the name 'Net::FTPServer', if you want to write an FTP server, you
know you need to give it a different name.

(5) A testing network.  When you submit a new version of your module,
it is picked up by automated and manual testers around the world, who
build and test it on their systems (often oddball ones - eg. I get
reports about it failing to build on SunOS and AIX).

(6) A place where you can browse everything that Perl supports:

http://www.cpan.org/modules/by-module/
http://www.cpan.org/modules/01modules.index.html

Which is great advertising for Perl, because you can immediately
see the breadth of available libraries for Perl.

(7) A command line tool to download and install CPAN modules:

http://search.cpan.org/~andk/CPAN-1.9402/lib/CPAN.pm#DESCRIPTION

-- Note what CPAN is *not*:

It's not a packaging system.  Perl has its own packaging standard(s)
(like cabal for Haskell), but CPAN doesn't care.  It hosts source
tarballs.

It doesn't store binaries.

It's not strongly centralized.  Actually, it's very loose indeed.
Although there is a central place where you upload modules, they are
very loose about naming, content, licensing etc. (within limits of
course).

--

 Out of curiosity, what's in CPAN that's not in GODI ?

I think that Gerd Stolpmann has (to his credit) done a lot of the work
that CPAN does, but I also think it should be on a firmer footing,
mirrored more widely, the search tools should be linked from the OCaml
home page, and not tied to building modules, but to hosting source
tarballs.  And more inclusive - it should include *every* source
tarball -- as much OCaml source as possible.

Rich.

-- 
Richard Jones
Red Hat

___
Caml-list mailing list. Subscription management:
http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list
Archives: http://caml.inria.fr
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
Bug reports: http://caml.inria.fr/bin/caml-bugs


Re: [Caml-list] Hoogle for Ocaml

2009-12-03 Thread Matthias Görgens
 This might be what you're looking for:
 http://docs.camlcity.org/docs/index.html

Thanks.  I'll try it.  Does it support e.g. searching for (a-b) -
[a] - [b] and spitting out List.map?

Matthias.

___
Caml-list mailing list. Subscription management:
http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list
Archives: http://caml.inria.fr
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
Bug reports: http://caml.inria.fr/bin/caml-bugs


Re: [Caml-list] Hoogle for Ocaml

2009-12-03 Thread Gerd Stolpmann

Am Donnerstag, den 03.12.2009, 18:45 + schrieb Matthias Görgens:
  This might be what you're looking for:
  http://docs.camlcity.org/docs/index.html
 
 Thanks.  I'll try it.  Does it support e.g. searching for (a-b) -
 [a] - [b] and spitting out List.map?

There is no search for type expressions. 

Here is the query syntax: http://docs.camlcity.org/docs/syntax.html

Gerd
-- 

Gerd Stolpmann, Bad Nauheimer Str.3, 64289 Darmstadt,Germany 
g...@gerd-stolpmann.de  http://www.gerd-stolpmann.de
Phone: +49-6151-153855  Fax: +49-6151-997714


___
Caml-list mailing list. Subscription management:
http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list
Archives: http://caml.inria.fr
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
Bug reports: http://caml.inria.fr/bin/caml-bugs


Re: What is CPAN? (was: Re: [Caml-list] Hoogle for Ocaml)

2009-12-03 Thread Gerd Stolpmann

Am Donnerstag, den 03.12.2009, 18:00 + schrieb Richard Jones:
 On Thu, Dec 03, 2009 at 05:51:00PM +0100, ri...@happyleptic.org wrote:
   Not really ..  I have been meaning for several years to implement
   something like *CPAN* for OCaml.  CPAN is much more than what people
   here seem to think it is.
  
  Out of curiosity, what's in CPAN that's not in GODI ?
 
 OK, I knew I'd have to answer this question :-)
 
 CPAN is:
 
 (1) A network of redundant mirrors which means you can always get the
 tarball you need, even when the original site is down:
 
 http://mirrors.geoexpat.com/cpan/authors/id/R/RW/RWMJ/
 http://mirror.unej.ac.id/cpan/authors/id/R/RW/RWMJ/
 http://mirrors.ucr.ac.cr/CPAN/authors/id/R/RW/RWMJ/
 (more: http://search.cpan.org/mirror)
 
 (2) CPAN unpacks each tarball and makes the source and documentation
 available in a browsable way:
 
 http://search.cpan.org/~rwmj/Net-FTPServer-1.122/lib/Net/FTPServer.pm
 http://cpansearch.perl.org/src/RWMJ/Net-FTPServer-1.122/lib/Net/FTPServer.pm
 
 (3) An excellent search tool:
 
 http://search.cpan.org/search?query=IO%3A%3Astringymode=all
 
 (4) A central namespace registry for Perl modules.  Once someone has
 the name 'Net::FTPServer', if you want to write an FTP server, you
 know you need to give it a different name.
 
 (5) A testing network.  When you submit a new version of your module,
 it is picked up by automated and manual testers around the world, who
 build and test it on their systems (often oddball ones - eg. I get
 reports about it failing to build on SunOS and AIX).
 
 (6) A place where you can browse everything that Perl supports:
 
 http://www.cpan.org/modules/by-module/
 http://www.cpan.org/modules/01modules.index.html
 
 Which is great advertising for Perl, because you can immediately
 see the breadth of available libraries for Perl.
 
 (7) A command line tool to download and install CPAN modules:
 
 http://search.cpan.org/~andk/CPAN-1.9402/lib/CPAN.pm#DESCRIPTION
 
 -- Note what CPAN is *not*:
 
 It's not a packaging system.  Perl has its own packaging standard(s)
 (like cabal for Haskell), but CPAN doesn't care.  It hosts source
 tarballs.
 
 It doesn't store binaries.
 
 It's not strongly centralized.  Actually, it's very loose indeed.
 Although there is a central place where you upload modules, they are
 very loose about naming, content, licensing etc. (within limits of
 course).
 
 --
 
  Out of curiosity, what's in CPAN that's not in GODI ?
 
 I think that Gerd Stolpmann has (to his credit) done a lot of the work
 that CPAN does, but I also think it should be on a firmer footing,
 mirrored more widely, the search tools should be linked from the OCaml
 home page, and not tied to building modules, but to hosting source
 tarballs.  And more inclusive - it should include *every* source
 tarball -- as much OCaml source as possible.

Yes, nice goals - but hard to achieve if you only have limited
resources. Also, don't forget that Perl attracted a lot of sysadmins,
and for them it is a lot of fun to create something like CPAN. For the
typical Ocaml developer it is scripting hell. Finally, there is the
question of creating normative pressure so sources have some formal
uniformity - normal for sysadmins, but a no-go for the creative
ocamlists.

I'd say it is a different project than GODI to make sources available,
browsable and searchable. There's some overlap, though.

Gerd
-- 

Gerd Stolpmann, Bad Nauheimer Str.3, 64289 Darmstadt,Germany 
g...@gerd-stolpmann.de  http://www.gerd-stolpmann.de
Phone: +49-6151-153855  Fax: +49-6151-997714


___
Caml-list mailing list. Subscription management:
http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list
Archives: http://caml.inria.fr
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
Bug reports: http://caml.inria.fr/bin/caml-bugs


Re: What is CPAN? (was: Re: [Caml-list] Hoogle for Ocaml)

2009-12-03 Thread rixed
  (1) A network of redundant mirrors which means you can always get the
  tarball you need, even when the original site is down:

If I understand correctly, GODI site does not store any of the source
tarballs, but the makefiles download the sources directly from their
respective home, does it ? Can't we use the MASTER_SITE_BACKUP make
variables to have one or several backup sites ?

If it's usefull I can try to setup a server to download every possible
source tarballs and serve as such a site backup.

But would it be usefull ?

  (2) CPAN unpacks each tarball and makes the source and documentation
  available in a browsable way:

Why is it any better than something like that :

http://docs.camlcity.org/docs/godipkg/3.10/godi-frontc/doc/godi-frontc/html/Ctoxml.html

  (3) An excellent search tool:

Ok.

  (4) A central namespace registry for Perl modules.  Once someone has
  the name 'Net::FTPServer', if you want to write an FTP server, you
  know you need to give it a different name.

Ok ; unfortunately no such authority is required to name the few
(compared to perl) ocaml libraries.

  (5) A testing network.
  (6) A place where you can browse everything that Perl supports:

That would be nice to have in Godi as well.

  (7) A command line tool to download and install CPAN modules:

I like godi_console (despite laking fancy colors :-), although I'd
like a simpler command line tool to be available as well.


___
Caml-list mailing list. Subscription management:
http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list
Archives: http://caml.inria.fr
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
Bug reports: http://caml.inria.fr/bin/caml-bugs


[Caml-list] Re: What is CPAN? (was: Re: Hoogle for Ocaml)

2009-12-03 Thread Sylvain Le Gall
On 03-12-2009, ri...@happyleptic.org ri...@happyleptic.org wrote:
  (1) A network of redundant mirrors which means you can always get the
  tarball you need, even when the original site is down:

 If I understand correctly, GODI site does not store any of the source
 tarballs, but the makefiles download the sources directly from their
 respective home, does it ? Can't we use the MASTER_SITE_BACKUP make
 variables to have one or several backup sites ?

 If it's usefull I can try to setup a server to download every possible
 source tarballs and serve as such a site backup.

 But would it be usefull ?


Yes of course. You can use ocamlcore.org website to do that. I have
already a proof of concept using uscan + Debian watch file, to scan
for new upstream on a weekly basis.

Send me a private mail, if you want to proceed.

Once the website is setup, we can use rsync to propagate it
(ssh.ocamlcore.org has rsync installed).

Everything is ready on *.ocamlcore.org, we just need some volunteer to
do the work.

Regards,
Sylvain Le Gall

___
Caml-list mailing list. Subscription management:
http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list
Archives: http://caml.inria.fr
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
Bug reports: http://caml.inria.fr/bin/caml-bugs