Version française
Home     About     Download     Resources     Contact us    
Browse thread
[Caml-list] Recursion between class and value?
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: -- (:)
From: Jacques Garrigue <garrigue@k...>
Subject: Re: [Caml-list] Recursion between class and value?
From: tim@fungible.com (Tim Freeman)
> I'd like to be able to have a class and a function be mutually
> recursive, kind of like this:
> 
>    class foo = object
>      method bar x =
>        if x > 0 then baz (x - 1)
>        else ()
>    end
> 
>    let baz z =
>      if z > 0 then
>        (new foo)#bar (z - 1)
>      else ()

The recursion is between baz and the constructor of foo (not the
type). So this is only a value level problem.

While your solution is ok:
> The best I know how to do is transform baz into a method on foo,
> yielding this:

A simpler one is to make new foo a parameter of baz:

  let baz ~new_foo z = 
    if z > 0 then new_foo#bar (z - 1)

  class foo = object
    method bar x = if x > 0 then baz ~new_foo:(new foo) (x - 1)
  end

  let baz n = baz ~new_foo:(new foo) n

A little heavy, but pretty classical.
An even heavier approach, but maybe more intuitive, is to put baz in
another class, do that you can access foo's constructor.

Jacques Garrigue
-------------------
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