我正在尝试实现自动程序合成的简单功能语言。 数据结构是一个函数和值的图形,可以编译为javascript。 以下图形应该是折叠功能。 funcApp
节点连接到一个功能节点和一些有价值的节点,并将该功能应用于这些值。 arg0
是列表,arg1
是初始值(z)arg2
是要应用的函数。以简单的纯功能语言实现折叠而无需懒惰评估
这相当于folloiwng方案定义(虽然我的“语言”是不是计划,它是图)
(define (foldr f z xs)
(if (null? xs)
z
(f (car xs) (foldr f z (cdr xs)))))
的问题是有,因为没有特殊运营商,一切,特别是if
只是一个正常的功能。在这种形式下,程序永远不会终止,而是达到最大堆栈深度,因为总是计算else子句。
我认为这个问题是通过懒惰的评估在某些语言中解决的。所以我的问题是:有没有这种无限递归的fold的功能版本2)如果需要,从哪里开始考虑将懒惰评估应用于这种简单的语言。
'if'是Scheme中的一种特殊形式,所以else表达式总是被评估* not *。这里有什么问题? – 2012-04-15 22:13:59
我知道Scheme就是这种情况,我想我在最后一段 – zenna 2012-04-15 22:20:37
中明确表达了我的问题,我不明白第一个问题。对2)的答案将是“特别处理”。 – 2012-04-15 22:24:36