Version française
Home     About     Download     Resources     Contact us    
Browse thread
Instance variables can't be polymorphic?
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: -- (:)
From: Goswin von Brederlow <goswin-v-b@w...>
Subject: Re: [Caml-list] Re: Instance variables can't be polymorphic? {a few more annoyances on "val" syntax}
Zheng Li <zheng_li@users.sourceforge.net> writes:

> [OT]: Here are a few more annoyances on the syntax of instance
> variable I've encountered. I recorded it here for comments:
>
> Why it can't just copy the common "let" syntax in OCaml? Even though
> it's possible to just lift the awkward "val" definitions out of
> objects and using "let" instead, I'm really uncomfortable when being
> forced to do that. Besides, the lifted variables won't be accessible
> through inheritance any more, so they are not strictly equivalent or
> interchangeable in semantics.
>
> Currently, the "val" syntax
>
> - doesn't support pattern matching assignment. Instead of
>   --
>   let a,b,c,d = tuple4
>   --
>   one write
>   --
>   val a = match tuple4 with a,_,_,_ -> a
>   val b = match tuple4 with _,b,_,_ -> b
>   val c = match tuple4 with _,_,c,_ -> c
>   val d = match tuple4 with _,_,_,d -> d
>   --
>   This is still the easy case, image if your pattern matching will
> also trigger some side-effect.

class foo =
  let (a,b,c,d) = tuple4
  in
    object
      val a = a val b = b val c = c val d = d
    end

> - doesn't support sharing state.
>   --
>   let up,down =
>     let r = ref 0 in
>     (fun () -> incr r; !r),
>     (fun () -> decr r; !r)
>   --
>   can't be expressed directly as instance variables

Same thing. Use let to create the shared state and then assign in the object.

Although that really ought to be written as

class foo : object (* to hide count if you really want that *)
  method private up : unit
  method private down : unit
end = object
  val count = ref 0
  method private up = incr count
  method private down = decr count
end

> - doesn't support shortcut syntax of function definition like
>   --
>   val f x y z = x + y + z
>   --
>   instead one must write
>   --
>   val f = fun x y z -> x + y + z
>   --

same

> - doesn't support recursion. Instead of
>   --
>   val rec fact n =
>     if n <= 1 then 1 else n * fact (n-1)
>   --
>   one must write
>   --
>   val fact =
>     let rec fact_rec n =
>       if n <= 1 then 1 else n * fact_rec (n-1) in
>     fact_rec
>   --

same

> - all parallel assignments, no assignment orders, hence can't refer to
> previous assignment
>
>   --
>   val x = 3
>   val y = x + 11
>   --
>
> is wrong, even if it makes perfect sense in many situations. To access
> "x", one is simply forced to declare "y" as method!

same again.

> Any comments?

Yes, ocaml objects can drive one nuts. :)


You seem to want to use classes with static functions (functions that
do not have/use self). Why not use records? Is that just because you
can not coerce record to a "subtype"? Sometimes one can use modules
and functors instead of objects.

MfG
        Goswin