Autology,一種用 Clojure 編寫的新型函式式解釋型 Lisp 語言,在程式語言愛好者中引發了熱烈討論。該專案的獨特之處在於它允許程式在執行時訪問自己的直譯器,從而在執行過程中動態修改語言的行為。
執行時語言修改
Autology 採用了一種不尋常的超程式設計方法,將其直譯器函式繫結到程式內部可訪問的變數 **
上。這種設計允許開發者在程式執行時修改語言如何評估表示式。與傳統的在編譯時操作的 Lisp 宏不同,Autology 能夠在執行時完全重寫語言語法和語義。
該專案的建立者 Kimbsy 表示,這個專案主要是為了好玩並探索一個有趣的想法,同時承認當前的實現非常慢且資源密集。Kimbsy 計劃在五月的 London Clojurians 和六月在克拉科夫舉行的 Lambda Days 上發表關於 Autology 的演講。
Autology 的主要特點
- 使用 Clojure 編寫
- 直譯器函式作為資料結構對程式可用
- 在執行環境中繫結到變數
**
- 允許在執行時修改語言行為
- 可以動態新增、修改或刪除語言特性
相關專案和概念
- Common Lisp 實現(SBCL、CCL)及其直譯器訪問包
- Common Lisp 中的讀取宏
- FEXPRs(歷史 Lisp 特性)
- John Shutt 的 Kernel 程式語言
- Amin 和 Rompf 的"直譯器塔"研究
- Shen 語言
與傳統 Lisp 方法的比較
社群討論揭示了 Autology 與傳統 Lisp 實現之間的有趣比較。一些評論者指出,像 SBCL(Steel Bank Common Lisp)和 CCL(Clozure Common Lisp)這樣的 Common Lisp 實現已經提供了與直譯器內部互動的包,儘管不像 Autology 那樣直接。
一位評論者解釋了 Common Lisp 的讀取器宏如何實現類似的靈活性:
「你實際上可以在 Common Lisp 中使用稱為讀取器宏(Reader Macro)的東西做出完全瘋狂的事情,它讓你臨時完全控制直譯器。」
討論還涉及了歷史上的 Lisp 概念,如 FEXPR(函式表示式),這是早期嘗試提供類似功能的方法,但最終因效能原因被宏所取代。使用者 kazinator 的詳細技術解釋強調了 Autology 的方法與 FEXPR 的不同之處,即傳遞可定製的直譯器物件而不僅僅是詞法環境。
理論應用和侷限性
雖然主要是作為一個實驗性專案建立的,但社群討論探索了這種極端執行時靈活性的潛在應用。提到的一個理論用例是在詞法作用域內切換不同的語言語法的能力,允許開發者用最適合每個部分的語言表達複雜問題的不同部分。
該專案包括展示在同一程式中切換不同語言語法的跨語言程式碼示例。一些使用者建議,這可能作為改進的外部函式介面(FFI)機制,儘管其他人質疑其好處是否會超過複雜性成本。
幾位評論者將其與相關工作聯絡起來,包括 John Shutt 的 Kernel 程式語言,Nada Amin 和 Tiark Rompf 關於直譯器塔的研究,以及 Shen 語言。這些聯絡突顯了 Autology 在程式語言設計中對語言可擴充套件性和反射性更廣泛探索中的地位。
儘管作為實用工具目前有侷限性,但 Autology 展示了當程式語言設計具有極端靈活性時所能產生的創造性可能性。正如一位評論者所指出的,僅用 1,000 行 Clojure 程式碼就能探索如此多的想法令人印象深刻。
對於那些有興趣進一步探索 Autology 的人,該專案可線上獲取,其中包含示例演示如何向語言新增函式、切換評估策略,甚至在程式內定義元迴圈 Lisp。
參考:Autology