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,我擦!!)=================================