Version française
Home     About     Download     Resources     Contact us    
Browse thread
[Caml-list] ocaml killer
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: -- (:)
From: Vasile Rotaru <vrotaru@s...>
Subject: Re: fancy types (was Re: [Caml-list] ocaml killer)

William Lovas <wlovas@stwing.upenn.edu> wrote:

> On Fri, Jan 30, 2004 at 11:36:13AM +0100, Thomas Fischbacher wrote:
> > 
> > On Thu, 29 Jan 2004, William Lovas wrote:
> > 
> > >     # type ('a, 'b) specialist = S of (('a, 'b) specialist -> 'a -> 'b);;
[...]
> > 
> > Hm, correct me if I am wrong, but to me this looks as if you had to 
> > unnecessarily cons at every recursive call...
> 
> Well, it depends on what you mean by "unnecessarily" and what you mean by
> "cons".  First, if by "cons" you mean "call a constructor", then yes, i did
> have to cons at every recursive call.  However, if by "cons" you mean
> "allocate memory", i can't say for sure by looking at this code -- it says
> nothing about the optimizations applied to variant types during compilation
> or potential opportunities for structure sharing.  I strongly suspect that
> memory need not be allocated, though, in which case the answer is no, i did
> not have to allocate memory at every recursive cell.
> 

  Just look at this:

rv@helios:~$ cat specialist_typed.ml
type ('a, 'b) specialist = S of (('a, 'b) specialist -> 'a -> 'b)

let fac n =
  let do_rec (S specialist) n =
    if n = 0 then
      1
    else
      n * specialist (S specialist) (n - 1)
  in
  do_rec (S do_rec) n

rv@helios:~$ ocamlc -dlambda specialist_typed.ml
(setglobal Specialist_typed!
  (let
    (fac/61
       (function n/62
         (let
           (do_rec/63
              (function param/68 n/65
                (if (== n/65 0) 1
                  (let (specialist/64 (field 0 param/68))
                    (* n/65
                      (apply specialist/64 (makeblock 0 specialist/64)
                        (- n/65 1)))))))
           (apply do_rec/63 (makeblock 0 do_rec/63) n/62))))
    (makeblock 0 fac/61)))

rv@helios:~$ ocamlc -dlambda specialist_untyped.ml
(setglobal Specialist_untyped!
  (let
    (fac/56
       (function n/57
         (let
           (do_rec/58
              (function specialist/59 n/60
                (if (== n/60 0) 1
                  (* n/60
                    (apply specialist/59 (id specialist/59) (- n/60 1))))))
           (apply do_rec/58 do_rec/58 n/57))))
    (makeblock 0 fac/56)))


The difference between the two versions are in those two calls

    (id specialist/..)               ; obviously a nop
and
    (makeblock 0 specialist/..)      ; ???

Comments about whether (makeblock 0 ..) is a special case which can be
optimized away are welcome.

> 
> cheers,
> William
> 

Regards,
Vasha

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners