实现scheme解释器的疑问

(1). define 和 set! 在本质上的区别我知道, 就是set!是改变原来变量上的值, define是新创建一个值. 但是对用户来说, 在一般函数式语言里面好像也没什么区别, 

       实现define的时候实现成set!了, 但是用起来一模一样! 我的解释器的实现没办法按r5rs标准的那样实现define了...或许之后引入了非纯函数式的那部分语法就要用到到set!和define的区别...


(2). `()` 到底算什么元素 ?  (list) 和 '()都会出来`()`...

       算空list ? 算Symbol ? 算一个特殊的标志 ? 我知道绝对不算NULL !

       虽说在绝大部分情况下都可以用NULL代替 (), 但它们俩毕竟不是一回事儿啊!

       蜀黍说算空list, 那既然说list的本质是pair, 那怎么用pair来构造出 () ?

       貌似在r5rs上定义了()为空list, 就先像蜀黍那样用一个变量empty代替吧...


(3). 实现里面其实list和pair是分开的=_=, 虽说用起来是没问题的...这是为了方便, 内部实现的list和pair是分开了...


(4). 写错误恢复的时候有这么样个问题.


(define a 1)
(+ (define a 2) b)
a



       上面的代码在不同解释器上会有不同的结果. 在guile上结果是1, 在bigloo上结果是2. 原因很简单, guile是先一整個表达式先check一遍(跟parse不同啦, 懒的解释), 都合法了才eval, bigloo是边check边eval, 所以check到(+ (define a 2) b) 的b时发现b未定义之前(define a 2)已经eval过了..
       不知道是不是scheme标准没定义清楚, 不过bigloo的这种策略比较好写, 就用这中策略了.

(5). GC原理不难, 但是实现起来好麻烦, 放弃了...tail recursion也放弃了...宏...待定...



CSDN的代码片功能是作秀吗? 粘到gist上再嵌入script代码在这里显示空白.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值