領域特定語言(DSL)是為特定領域最佳化的小型語言。由於 DSL 有明確的目標,它能讓撰寫者宣告自己_想要什麼_,而不是_如何做_,因此能大幅提升生產力與理解度。
這類語言常被應用的一個問題領域,是複雜的自訂與設定。
舉例來說,DOT 語言讓你可以用文字描述一張圖,接著再由 Graphviz 的其中一個工具(例如 dot)把它轉換成圖片。一個簡單的圖看起來像這樣:
graph {
graph [bgcolor="yellow"]
a [color="red"]
b [color="blue"]
a -- b [color="green"]
}
把這段內容放進檔案 example.dot,然後執行 dot example.dot -T png -o example.png,就會產生一張 example.png 圖片,裡面是一個紅色和藍色的圓圈,被一條綠線連接,背景則是黃色。
請撰寫一個類似 Graphviz dot 語言的領域特定語言。
我們的 DSL 和 Graphviz dot 語言相似,因為我們的 DSL 會用來建立圖的資料結構。不過,和 DOT 語言不同的是,我們的 DSL 是內部 DSL,只能在我們的語言裡使用。
這道練習會要求你為類似 DOT 語言的 DSL 定義語法。
這個任務很可能需要你使用記法或巨集。 你可以參考一下參考文件。
在這道練習中,節點之間的邊是以單一個 - 表示,與實際 DOT 語言使用的 -- 不同。
這樣可以避免與 Lean 的單行註解語法衝突。
另外,每個敘述都以 ; 結尾,連圖層級的註解也不例外。