什麼是程序#
程序是一個黑盒,輸入東西然後輸出你想要的。
在大系統中控制複雜度的技術是計算機技術的關鍵,計算機科學的複雜度不是 “現實的”,不受物理等因素影響,計算機科學處理的是理想化的組件,在理想和現實中沒有太大的不同,可以隨心所欲的組合,構建,計算機工程就像隨心所欲的不被約束的搭積木。抽象是計算機科學的重要思維。程序的黑盒可以使由無數個黑盒組成的(隱藏細節,黑盒抽象思維)。
什麼是編程語言#
編程語言是實現黑盒的咒語,是指令。
通過基本指令構建複雜指令,基本數據構建複雜數據,用黑盒進行封裝。這就是編程的過程。
控制複雜度#
控制複雜度的方式就是在程序裡留下約定的接口,並想辦法組合起來。面向對象思想和聚集思想(“流”)是主要的兩種辦法。
什麼是 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))