2012-04-15 25 views
1

我正在尝试实现自动程序合成的简单功能语言。 数据结构是一个函数和值的图形,可以编译为javascript。 以下图形应该是折叠功能。 funcApp节点连接到一个功能节点和一些有价值的节点,并将该功能应用于这些值。 arg0是列表,arg1是初始值(z)arg2是要应用的函数。以简单的纯功能语言实现折叠而无需懒惰评估

enter image description here

这相当于folloiwng方案定义(虽然我的“语言”是不是计划,它是图)

(define (foldr f z xs) 
    (if (null? xs) 
     z 
     (f (car xs) (foldr f z (cdr xs))))) 

的问题是有,因为没有特殊运营商,一切,特别是if只是一个正常的功能。在这种形式下,程序永远不会终止,而是达到最大堆栈深度,因为总是计算else子句。

我认为这个问题是通过懒惰的评估在某些语言中解决的。所以我的问题是:有没有这种无限递归的fold的功能版本2)如果需要,从哪里开始考虑将懒惰评估应用于这种简单的语言。

+1

'if'是Scheme中的一种特殊形式,所以else表达式总是被评估* not *。这里有什么问题? – 2012-04-15 22:13:59

+0

我知道Scheme就是这种情况,我想我在最后一段 – zenna 2012-04-15 22:20:37

+1

中明确表达了我的问题,我不明白第一个问题。对2)的答案将是“特别处理”。 – 2012-04-15 22:24:36

回答

1

您可以将if-expression的两个分支都编译为thunk,并根据条件调用相应的thunk。如果方案的正式定义是这样写的,我不会感到惊讶。

2

我认为在粘合剂下评估(特别是评估lambda体)是非常罕见的,所以我认为标准化解决严格语言的方法是引入lambda。我不知道方案的语法,但是在Haskell语法中,如果你想x是一个严格函数f的懒惰参数,你可以写一些类似f (\() -> x)(并修改f适当地期望这样的lambda表达式,并在那一刻你想要懒惰他们)。

+0

Scheme语法与Haskell语法非常相似,'(λ()x)'是一个thunk,并且在parens中围绕一个thunk“调用”它,例如, '(someThunk)' – 2012-04-16 19:59:53