关于 hash-consing 与 marshalling-unmarshalling 数据相结合的陷阱,似乎有相当多的民间传说知识浮现在限制圈内。我正在寻找这些花絮的可引用参考。
例如,曾经有人向我指出了库aterm,并提到作者已经清楚地想到了这一点,并且磁盘上的表示是自下而上的(节点的子节点在数据中位于节点本身之前)流)。当您需要重新共享每个节点(内存中已有可能相同的节点)时,这确实是正确的做法。这种重新分享通行证需要自下而上完成,因此解组本身也可能也是如此,因此可以一次完成所有事情。
我正在描述在我们自己的背景下遇到的困难,以及我们找到的解决方案。我很感激任何有关上述民俗知识的引用。有些人之前显然遇到过这些问题(aterm库只是一个例子)。但我没有发现任何书面形式。即使是关于aterm的一小部分信息都是听说的。我并不担心它不可靠(你无法做到这一点),但“个人通信”和“看看它在源代码中是如何完成的”在引用中被认为是不好的形式。
我有足够的参考资料单独使用哈希值。我只对那些干扰编程其他方面的参考文献感兴趣,例如编组或分发。
答案 0 :(得分:3)
好吧,这并没有多大用处,但安德鲁肯尼迪写了一个名为 Pickling Combinators 的功能珍珠,出现在Journal of Functional Programming,(2004),14:6:727- 739。关于结构共享及其如何在pickle中处理的讨论很广泛,但没有直接讨论这个问题如何与语言的实现中的hash-consing相关。但是文章确实讨论了内存和泡菜中的结构共享,所以我希望它总比没有好。
Martin Elsman于2005年在功能编程趋势中获得了一篇后续论文;标题是带共享的类型专用序列化。这篇文章主要涉及unpickler(解串器)的hash-consing,而不是在inslementation中的hash-consing,但同样它可能是值得的。
JFP论文是专有的,但似乎有preprint on Andrew's web page。 Elsman的论文似乎可以通过Google学术搜索在http://tinyurl.com/yd5tw2b处获得。
(在以前的生活中,我参与了一个项目来创建人们可以阅读和编辑的ASCII泡菜。我愚蠢地没有发布它,但我保留了兴趣。)
答案 1 :(得分:2)
我在函数式语言中找到了一个关于编组的参考资料;不确定它是否有用,但作者很聪明:http://tinyurl.com/yc3hob9
我相信马蒂亚斯布鲁姆和/或安德鲁阿佩尔在这方面做了些什么,但我找不到报纸。我也相信我曾经为功能编程杂志审阅了一些内容,但我不记得该论文是被接受还是是谁写的。
我建议你问Matthias Blume,Andrew Appel和Phil Wadler是否可以提供帮助。
答案 2 :(得分:0)
Coq V5.10进行了哈希处理和编组/解组。我没有找到任何已发布的表单,但解组步骤将在源代码中被引用为“reinterning”。 Coq unmarhsaled值然后遍历它们以重新创建共享,当所有语言提供的是unmarshal
类型为int_channel -> 'a
的函数时,这是一个明显且唯一的解决方案。