翻譯自 SICP (Structure and Interpretation of Computer Programs) 原文出處: http://mitpress.mit.edu/sicp/ 原書作者: Harold Abelson and Gerald Jay Sussman, with Julie Sussman

1.1.1 表達式 (Expression)

一個進入程式設計的簡單方法是:與 Scheme(*譯注1) 的直譯器(interpreter, *譯注2)進行一些典型的互動。想像你正坐在一個電腦終端機前。你輸入了一個表達式,而直譯器將其求值後的結果顯示出來回應你。

你可能會輸入的其中一種基本表達式是數字。(更精確地說,你輸入的表達式是由十進位的數值所構成的。)如果你給 Lisp 一個數字:

1
486

直譯器將印出回應

1
486

代表數字的表達式,或許會被一個代表基本程序的表達式(如: + 或 *)結合,成為一個複合的表達式,代表將這個程序使用於這些數字上。例如:

1
2
3
4
5
6
7
8
9
10
(+ 137 349)
486
(- 1000 334)
666
(* 5 99)
495
(/ 10 5)
2
(+ 2.7 10)
12.7

像這種以一對小括弧框起來,代表套用程序的 list (*譯註3),稱作 組合式(combination, 暫譯)。最左方的元素稱為 運算子(operator) ,其餘的元素則為 運算元(operand) 。一個組合式的值是將與運算子相符的程序,套用(apply)在參數列(arguments)上而得,而參數即為運算元的值。(*譯註4)

這種將運算子放在運算元左邊的形式被稱為 前置表示法(prefix notation) 。因為和慣用的數學形式不相像,或許會讓你乍看之下感覺有些困惑。雖然如此,前置表示法也有幾個優點。其中之一,是它可以讓程序接受不定量的參數,如下例:

1
2
3
4
5
(+ 21 35 12 7)
75

(* 25 4 12)
1200

如上的寫法並不會造成模稜兩可而無法判斷的情形,因為運算子永遠是最左方的元素,而整個組合式則被一對小括弧所框住。

另一個前置表示法的好處是,它可用簡明的方法延伸為 巢狀結構(nested),亦即,一個組合式裡面可以有本身也是組合式的元素:

1
2
(+ (* 3 5) (- 10 6))
19

理論上,這種巢狀結構的深度是沒有限制的,而且無論表達式寫得多複雜,Lisp 的直譯器都依然可以將它計算出來。不過下面這種類似的簡單表達式,則可能會令我們人類困惑:

1
(+ (* 3 (+ (* 2 4) (+ 3 5))) (+ (- 10 7) 6))

直譯器計算過後得到的結果是57。為了方便我們自己閱讀,可以將之改寫為如下形式:

1
2
3
4
5
(+ (* 3
      (+ (* 2 4)
         (+ 3 5)))
   (+ (- 10 7)
      6))

這種將較長的組合式之運算元垂直對齊的格式慣例,稱作 pretty-printing (*譯註5)。遵循這個格式,可以清楚的表現出表達式的結構。

即便是對於複雜的表達式,直譯器仍總是以一個簡單的循環運作:由終端機讀入表達式,對表達式求值,然後將結果印出來。這種模式常被說成:直譯器在執行一個 讀入-求值-印出 迴圈 (read-eval-print loop, REPL)。另外請留意,在某些特別的直譯器,並不一定會將表達式的值印出來。

譯注

  1. Scheme : Lisp 的一個分支(或說是方言)。本來原文是把這件事寫在行內,但我不知該如何用中文辦到,大概會像這樣:「與 Lisp 的方言 Scheme 的直譯器進行..」,實在有點冗長。Lisp 是一個大家族,有非常多不同的方言,除了 Scheme 之外,另一個較有名的是 Common Lisp。

  2. interpreter : 常譯為直譯器。與靜態語言使用者熟悉的編譯器(compiler)略有不同,詳情請自行維基。Scheme 較有名的直譯器實作有:RacketChicken SchemeMIT/GNU SchemeBiwaScheme 等等。 其中 BiwaScheme 由 JavaScript 實作,您可以在 repl.it 的網頁上直接使用,非常適合初學者用以入門。

  3. List : 常被翻譯為「表」、「串列」或「列表」,既是 Lisp 中函式的表示方法,也是其最常用的資料結構之一。因為個人認為常用的中文譯詞說起來有點難以望文生義,又是常用名詞,如果都譯作「表」我自己會看得很辛苦。所以在找到更好的翻譯前,這個詞我會保留原文。

  4. 因為原文就有點難讀了,翻譯後更是莫名所以,只好額外舉例說明 : 以 (+ 2.7 10) 這個式子為例,’+‘ 就是運算子,’2.7’ 和 ‘10’ 則是參數(運算元)。’+‘代表加法的程序,將加法套用在 2.7 和 10 這兩個參數上,運算的結果 12.7 就是 (+ 2.7 10)這個組合式的值。

  5. 我有研究了一下 pretty-printing 應該怎麼翻譯比較好,查到有人翻 “漂亮列印” 我感覺有點憋扭。目前先保留原文,若有讀者願意提供更好的翻譯請拜託告訴我。


本翻譯必有不盡之處,懇請不吝賜教。我會不斷更新改進,謝謝!

創用 CC 授權條款
本著作由TeenSuu Lin製作,以創用CC 姓名標示-非商業性 3.0 Unported 授權條款釋出。
此作品衍生自http://mitpress.mit.edu/sicp/

見人言某語言優雅有感

有些語言可能可以說是好用.靈巧.在programmer能力值高的情況下能產出好的程式但卻很難被歸類為 “優雅”##比如說這麼一個語言混淆應屬於物件的 method 或獨立的 function甚至狂熱試圖把一切都當成物件然後鼓勵一堆人寫出 `3.times do` 這種念起來很順 …… Continue reading

[Note]Setup SSH on Fedora in VirtualBox

Published on January 30, 2015