任何強大的語言,都必須有三種機制:
基本表達式:語言最基本、最簡單的元!
組合的手段:如何把基本元素組合起來
抽象的手段:讓組合元素命名且可操作
Programing中,我們處理兩個元素:function 及 data,data是我們可以操作的東西,function是讓我們描述如何操作data的規則
對 operand (運算元) 的組合進行求值
執行一個function,function中表示operator 操作 argument, argument 就是 operand 的值
由1.可以看出,為了實現一個Combinations的求值過程,還必須先對Combinations裡的每個元素進行相同的求值,這本身就是一個 “遞迴”的行為
例如:(2 + 4 * 6) * (3 + 12);
我們可以採用樹的形式,每一個Combinations用一個有分支的節點表示,而operator與argument就是葉子的部分,求值過程可以想像,這些運算的值從葉子開始一直往上計算求值,然後在越來越高的層次中組合起來,可以看出 “遞迴”對於處理這種層次結構的 “樹”是非常有用的,稱為 “tree accumulation”。
數字與運算是基本的數據與function(函數)
Nesting of combinations提供了組合運算的手段
Constant declarations 把名字跟值關聯起來,且提供一個有限制的抽象手段
Javascript的function declaration:
對一個combination求值:
對這個運算組合式求值,就像上述function所提,對組合式的各個元素求值,而後對arguments( the values of argument-expressions)執行一個function(value of the name)
EX:
sum_of_squares(a + 1, a * 2); -> sum_of_squares(5 + 1, 5 * 2);
square(6) + square(10); -> (6 * 6) + (10 * 10);
36 + 100; -> 136;
下面有一個超級酷的觀察求值的function,請收看的人一定要試試,可以先猜猜function會輸出什麼值(或是出現什麼動作)
EX 1.5
What behavior will Ben observe with an interpreter that uses applicative-order evaluation? What behavior will he observe with an interpreter that uses normal-order evaluation? Explain your answer.