DOT DSL

DOT DSL

보통

지침

도메인 특화 언어(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 언어와 비슷해요. 하지만 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")처럼 두 노드 사이에 간선을 만드는 용도가 아니에요).

재미를 두 배로 만들고 싶다면, 그래프를 DOT 형식으로 변환하는 to_dot 함수를 선택적으로 구현해 볼 수도 있어요!


출처

Wikipedia링크가 새 창이나 탭에서 열려요
GitHub에서 편집 링크가 새 창이나 탭에서 열려요
Roc Exercism

DOT DSL 문제를 시작해 볼 준비가 됐나요?

Exercism에 가입하고 Roc 트랙을 연습 문제 126개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.