我的第一个解释器--scheme

scheme是这个暑假弄的,实现了一下它的基本框架

我的实现比较学术,毕竟是看了编译原理的前5章,之后弄的,所以思路简洁清晰!


Q:scheme是什么?

A:scheme是MIT人工智能实验室开发的一种lisp方言,一种用括号包围的语言


Q:为什么是scheme?

A:因为sicp(推荐)


Q:我的解释器用的是怎样的分段开发?

A:lexer(词法分析) -> parser(语法分析,建树) -> interpret(解释部分)


Q: lexer和parser是用工具还是手工?

A:手工,还是觉得要手写代码,才好掌握些,当然有手写代码满足的意图


Q:期间有什么困难?

A:困难还是在如何建树!! 

0.正常情况=>   (+ 1 2) 

=> +

    /    \

 1       2

1."非正常"情况  =>  (define (funcChooser n)

                                       (if (= n 0) +

                                                        -))

这里定义了一个funcChooser定义到底选择哪种方法,是的,方法可以被当做数据传递,那么我们使用选择器来使用运算方法时,即

( (funcChooser 0) 1 2)

这时候建树该如何建?一般建树方法是不能满足!

特别鸣谢我的好基友Marine,他拯救了我,给了我一个好的建树方法!

添加兄弟节点的办法!!!(下树中  "O"代表空节点)

O

 l

O  --> 1  --> 2

 |

 funcChooser --> n

这样既优美,又能递归地求值! 先求出操作符,再应用于操作数,返回上节点!


Q:如何存储数据?

A:环境!每个运算都基于环境,环境中拥有操作符的信息,拥有值等等,但是它们的本质都是名字-数据,所以用符号表实现环境!


Q:那么初始的环境中有什么信息?

A:初始环境中存在基础数据运算符,和逻辑符号


Q:scheme的数据名字有什么限制?

A:恩....它的名字的限制很小,不过不能是全数字,还有一些你都看不过去的方式。我的实现里初始环境中的+,-等符号,其实也和用户自己定义的级别一样,即你可以通过

(define + -)  将+重定义到-,因为运算的本质就是环境!+,-,*只是名字,你可以(define + 加)  只要你觉得爽!


Q:运算的本质是环境是什么意思?

A:这是因为重定义,你可以将上一分钟的你还熟悉的+绑定到-,那么上一分钟的用到+运算的过程,它的+又该如何?

我的实现里并不因为现在的操作影响到以前的意图,不过这毕竟是仁者见仁,智者见智的,不能说优劣

>> (define (add) (+ 1 2))

>> (add)

3    (当add是使用正常的+时)

>> (define + -)

>> (add)

3   (因为add绑定着+符号最初的意义,所以即使现在我修改+,当年的add依然不会受到影响)


=======================2012.11.11(亚马逊满300减150,我擦!!)=================================

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值