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 中,圖是一個型別為Graph的物件。它接受一個list,內含一個或多個用來描述下列項目的 tuple:

  • 屬性
  • Nodes
  • Edges

Node和Edge的實作已提供於dot_dsl.py中。

如需進一步了解這個 DSL 預期的設計,以及預期的錯誤型別和訊息,請參閱dot_dsl_test.py中的測試案例。

例外訊息

有時候,我們必須引發例外。這麼做時,你應該一律附上有意義的錯誤訊息,指出錯誤的來源。這能讓你的程式碼更容易閱讀,對除錯也有很大的幫助。如果你知道錯誤來源會是某種特定的型別,可以選擇引發其中一種內建錯誤型別,但仍然應該附上有意義的訊息。

這個練習要求你使用raise 敘述來「拋出」例外:當Graph格式不正確時拋出TypeError,而當Edge、Node或attribute格式不正確時拋出ValueError。唯有當你同時raise這個exception並附上訊息,測試才會通過。

若要引發附有訊息的錯誤,請把訊息寫成exception型別的引數:

# Graph is malformed
raise TypeError("Graph data malformed")

# Edge has incorrect values
raise ValueError("EDGE malformed")

出處

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

準備好開始 DOT DSL 了嗎?

註冊 Exercism,透過 17 個概念146 個練習 和真人引導來學習並精通 Python,全部免費。