此篇為 SICP教程 7a 的筆記
目前為止,我們一直把程式當成是對機器的描述,如下圖,一個降冪的相乘數列(n!)
(* n (fact (- n 1)))
,先計算(fact (- n 1))
另一個重要的觀念就是,一台稱為 "Eval" 的機器,它接收上述降冪數列機器的線路圖,就能夠模擬出降冪數列機器的功能。
接下來就要實現一個 Eval 機器!
對應程式碼與預期的輸入輸出
程式碼部分:
defn eval
[exp env]
(cond
(number? exp) exp
(symbol? exp) (lookup exp env)
(equal? (car exp) 'quote) => (cadr exp)
(equal? (car exp) 'lambda) => (list clojure (cdr exp) env)
(equal? (car exp) 'cond) => (evcond (cdr exp) env)
;; 以上為specail forms
:else (apply (eval (car exp) env) (evlist (cdr exp) env)) ;先從env中得到procedure + 也從環境中得到 x,最後apply
;; 若要有效率的判斷,必須將程式碼寫成數據導向 data direct 的,這樣就不會是一系列的cond,會針對bit來做分配。(這部分自己不太清楚)
)
3 => 3
x => 3; car => #[procedure]
`foo => (quote foo)
(fn (+ x y)) => (Closure (+ x y) env)
(cond (pred1 exec1) (pred2 exec2) ....) => 當pred為true,執行exec
;; 以上為specail forms
(+ x 3)
apply, lookup, evcond, evlist
,下章繼續定義