跳轉到內容

學習 Clojure/操作

來自華夏公益教科書

Lisp 原始碼在兩個階段執行

  1. 原始碼由讀取器讀取,讀取器將原始碼解析為資料結構。
  2. 然後,評估器遍歷此資料結構,根據一組簡單的規則將資料解釋為操作。

雖然幾乎所有語言的原始碼都是透過首先將其轉換為資料結構(抽象語法樹 (AST))來處理的,但 Lisp 的獨特之處在於它使此資料結構和評估規則足夠簡單,以便您,使用該語言的程式設計師,可以完全瞭解此過程的細節。一旦您瞭解了讀取器和評估器如何“思考”,您就理解了 Lisp。

與其他動態語言一樣,Lisp 可以在互動式命令列模式下使用。Lisp 將此模式稱為讀取評估列印迴圈 (REPL):每次在 REPL 中鍵入命令時,它都會被讀取並評估,然後評估返回的值會被列印。REPL 可用作計算器,用於快速實驗,或用於檢查或修改正在執行的程式(例如,除錯時觸發斷點時)。

但是,程式當然是以原始碼檔案的形式編寫的。您可能期望讀取器在將程式碼傳遞給評估器之前先讀取整個原始檔,但事實並非如此:在某些 Lisp 方言中,讀取器的行為可以被評估的程式碼修改,因此讀取器在讀取時將每塊可用的程式碼傳遞給評估器,從而允許程式碼修改它下面的程式碼的讀取方式。在 Clojure 中,讀取器的行為目前不可修改,但 Clojure 仍然遵循這種傳統的讀取評估模式。(將來,Clojure 可能允許修改讀取器。)

讀取器

[編輯 | 編輯原始碼]

在 Clojure 中,讀取器會忽略“;”和該行之後的所有內容。

; this is a comment

空格是將“原子”(符號、關鍵字、數字文字和字串文字等)彼此分隔所必需的,但其他情況下會忽略。, 字元被視為空格,這對風格來說很有用,可以更清楚地視覺上分隔原子。

foo, bar   ; the comma is treated the same as if it were a space

但在字串文字中,空格、; 和 , 自然會被視為它們本身。

"hi, there"

否則,讀取器基本上將原始碼視為一堆文字。例如

(def jerry [1 2 3])

讀取器將其解析為一個列表,其中包含符號 def,然後是符號 jerry,最後是一個包含整數 1、2 和 3 的向量。因為此列表位於程式碼的“頂層”(它不包含在另一個集合中),所以一旦它被完全讀取,它就會立即傳遞給評估器。

讀取器的行為可以透過稱為讀取器宏的文字上的特殊字首進行修改,但這些基本上只是便利功能,因此我們將在後面討論它們。


Previous page
名稱空間
學習 Clojure Next page
資料型別
基本操作
華夏公益教科書