Structure and Interpolation of Computer Program
| 從 1970 年代開始作為 MIT 電機與電腦科學的基礎程式設計課程用書, 直到 2008 年被 python 取代為止。 |
功能 | scheme | javascript |
---|---|---|
閉包 | 有 | 有 |
函數作為第一類公民 (與變數同命名空間) | 有 | 有 |
範式 | 函數式 | 指令式 |
物件導向 | 函數與巨集實現 | 語言內實現 |
1 + 2 * 3
// (1 + 2) * 3 ?
// 1 + (2 * 3) ?
add(1, multiply(2,3) )
// 1 + (2 * 3)
(+ 1 (* 2 3)) ; 1 + (2 * 3)
(if (> a b)
(print a)
(print b))
在 scheme 中雖然有迴圈,但不常用,
多直接用遞迴表示。
(define (series i sum)
(if (= 0 i)
sum
(series (- i 1)
(+ sum i))))
迴圈的問題是他沒有 返回值 ,
迴圈多是執行完後會改變上下文狀態。
let sum = 0
for (let i=0; i<n; i++) {
sum = sum + i
}
(do ((i 0 (+ i 1))
(sum 0 (+ sum i)))
((= i 10) sum)
(display i) (display "\t")
(display sum) (newline))
;; 等價遞迴寫法
(define (do-loop i sum)
(if (= i 0)
sum
(begin
(display i) (display "\t")
(display sum) (newline)
(do-loop (+ i 1)
(+ sum i)))))
(do-loop 0 0)
x | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
---|---|---|---|---|---|---|---|---|
1 | o | |||||||
2 | o | |||||||
3 | o | |||||||
4 | o | |||||||
5 | o | |||||||
6 | o | |||||||
7 | o | |||||||
8 | o |
(deriv '(+ x 3))
;; (+ 1 0)
(deriv '(* 6 x))
;; (+ (* 0 x)
;; (* 6 1))
每個 statement 都在改變程式的狀態。
*3
x = read_file()
x = x * 3
write_file(x)
在 scheme 中,函數可以有多個 statement,
但基本上你用不到第二個 statement
function fp(a, b) {
return multiply(add(a, b), a)
}
還有 scheme 或 sicp 問題,
歡迎來 emacs.tw 攤位找我ㄛ