将闭包表示为有限项

Representing closures as finite terms

提问人:rwallace 提问时间:7/2/2021 更新时间:7/3/2021 访问量:38

问:

我正在为一个语言片段开发一个元解释器,该片段需要足够丰富以支持高阶函数,并遇到了闭包问题。

具体来说,我需要所有值都可以表示为有限项;没有无限的重复,没有相互指向的物体。这适用于大多数类型的值、数字、有限列表、映射、表示程序代码的抽象语法树。问题是关闭;它们包含对其包含环境的引用,但如果闭包存储在局部变量中,则该包含环境也包含对闭包的引用。如果您使用可变指针,这很好,但如果您尝试使用有限项,则这是无限重复。

有没有一种已知的技术可以将闭包表示为有限项,或者我缺少一些绕过该问题的技术?

函数式编程 闭包 与语言无关的 解释器 自引用

评论

1赞 Will Ness 7/2/2021
间接,一如既往。使用标签,以便指针指向实体的标签,而不是实体本身。

答:

2赞 Matt Timmermans 7/3/2021 #1

当我编写使用引用计数 GC 的函数式语言时,我曾经遇到过类似的问题,因此必须避免任何循环引用。

我的解决方案是,环境实际上并不包含指向闭包的指针。相反,它存储了一个函数,当您向它传递指向环境的指针时,该函数将产生闭包。

从环境中查找值的过程将包括在必要时调用该函数以生成闭包。当然,该函数不需要指向环境的循环指针,因为环境将被传入。

这个技巧基本上是以与 Y 组合器用于制作递归函数相同的方式制作递归数据结构。