我正在尝试为自动程序合成实现一种简单的功能语言。数据结构是函数和值的图,可编译为 javascript。下图应该是一个折叠函数。 funcApp
节点连接到一个函数节点和许多值节点,并将函数应用于值。 arg0
是列表,arg1
是初始值 (z)arg2
是要应用的函数。
它相当于以下方案定义(虽然我的“语言”不是方案,但它是图)
(define (foldr f z xs)
(if (null? xs)
z
(f (car xs) (foldr f z (cdr xs)))))
问题是,由于没有特殊的运算符,所以一切,特别if
是只是一个正常的功能。在这种形式下,程序永远不会终止,而是达到最大堆栈深度,因为 else 子句总是被计算。
我认为这个问题在某些语言中是通过惰性求值解决的。所以我的问题是:是否有没有这种无限递归的功能版本的 fold 2)如果有必要,从哪里开始考虑将惰性求值应用于这样的简单语言。