Rhombus 1.0 發佈說明
Rhombus 1.0 發佈說明
Rhombus 1.0 現已推出,提供了一種通用型函數式編程語言,它將傳統且易於理解的語法與 Racket 生態系統的深度可擴展性相結合。其設計旨在彌合 Lisp 風格宏(macros)的強大功能與現代、非 S-expression 為基礎的語言之可讀性之間的差距。
核心設計目標與哲學
Rhombus 旨在提供編程概念的現代綜合體——例如詞法作用域變數、閉包、對象、模式匹配和類型參數化——同時保持高度的可擴展性。主要目標是允許開發者根據特定領域量身定制語言支持,而不會產生與 Lisp 繁重的括號表示法相關的陡峭學習曲線。
Rhombus 建立在 Racket 之上,並可以透過以 #lang rhombus 開頭的文件來作為 Racket 模組使用。這種關係類似於 Kotlin 與 Java 或 Elixir 與 Erlang 的關係;Rhombus 利用了 Racket 的工具,包括 raco 命令列套件和 DrRacket IDE,但相較於標準 Racket 引入了顯著的改進,包括:
- 傳統語法: 一種基於縮排的可讀語法,對於日常使用更為親切。
- 改進的數據結構: 更好的預定義數據結構,特別是列表(lists)。
- 增強的語言特性: 全新的類別系統、普遍的模式匹配以及層級化的命名空間組織。
- 進階的類型系統: 可擴展的靜態資訊,存在於合約(contracts)與類型之間的譜系上。
元編程與雙院制語法 (Bicameral Syntax)
Rhombus 在移除 S-expressions 要求性的同時,保留了 Racket 宏系統的強大功能。它透過「雙院制」語法實現這一點,其中傳統的表面語法與「灌木叢表示法」(shrubbery notation)配對,後者作為元編程中 S-expressions 的類比物。
這種架構允許 Rhombus 實作「開放式編譯器 API」,將宏視為編譯時期的元編程。這種方法透過將 DSLs 直接整合到通用語言中,避免了孤立領域特定語言(DSLs)的陷阱。
省略號 (…) 運算符
Rhombus 最具特色的功能之一是省略號運算符 (…)。與其他語言中常見的標準「展開」運算符(splat operator)不同,Rhombus 中的省略號是一個宏,允許進行緊湊的重複操作。它可以與嵌套的數據結構一起工作,並在某些情境下有效地取代 map 操作。
"對於宏識別碼是否出現在綁定上下文(
=的左側)、表達式上下文或某些其他上下文中,Rhombus 讓你能夠定義不同的宏。"
性能與實作
Rhombus 列表使用 RRB trees (Relaxed Radix Balanced trees) 實作。這種數據結構提供了結構共享與函數式更新,對於迭代、插入、刪除、附加與任意讀取操作具有 $O(\log n)$ 的複雜度。RRB trees 非常有利於快取,通常使用 $\log_{16}$ 或 $\log_{32}$ 的基數,這能將開銷的常數因子降至最低。
實際應用與生態系統
雖然 Rhombus 是一門新的語言,目前尚未達到主流語言的庫文件量,但其設計初衷是為了生產環境使用,並受到 Racket 社群的通過支持。目前的實際應用包括:
- Pille: 一種建立在 Rhombus 之上的語言,使用 LLVM 作為後端,展示了強大的元編程能力。
- Economancy: 一個桌面遊戲實作,展示了日常函數式編程的應用。
- rhombus-html-lib: 一個透過 AI 實作的 HTML 5 解析器,遵循 HTML 5 規範。
- pict: 一個動畫圖片庫,用於網絡與安全課程的投影片以及複雜的評估動畫。
- Shplait: 一個教學工具,結合了 ML 的類型系統與 Rhombus 語法。
AI 與語言設計的未來
Rhombus 開發者認為,自動化編碼代理(autonomous coding agents)的興起並不會削弱對新語言或 DSLs 的需求。因為 Rhombus 具有完善的文件的說明,AI 代理已經展現出編寫慣用 Rhombus 代碼的能力。開發者建議,透過更好的 DSL 支持來提升討論層級,對人類程序員與 AI 代理都有利,能促進兩者之間的更好溝通與協作。