DOT DSL

DOT DSL

中等

說明

領域特定語言(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,只能在我們的語言裡使用。

深入了解內部 DSL 與外部 DSL 的差異。

打造你自己的 DSL

在這個練習中,你可以完全自由地設計你理想中的圖形 DSL。

也許你想建立一個以標籤和記錄清單為基礎的 DSL,就像這樣:

my_graph =
    Graph.create([
        Title("My Graph"),
        Node("a", { color: Green }),
        Node("b", { color: Blue }),
        Edge("a", "b", { style: Dotted }),
    ])

或者你偏好以函式呼叫鏈為基礎的 DSL,就像這樣:

my_graph =
    Graph.create()
        .with_title("My Graph")
        .add_node("a", Attr.create().with_color(Green))
        ...

又或者你完全有別的想法?放手去做吧!測試只要求你建立幾個特定的圖形,至於要怎麼建立,完全由你決定。

話說回來,一個 DSL 如果能做到清楚、簡潔,又不會太出乎意料,通常會更好(例如 minus函式的用途是相減,而不是在兩個節點之間建立邊,像node("a") - node("b")這樣)。

想讓樂趣加倍的話,你還可以試著實作一個to_dot函式,把你的圖形轉換成 DOT 格式!


出處

Wikipedia連結會在新視窗或分頁中開啟
透過 GitHub 編輯 連結會在新視窗或分頁中開啟
Roc Exercism

準備好開始 DOT DSL 了嗎?

註冊 Exercism,透過 126 個練習 和真人引導來學習並精通 Roc,全部免費。