Compiler construction OCAML中的循环依赖控制

Compiler construction OCAML中的循环依赖控制,compiler-construction,dependency-injection,module,ocaml,circular-dependency,Compiler Construction,Dependency Injection,Module,Ocaml,Circular Dependency,[编辑] 谢谢你的回答,我的问题如下: 称为Map.ml的模块A let lst = ref [Instance1_ModuleB; Instance2_ModuleB; ...];; let is_coliding p = DoSomeWork_And_Return_A_Bool ;; .... other things here. Open Map class player_object (x_in, y_in, name_in)= object (self) method jump

[编辑]

谢谢你的回答,我的问题如下:

称为Map.ml的模块A

let lst = ref [Instance1_ModuleB; Instance2_ModuleB; ...];;
let is_coliding p = DoSomeWork_And_Return_A_Bool ;;
.... other things here.
Open Map
class player_object (x_in, y_in, name_in)=

object (self)

method jump () =
       if Map.is_colliding self then
             DoSomeThing ();;
....
称为Player.ml的模块B

let lst = ref [Instance1_ModuleB; Instance2_ModuleB; ...];;
let is_coliding p = DoSomeWork_And_Return_A_Bool ;;
.... other things here.
Open Map
class player_object (x_in, y_in, name_in)=

object (self)

method jump () =
       if Map.is_colliding self then
             DoSomeThing ();;
....
任何关于如何让它起作用的线索

顺便问一下,其他编程语言是如何做到这一点的?我从来不在乎C语言中的这种依赖性
谢谢

如果您的模块A只需要模块B中的类型而不需要值,那么您可以使用模块B的接口创建moduleB.mli,并在模块A之前编译它:

moduleA.ml:

let foo (bar : ModuleB.bar) = bar.baaz
let li = [new bar; new bar]

let foo (bar : ModuleB.bar) = bar.baaz
let li = [new bar; new bar]

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

class bar : object
  method baaz : int
  method buz : int
end
模B.ml

class bar =
object(s)
  method baaz = 3
  method buz = ModuleA.foo s
end
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
但如果您对值或函数有循环依赖,则没有简单的解决方案,例如:

moduleA.ml:

let foo (bar : ModuleB.bar) = bar.baaz
let li = [new bar; new bar]

let foo (bar : ModuleB.bar) = bar.baaz
let li = [new bar; new bar]

let foo (bar : ModuleB.bar) = bar.baaz
let _ = ModuleB.initB foo
通常,可以尝试使用引用或可变值来打破这种循环依赖关系:

moduleA.ml:

let foo (bar : ModuleB.bar) = bar.baaz
let li = [new bar; new bar]

let foo (bar : ModuleB.bar) = bar.baaz
let li = [new bar; new bar]

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

class bar =
object(s)
  method baaz = 3
  method buz = ModuleA.foo s
end
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