Guy Steele:common Lisp——the Language@1989 (第2版)
Common Lisp 程式語言主要論點及詳盡解釋
本文件旨在闡述 Common Lisp 程式語言的核心構成與重要特性,特別是基於 1984 年版本及其由 ANSI X3J13 委員會標準化工作所帶來的更新內容。
1. 語言宗旨與目標
Common Lisp 的設計旨在滿足多個目標,以克服早期 Lisp 方言的限制並提升其在實際應用中的可用性:
* Commonality (通用性): 作為各種 Lisp 實作的共同基礎,便於程式碼移植。
* Portability (可攜帶性): 避免難以跨平台實現的特性,讓程式碼盡可能獨立於機器特性。
* Consistency (一致性): 保證直譯器和編譯器對程式碼賦予相同的語義,避免因作用域規則差異導致的潛在錯誤。
* Expressiveness (表達力): 整合 MacLisp, Interlisp 等方言及其他程式語言中有用的構建,提供豐富且易於理解的表達方式。
* Compatibility (相容性): 盡可能與 Lisp Machine Lisp, MacLisp, Interlisp 保持相容性。
* Efficiency (效率): 提供有助於編譯器生成高品質程式碼的特性,尤其強調數值計算效能。
* Power (強大性): 提供系統構建工具的核心功能,為之上層使用者層次的套件提供基礎。
* Stability (穩定性): 語言定義僅緩慢且經過深思熟慮後進行修改,確保其作為開發平台的穩定性。
2. 核心資料類型
Common Lisp 提供了豐富多樣的資料類型,並且強調資料本身而非變數是具有類型的特性。這些類型構成一個繼承層次:
* Numbers (數字): 支援多種形式,包括任意精度的整數 (integers,分為 fixnum 和 bignum)、有理數 (ratios,即整數相除之比值,與 integers 統稱 rational),以及不同精度等級的浮點數 (floating-point numbers,包括 short-float, single-float, double-float, long-float,與 rational 統稱 real),及複數 (complex numbers)。所有數字統稱 number。
* Characters (字元): 表示字形或格式操作,包括標準字元 (standard-char)。定義了字元的碼 (code)、位元 (bits,後由實作定義屬性取代) 和字體 (font,後由實作定義屬性取代) 等屬性。字串 (strings) 是一維的字元陣列。
* Symbols (符號): 具有名稱 (print name)、屬性列表 (property list, plist) 和套件單元 (package cell) 的命名資料物件。用於命名變數、函數等,也作為程式碼中的常量 (如 nil, t)。
* Lists (列表) 和 Conses (Cons單元): 列表是由 Cons 單元構成的鍊條,Cons 單元有 car 和 cdr 兩個組成部分。列表以 nil 終止;非 nil 原子終止的列表稱為點狀列表 (dotted list)。列表與 nil 統稱為 list 類型。Cons 單元為 cons 類型,nil 為 null 類型。
* Arrays (陣列): 具有維度的物件集合,索引為非負整數。可為通用陣列 (儲存任何物件) 或特化陣列 (儲存特定類型物件)。一維陣列稱為向量 (vectors)。字串是一維字元陣列。位元向量 (bit-vectors) 是一維位元 (0或1) 陣列。
* Hash Tables (雜湊表): 提供高效的鍵值對應。
* Readtables (讀取表): 控制 Lisp 閱讀器解析字元的方式。
* Packages (套件): 符號的集合,作為名稱空間,用於避免命名衝突。
* Pathnames (路徑名稱): 表示檔案系統中的檔案名稱,用於檔案操作。
* Streams (串流): 資料來源或目的地,用於輸入/輸出。
* Random-States (隨機狀態): 封裝亂數生成器的狀態。
* Structures (結構): 使用者定義的記錄結構,具有命名組成部分。
* Functions (函數): 可被呼叫執行的物件,包括編譯函數、Lambda 表達式和符號。
3. 程式結構與控制流
Common Lisp 程式由形式 (forms) 組成,形式被求值以產生值和副作用。形式主要包括自求值形式 (數字、字元等)、變數 (由符號表示) 和列表 (特殊形式、宏呼叫、函數呼叫)。
* 變數: 分為詞法 (lexical) 和特殊 (special) 變數,具有不同的作用域和時效。使用 setq, setf 賦值,let, let 綁定。
* 特殊形式: 語言內建的控制結構或環境機制,如 if, cond, progn, block, catch, throw, tagbody 等。
* 宏 (Macros): 允許使用者定義新的語法擴展,將宏呼叫轉換為其他形式求值。
* 函數呼叫: 列表的第一個元素為函數名或 Lambda 表達式,其餘元素求值作為引數。支援多值返回和接收。
* 作用域 (Scope) 與時效 (Extent): 描述變數綁定、控制點等的有效範圍,分為詞法作用域與動態時效等。
* 條件判斷: if, when, unless, cond, case, typecase 等。
* 迭代: loop (無限定迭代), do, do (通用迭代), dolist, dotimes (列表/計數迭代)。
* 塊 (Blocks) 與退出 (Exits): block, return-from 提供結構化詞法退出。catch, throw 提供動態非局部退出。
4. ANSI X3J13 標準化工作帶來的重大更新 (第二版特色)
第二版納入了 ANSI X3J13 委員會為標準化 Common Lisp 所做的技術工作成果,填補了第一版中的一些空白並增加了廣泛被接受的功能。主要的增加和變更包括:
* Loop 設施 (Chapter 26): 大幅擴展了 loop 宏的功能,提供更強大且結構化的迭代控制語法,包括各種計數、遍歷、條件判斷、值累計等子句。
* Pretty Printing (Chapter 27): 增加了標準的 Pretty Printing 介面,允許使用者定義和控制資料結構的格式化輸出,支援邏輯塊、條件換行、縮排等,並與 format 整合。
* Common Lisp Object System (CLOS) (Chapter 28): 引入了完整的物件導向程式設計系統,基於泛型函數 (generic functions)、方法 (methods)、類 (classes)、多重繼承、聲明式方法組合 (declarative method combination)。所有 Common Lisp 物件都是某個類的實例。
* Condition System (Chapter 29): 提供了標準的條件處理系統,用於結構化地處理異常情況,包括錯誤、警告等。定義了條件類型 (condition types)、信號 (signaling) 機制、處理器 (handlers) 和重新啟動點 (restarts),允許程式碼在錯誤發生時嘗試恢復或採取替代行動。
5. 其他補充
- Appendices (附錄): 包含了一些當時雖未被標準化但被認為有潛在價值的提案,如 Series 和 Generators,它們提供了其他方式來表達迭代計算。
總結而言,這份文件描述的 Common Lisp 是一個功能齊全、高度可攜帶且基於動態資料類型和豐富控制結構的程式語言。第二版通過整合 X3J13 的工作,特別是引入了強大的物件導向特性 (CLOS)、標準的條件處理機制和增強的迭代與輸出控制,使其在標準化和現代程式設計範式支援方面取得了顯著進步。
comments
comments for this post are closed