用python写的scheme解释器(little schemer读书笔记)

1.内容概览


前四章:介绍了基本的数据结构,atom,list,s-expression;基本的函数原语,primitive。
第五章<Oh My Gawd*:It's Full of Starts>:讲的是如何在nested list中对所有的atom进行操作。即所谓的高阶函数。
第六章:四则运算及其他一些基本运算。四则运算的本质都可以用递归加上add1,sub1来实现。
第七章:集合及其相关操作。

---------------------------------------------------------------------------
以上部分的内容都是比较简单和繁琐。接下来的才是精华。
第八章:collector funciton(即continuation)。Continuation Passing Style。

continuation是一种函数调用机制。我们熟悉的函数调用方法一般是采用栈帧(Stack Frame)来记录从顶层函数到当前函数的所以context。
而continuation不采用堆栈来保存上下文。网上关于continuation中介绍不少,说它不同于栈的先进后出的线性管理contexts的方式,而是采用图和树来管理context。这样的好处就是可以从图中任意一个context节点跳到另一个context节点?这个我没有深入研究了。
little schemer这本书中只提到continuation在递归中的作用。在原函数递归层次间传递一个collector函数,而根据本次原函数的执行结果,通过复杂化collector函数的参数从而实现保存了本次函数执行的context。


第九章:partial function(,which may recurse enternally)。所以我们找一个funcion(will-end),来判断任意function是否为partial function。但will-end是违背哥德尔不完全定理的。这个就是计算逻辑中著名的停机测试悖论(类似的有停机问题,理发师悖论)。

接下来,书中讲到了Y-combinator及其证明。Y-combinator用于构建递归。

第十章:
Schemer的解释器(Interpretor)。可以解释(func(必须是用lambda直接表示的func,而不能只是一个funcname),realarg1,realarg2....)之类的表达式。Intrepretor会最终将源码翻译成(primitive_func realarg1,realarg2,...)。而primitive_func是内置的,从而得到结果。从而最终得到程序结果。

 

2.递归的实现


由于lambda函数都是没名字的,无法自己内部调用自己。我们需要Y-combinator来实现递归,让我们以power(n)函数为例:


1)lambda n. If_Else n==0 1 n*<self>(n-1)
2)let F = lambda n. IF_Else n==0 1 n*F(n-1)看上去不错,是吗?可惜还是不行。因为let F只是起到一个语法糖的作用,在它所代表的lambda表达式还没有完全定义出来之前你是不可以使用F这个名字的.
3)把<self>参数化,构造伪递归函数:let P=lambda self n. If_Else n==0 1 n*self(n-1)
P(P,n)=n*P(n-1)。而P(n-1)错误。有两种4),5)补救方法。

4)<self>应该有两个参数:
let P = lambda self n. If_Else n==0 1 n*self(self, n-1)

5)想法去掉self(self,n)中的self
还是让let P = lambda self n. If_Else n==0 1 n*self( n-1)
干脆我们假设出一个“真正”的递归阶乘函数:power(n)。而只要我们把这个真正的阶乘函数传给P就可算出真的阶乘
P(power,n)=power(n)
=>P(power,)=power(,) power是P的不动点。而不动点是唯一的??


6)如何通过P找到power?
let power_gen = lambda self. P(self(self))
P(power_gen(power_gen))=power_gen(power_gen) !


7)Y combinator
let Y = lambda F.
let f_gen = lambda self. F(self(self))
return f_gen(f_gen)

所以只要提供类似P的伪递归函数F,我们就能通过Y combinator得到我们所需的真正的递归函数。


 

3.scheme解释器源码

 

原文中的sch

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值