Compiler construction OCAML中的循环依赖控制
[编辑] 谢谢你的回答,我的问题如下: 称为Map.ml的模块ACompiler 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
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