Module 确保对ref的多次调用得到相同的结果

Module 确保对ref的多次调用得到相同的结果,module,ocaml,consistency,Module,Ocaml,Consistency,我调用模块中的函数来生成唯一的标签,例如 MyMod.gensym 定义为 let gensym : string -> string = let c = ref 0 in fun s -> incr c; Printf.sprintf "!%s%d" s (!c) 但是,我希望能够在某些时候从使用这个gensym的函数中得到可复制的结果,例如 let reproducible = SomeMod.call x 第一次可以返回[“!a1”;“!a2”],第二次可以返回[

我调用模块中的函数来生成唯一的标签,例如

MyMod.gensym
定义为

let gensym : string -> string =
  let c = ref 0 in
  fun s -> incr c; Printf.sprintf "!%s%d" s (!c)
但是,我希望能够在某些时候从使用这个gensym的函数中得到可复制的结果,例如

let reproducible = SomeMod.call x
第一次可以返回
[“!a1”;“!a2”]
,第二次可以返回
[“!a3”…]


在这种情况下,如何确保输出的可再现性(例如,强制ref从相同的值开始),但无需更改其模块中gensym的实现?

您可以添加一个可选参数来重置它:

让gensym:?重置:bool->string->string=
设c=ref0 in
乐趣?(重置=错误)s->
如果重置,则
c:=1
其他的
增量c;
Printf.sprintf“!%s%d”s(!c)

谢谢。对不起,我不清楚--我是从另一个模块调用它的,所以我不能更改实际的gensym函数--我只是希望强制重新加载或“强制重新加载”之类的东西?是整个模块的一部分吗?你能改变关于这个模块的其他内容吗?如果是这样的话,为什么不能更改这个特定的函数呢?我的具体情况是生成编译器符号,在连续运行和/或utop结果之间很难匹配输出。理论上我可以修改模块,但我更希望在repl中以交互方式运行一个干净的开始,例如函数
dump\u ir“file”
,以便utop中的gensym与本机编译器生成的gensym匹配