SICP不是我的菜

看了一段时间SICP,发现它不是我的菜。

如果你是一个编程的初学者,而且准备通过魔鬼训练夯实编程基础,它是一个较好的选择。

但是,对于有基础的程序员,如果想了解Scheme、想学习函数式编程语言方面的知识,SICP不是好的选择。


1)big map?没有一个大图,我会没有方向感。或许是东西方文化的差异,总之,我需要知道一个总体思路、或一个出发点相对的位置。从编程教学的角度出发,SICP是一种途径。但是,在这条途径中使用Scheme,不是好的选择。翻看其前言,我看到了《编程导论(Java)·1.2.2空白与注释》中引用的一句话:

程序必须是写给人读的,仅仅偶尔让机器执行——Abelson and Sussman

讽刺地是,Scheme程序的可读性比较差。前缀无所谓,层层小括号,看得我眼睛痛。

2)语言的介绍问题。学习Scheme,语言标准是必看或必查的。网上有王咏刚翻译的版本(2004),还不错(4.1.6的翻译有问题)。

Revised5 Report on the Algorithmic Language Scheme

3)条理化

yqj2065比较《编程导论(Java)》和SICP,对待语法问题都比较轻视,很多时候将(特别是使人纠结的)语法细节放在练习题中。ok

SICP偏爱数学和数据结构,这是可以理解的,但,是不是偏爱得多了点。

yqj2065准备按照《编程导论(Java)》的框架,学习Scheme和函数式编程语言方面的知识。

4)你说什么呢?

有时候,yqj2065真的不知道作者在说什么。或者说,某些章节,他这样写是为什么。例如

【1.1.4 复合过程(Compound Procedures)

define (square x) (* x x))

....这样就有了一个复合过程(Compound Procedures)。】这个"复合过程"和一般的函数/过程有不同吗?需要一个新术语总会意味着些不同,提心吊胆地看了半天,还是不知道哪里看漏了。

然后,

【1.1.5 过程应用的代换模型

对于复合过程,过程应用的计算过程是:将复合过程应用于实参,就是在讲过程体中的每个形参用对应的实参取代后,对该过程求值。】

好的。我们知道了过程应用的计算过程。然后他【举例(f 5)....

上面描述的这种计算过程称为过程应用的"代换模型",...这个模型不过是用于用于理解过程应用的“意义”的模型。】

这里的"代换模型"到底指“过程应用的计算过程”,还是举例的解释?或者说,“过程应用的计算过程”是对的吗?

然后【应用序和正则序

按照1.1.3节给出的求值描述...】

我真的不懂他为什么要这样写。1.1.3节给出的组合式的求值 和 过程应用的计算过程,有区别吗?+和square 有区别吗?

[应用序和正则序](我更喜欢叫适用序与标准序)其实是很简单的概念:

(define (square x) (* x x)) 

(square (+ 2 3))是使用5作为参数还是以(+ 2 3) 作为参数?丘奇的lambda计算是直接用形参(+ 2 3)替换的,所以叫标准形式;而先求值(+ 2 3)在用5替换,是经济适用的形式,所以叫适用序。

回头看,一般表达式(1.1.3节给出的)求值,就是一个适用序的例子;而“过程应用的计算过程”,也采用适用序,如同Java中的求值过程一样。

所谓的"代换模型",真的不过是采用了适用序的一种解释方式,后面由于副作用问题,作者提出的所谓“环境模型”,不过是一种如同Java的方法调用栈的东西。

顺便说一下,frame翻译成框架,在我粗粗翻阅时,不知道是什么神奇的东西——他画了那些神秘的图,用Java中的术语,stack frame——栈帧。不过Scheme使用的帧叫Java的简单。


类似的地方很多。


若干问题(增减中...)

现在遇到的第一个问题,就是Scheme的动态类型语言(dynamic typed language)特点。例如

  • Scheme的数据有自己的类型,但是所有变量(variable)拥有同样的类型:指向任何数据的指针。
  • Scheme如何在运行时进行类型检查(typechecking)
  • Scheme的函数,其返回值的类型可能是不确定的。在高阶函数中如何限定其类型。

命名空间问题。Scheme的方案太简陋了,和C有一比。

你可能感兴趣的:(Scheme)