将闭包表示为有限项
Representing closures as finite terms
我正在为需要足够丰富以支持高阶函数的语言片段开发元解释器,并且 运行 遇到闭包问题。
具体来说,我需要所有值都可以表示为有限项;没有无限循环,没有指向彼此的对象。这适用于大多数类型的值、数字、有限列表、映射、表示程序代码的抽象语法树。问题是闭包;它们包含对其包含环境的引用,但如果闭包存储在局部变量中,则该包含环境也包含对闭包的引用。如果您使用的是可变指针,这很好,但如果您尝试使用有限项,这就是无限循环。
是否存在将闭包表示为有限项的已知技术,或者我缺少的绕过该问题的某些技术?
我曾经在编写使用引用计数 GC 的函数式语言时遇到过类似的问题,因此必须避免任何循环引用。
我的解决方案是环境实际上并不包含指向闭包的指针。相反,它存储了一个函数,当你向它传递一个指向环境的指针时,它会产生闭包。
从环境中查找值的过程包括在必要时调用该函数来生成闭包。该函数当然不需要指向环境的循环指针,因为环境将被传入。
这个技巧基本上是用与 Y 组合器用于制作递归函数相同的方式制作递归数据结构。
我正在为需要足够丰富以支持高阶函数的语言片段开发元解释器,并且 运行 遇到闭包问题。
具体来说,我需要所有值都可以表示为有限项;没有无限循环,没有指向彼此的对象。这适用于大多数类型的值、数字、有限列表、映射、表示程序代码的抽象语法树。问题是闭包;它们包含对其包含环境的引用,但如果闭包存储在局部变量中,则该包含环境也包含对闭包的引用。如果您使用的是可变指针,这很好,但如果您尝试使用有限项,这就是无限循环。
是否存在将闭包表示为有限项的已知技术,或者我缺少的绕过该问题的某些技术?
我曾经在编写使用引用计数 GC 的函数式语言时遇到过类似的问题,因此必须避免任何循环引用。
我的解决方案是环境实际上并不包含指向闭包的指针。相反,它存储了一个函数,当你向它传递一个指向环境的指针时,它会产生闭包。
从环境中查找值的过程包括在必要时调用该函数来生成闭包。该函数当然不需要指向环境的循环指针,因为环境将被传入。
这个技巧基本上是用与 Y 组合器用于制作递归函数相同的方式制作递归数据结构。