起因

今天本来想加班的,可是远程主机没连上,公司电脑意外断电了? 于是又去看了点scheme。

类型

scheme是一种动态强类型语言。编程语言对类型的处理可以分为三类:

  1. 弱类型
  2. 强类型
  3. 静态类型

比如,对于表达式

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话语。其它的还包括下面几个原语:

  1. atom?
  2. eq?
  3. cons
  4. cond

整体来说,lisp和c都是很hackish的语言,规则简单,但是给编程人员很强的hack能力。当然,程序员都是人,更多的底层hack手段往往带来更多难以调试的错误。

那些增加更多限制的语言确实可以减少错误发生的概率,但是往往也限制了表达能力,很多时候还要牺牲执行效率。

没有万金油,总要有个取舍。