циклический контроль зависимостей в OCAML - PullRequest
1 голос
/ 06 апреля 2009

[EDIT]

Спасибо за ваш ответ, моя проблема заключается в следующем:

Модуль A называется Map.ml

let lst = ref [Instance1_ModuleB; Instance2_ModuleB; ...];;
let is_coliding p = DoSomeWork_And_Return_A_Bool ;;
.... other things here.

Модуль B называется Player.ml

Open Map
class player_object (x_in, y_in, name_in)=

object (self)

method jump () =
       if Map.is_colliding self then
             DoSomeThing ();;
....

Любая подсказка, как заставить это работать.

Кстати, как другие языки программирования справляются с этим? Меня никогда не волнует такая зависимость в C # !!!!! Спасибо

1 Ответ

3 голосов
/ 06 апреля 2009

Если вашему модулю A нужен только тип из модуля B и значение отсутствует, вы можете создать moduleB.mli с интерфейсом модуля B и скомпилировать его перед модулем A:

moduleA.ml:

let foo (bar : ModuleB.bar) = bar.baaz

moduleB.mli:

class bar : object
  method baaz : int
  method buz : int
end

moduleB.ml

class bar =
object(s)
  method baaz = 3
  method buz = ModuleA.foo s
end

Но если у вас есть круговая зависимость от значения или функции, то простого решения не существует, как, например, для:

moduleA.ml:

let li = [new bar; new bar]

let foo (bar : ModuleB.bar) = bar.baaz

Можно попытаться разорвать такую ​​круговую зависимость, используя общее или изменяемое значение:

moduleA.ml:

let li = [new bar; new bar]

let foo (bar : ModuleB.bar) = bar.baaz
let _ = ModuleB.initB foo

moduleB.ml

let foo = ref (fun x -> (failwith "not initialized" : int))

class bar =
object(s)
  method baaz = 3
  method buz = !foo s
end

let initB f = foo := f
...