什么是程序#
程序是一个黑盒,输入东西然后输出你想要的。
在大系统中控制复杂度的技术是计算机技术的关键,计算机科学的复杂度不是 “现实的”,不受物理等因素影响,计算机科学处理的是理想化的组件, 在理想和现实中没有太大的不同,可以随心所欲的组合,构建,计算机工程就像随心所欲的不被约束的搭积木。抽象是计算机科学的重要思维。程序的黑盒可以使由无数个黑盒组成的(隐藏细节,黑盒抽象思维)。
什么是编程语言#
编程语言是实现黑盒的咒语,是指令。
通过基本指令构建复杂指令,基本数据构建复杂数据,用黑盒进行封装。这就是编程的过程。
控制复杂度#
控制复杂度的方式就是在程序里留下约定的接口,并想办法组合起来。面向对象思想和聚集思想(“流”)是主要的两种办法。
什么是 lisp#
了解一门语言主要在三点:
构成语言的基本元素?
如何组合这些元素?
抽象的方法是什么?
组合的方法#
3 + y 12.1
类似这种 “符号” 都是 lisp 里的抽象数据。
(+ 3 12 1.1)
这就是组合式 由运算符和运算对象组成(前缀表达法)。
实际上组合式也是 “树”
+
/ | \
3 12 1.1
更多的树枝也同理
+
/ | \
3 12 1.1
|
+
| \
1 0.1
我们可以理解成:程序就是在构建这些树。
抽象的方法#
(define (add a b) (+ a b))
定义一个名为 add 的函数,函数有两个值,返回这两个值的和。
当然也可以用 lambda 构建一个过程。
(define square
(lambda (x) (* x x)))
这一切都是构建的过程。
(define (average x y)
(/ (+ x y) 2))
(define (mean-square (x y)
(average (square x)
(square y))))
一个简单的均方求值器
分情况的构建
(define (abs x)
(cond ((< x 0) (- x)
(= x 0) (0)
(> x 0) (x))))
;; OR
(define (abs x)
(if (< x 0)
(- x)
X))