回覆列表
  • 1 # 使用者9074924272896

    這是一個五百行的C語言檔案,實現了一個最基礎的Scheme直譯器。具有除掉之外所有的語言特性。此外沒有垃圾收集模組,沒有釋放任何記憶體,因為我的目標不是寫一個完備的Scheme直譯器。基本上是想到哪寫到哪,沒有多少註釋但是變數名都比較幼稚,適合一口氣從頭讀到尾。

    寫一個直譯器不僅僅是對初級編譯原理知識點的總結和運用,更是將自己培養為程式碼、程式乃至程式語言的設計師路上必經的一步。比如我不喜歡一個過於複雜的詞法結構,希望詞法分析器對應的函式不要超過100行,那麼就取消了布林值字面量,只要在標準庫里加兩句話:

    也就行了。那麼對應的,我也可以把內建函式的數量降至最少,比如對布林值的或與非操作就可以用普通的函式實現:

    但是表達“空值”的呢?這個值是必要的,對於一些不應當返回任何值的函式和特殊形式(比如所有的斷言都為假),必須依賴以維持“一切都是表示式”的原則。因此這個值就要對應著一個解釋內部的型別,那麼我們要怎樣生成這個值呢?一種策略是把它寫進詞法分析器,還有一種策略是用一些看起來不那麼“直觀”的方式,比如:

    這當中的取捨完全取決於語言的設計者,也就是直譯器的編寫者。站在語言的使用者的對立面進行一定的思考,對於理解其他語言中的設計有好處。

    標準的Scheme中“欽定”了以列表作為其基礎的也是唯一的複合資料結構,比如的結果,是可以像普通的、用構建起來的列表一樣,用和進行操作的。但我們完全可以建立新的資料結構,甚至用別的資料結構替換之作為基礎資料結構。這是一個與語言提供的“程式設計模型”息息相關的特性。比如說,你可以提供一組內建函式,對可以隨機讀寫的陣列進行封裝,那麼恭喜你,你寫的已經不是LISP了,而是一種新的,應當被成為ARRAP(array processor)的語言的直譯器。再比如說,你完全可以用普通函式定義如下一套使用Church編碼的列表:

    使用這一套介面建立的列表和Scheme透過建立的列表是不“相容”的。它們有什麼區別?如何提供合適的,使它和的返回值可以使用一套介面操作?這都是很值得思考的問題。

  • 中秋節和大豐收的關聯?
  • 於正新劇皓鑭傳,吳謹言能撐得住這個角色嗎?