摘要:
首先先提一下上一篇《如何猜出Y combinator》中用的方法太复杂了。其实在Lambda演算中实现递归的思想很简单,就是函数把自己作为第一个参数传入函数,然后后面就是简单的Lambda变换提取出Y combinator了。好,接下来是本篇的正文:------------------------------------------------------------------------------------昨天fengidri给我演示了yield的用法,让我大受启发——可以用yield来实现SICP里描述的流计算模式。所谓的流,也就是stream,实质上是一个惰性求值的列表。Pytho 阅读全文
摘要:
先约定几个记号: 定义用一个冒号加等号表示“:=”, 表达式全等用两个等号表示“==”, 归约意义上的相等用一个等号表示“=”,“==”蕴涵“=”。 由于lambda演算不能定义符号,所以像这样的递归定义是不能被求值的: f := (lambda () (f))如何在lambda验算中实现递归?从最简单的递归函数开始。希望能带来一些启发。寻找 \(\Omega... 阅读全文
摘要:
默认作用域前段时间学了下Lua,发现Lua的默认作用域和Python是相反的。Lua定义变量时默认变量的作用域是全局(global,这样说不是很准确,Lua在执行x = 1这样的语句时会从当前环境开始一层层往上查找x,只有在找不到x的情况下才定义全局变量)的,而Python定义变量时默认变量的作用域是局部(local)的(当前块)。另外,Lua可以再定义变量时在变量前加上local关键字来定义局部变量,而Python没有类似的关键字,Python的变量只能定义在当前块中。我们知道,全局变量是不好的,而局部变量是好的,写程序应该尽量使用局部变量。所以一开始时我觉得Python的这种约定比较好,它 阅读全文
摘要:
很久以前写过一篇《递归与迭代》,写得不是很好。可能是我自己也没把思路理清楚,现在就有了个重新整理思路炒冷饭的机会,也算是一个新的开始吧。 首先解释一个术语叫“尾调用”。直接从wiki的“尾调用”条目抄:尾调用是指一个函数里的最后一个动作是一个函数调用的情形:即这个调用的返回值直接被当前函数返回的情形。这种情形下称该调用位置为尾位置。若这个函数在尾位置调用本身(或是一个尾调用本身的其他函数等等),... 阅读全文