起因
今天本来想加班的,可是远程主机没连上,公司电脑意外断电了? 于是又去看了点scheme。
类型
scheme是一种动态强类型语言。编程语言对类型的处理可以分为三类:
- 弱类型
- 强类型
- 静态类型
比如,对于表达式
x = 3 + “abc”
弱类型正确执行,动态强类型执行错误,静态类型编译错误。
lisp声称是动态强类型的,这其实可以避免一些类型错误,但是有些分支可能还是在运行期间出现类型错误。
而haskell是静态类型(注意类型推导不影响haskell是静态类型),则在编译期间做了类型检查,程序只要编译过了,就可以避免运行时出现类型错误。
同样静态类型的语言还有rust,rust的编译器做了很多工作,致力于t避免c/cpp的tricky的指针错误。
c语言虽然是静态类型的语言,可以通过指针绕过类型检查系统,go也有指针,但是类型检查要严格一些。
quote
scheme 程序实际上是一堆list,程序执行就是eval一个list。而quote的作用,就仅仅是告诉解释器,不执行eval操作。
list实际上是一个函数,而quote不是一个可以通过scheme实现的函数,只能由编译器本身实现。
scheme的语法的确简单,只需要几个简单的原语和规则就可以实现解释器,其中就需要这个quote话语。其它的还包括下面几个原语:
- atom?
- eq?
- cons
- cond
整体来说,lisp和c都是很hackish的语言,规则简单,但是给编程人员很强的hack能力。当然,程序员都是人,更多的底层hack手段往往带来更多难以调试的错误。
那些增加更多限制的语言确实可以减少错误发生的概率,但是往往也限制了表达能力,很多时候还要牺牲执行效率。
没有万金油,总要有个取舍。