DOT DSL

DOT DSL

中級

説明

ドメイン固有言語(DSL)とは、特定の領域に特化した小さな言語です。DSLは対象が絞られているので、_どうやって_ではなく_何を_したいのかを書き手が宣言できるようになり、生産性や理解度に大きな影響を与えることができます。

DSLが活用されている分野の1つに、複雑なカスタマイズや設定があります。

たとえば、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言語に似ています。ただし、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")のように2つのノードの間に辺を作るためのものではありません)。

もっと楽しみたいなら、グラフをDOT形式に変換するto_dot関数の実装にも、ぜひ挑戦してみてください!


出典

Wikipediaリンクは新しいウィンドウまたはタブで開きます
GitHubで編集する リンクは新しいウィンドウまたはタブで開きます
Roc Exercism

DOT DSLを始める準備はできましたか?

Exercismに登録すれば、126個の演習、そして本物の人間によるメンタリングとともに、Rocを学んでマスターできます。すべて無料です。