我有一个家庭作业,完成在OCaml中编写一个停止复制的垃圾收集器。需要编写3个函数。首先要知道的是一个名为ram的64插槽阵列将是垃圾收集器用作内存的。每个插槽都包含一个“cell”类型的对象。该类型可能如下所示:
我相信我对第一个功能没问题,但我需要帮助的第二个功能。 功能是:
let rec scan_tospace (free : int) (unscanned : int) =
以下是该功能的目标:
(*扫描到空格,将所有引用的对象复制到To-space和 更新对象中的引用。递归直到空闲指针为止 与未扫描的指针相同。
[free]是指向To-space中下一个空闲地址的指针, [unscanned]是第一个未扫描对象的地址 到空间。
在所有对象完成后返回空闲指针的地址 扫描。 *)
我想要做的是在未扫描指针的元素上进行模式匹配。如果它是一个对象(x,y,z),那么我希望结果遍历整数列表z中的每个元素,并将函数'let copy_obj(free:int)(addr:int)='应用于它参数addr。问题是函数copy_obj需要2个参数,我无法弄清楚如何在调用List.iter时插入第二个参数,如下所示:
List.iter obj_copy free z
当它与对象成功匹配时,我也尝试了这个结果:
List.iter (fun k -> match k with
| int k -> copy_obj free k) z;
我得到了这个:
Error: This expression has type int * int
but an expression was expected of type unit
我没有故意发布任何代码,但如果你喜欢看它,我可以发布更多。我不想给任何答案。另外,我不是在寻找有人为我写任何代码,另一个原因是我没有发布很多代码。正确方向的任何想法都会非常有用,谢谢!
答案 0 :(得分:0)
List.iter obj_copy free z
应为List.iter (obj_copy free) z
,因此free是obj_copy的第一个参数,列表中的项目是第二个。通过此更改,您应该得到与后续代码相同的错误。
这里的问题是使用List.iter。当您浏览引用的对象并复制它们时,free
必须更改。否则,您将每个对象复制到前一个对象上。您还需要记住复制对象的位置,以便更新外部对象中的引用。因此copy_obj返回(我假设)一个对象的元组和新的free。
您必须使用List.fold_left
或List.fold_right
或手动递归来浏览列表,同时跟踪空闲和复制的对象。