用 48 小時編寫你的 Scheme 直譯器/總結
你現在擁有一個可以執行的 Scheme 直譯器,它實現了大部分的標準,包括函式、lambda 表示式、詞法作用域、符號、字串、整數、列表操作和賦值。你可以以互動式方式使用它,使用 REPL 或批處理模式,執行指令碼檔案。你可以編寫 Scheme 函式庫,並將它們包含在程式中或載入到互動式直譯器中。透過一些 awk 或 sed 的文字處理,你可以將 UNIX 命令的輸出格式化為帶括號的 Lisp 列表,將其讀取到 Scheme 程式中,並將此直譯器用於 shell 指令碼。
你還可以在這個直譯器中新增一些特性。衛生宏允許你在程式碼執行之前對其進行轉換。對於新增新的語言特性來說,這是一個非常方便的功能,並且 Scheme 的幾個標準部分(例如 let 繫結和額外的控制流特性)都是用它們定義的。R5RS 的第 4.3 節定義了宏系統的語法和語義,並且有一個關於實現的完整的論文集。基本上,你想要在 readExpr 和 eval 之間插入一個函式,它接收一個表示式和一個宏環境,查詢轉換關鍵字,然後根據模式語言的規則對其進行轉換,並根據需要重寫變數。
延續是一種捕獲“計算的剩餘部分”,將其儲存,並可能執行多次的方法。使用它們,你幾乎可以在每種主要程式語言中實現每種控制流特性。實現延續的最簡單方法是將程式轉換為延續傳遞風格,以便 eval 接收一個額外的延續引數並呼叫它,而不是返回一個結果。這個引數將貫穿所有對 eval 的遞迴呼叫,但只有在評估對 call-with-current-continuation 的呼叫時才會被操作。
dynamic-wind 可以透過儲存一個在離開當前延續時要執行的函式堆疊以及在恢復延續時要執行的函式堆疊(在延續資料型別內部儲存)來實現。
如果你只是想學習更多關於 Haskell 的知識,有許多庫可以幫助你。
- 對於 Web 應用程式:WASH,一個單子 Web 框架。
- 對於資料庫:haskelldb,一個將 SQL 封裝為一組 Haskell 函式的庫,讓你在查詢資料庫時獲得語言的所有型別安全性。
- 對於 GUI 程式設計:Fudgets 和 wxHaskell。wxHaskell 更像是一個傳統的 MVC GUI 庫,而 Fudgets 包含了許多關於如何在函數語言程式設計語言中表示 GUI 的新研究。
- 對於併發:軟體事務記憶體,在論文可組合記憶體事務中描述。
- 對於網路:GHC 的網路庫。
這將為你提供一個開始進一步研究這門語言的起點。快樂程式設計!
感謝 Ketil Malde、Pete Kazmier 和 Brock 傳送關於本教程的問題和建議。其他評論、澄清和更正應在本教程的討論頁面上進行。