Предметно-орієнтована мова (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, де червоний і синій кружечки зʼєднані зеленою лінією на жовтому тлі.
Напишіть предметно-орієнтовану мову, подібну до мови dot від Graphviz.
Наша DSL подібна до мови dot від Graphviz тим, що нашу DSL будемо використовувати для створення структур даних графів. Однак, на відміну від мови DOT, наша DSL буде внутрішньою DSL, призначеною лише для використання в нашій мові.
Дізнаймося більше про різницю між внутрішніми та зовнішніми DSL.
У цьому DSL граф - це обʼєкт типу Graph. Він приймає list з одного або більше кортежів, які описують:
NodesEdgesРеалізації Node та Edge наведено в dot_dsl.py.
Щоб дізнатися більше про очікуваний дизайн DSL та очікувані типи помилок і повідомлення про них, погляньте на тестові випадки в dot_dsl_test.py.
Іноді потрібно згенерувати виняток. Коли ми це робимо, варто завжди додавати змістовне повідомлення про помилку, щоб було зрозуміло, у чому джерело помилки. Це робить наш код читабельнішим і суттєво допомагає з налагодженням. Якщо відомо, що джерело помилки має певний тип, можна згенерувати один із вбудованих типів помилок, але повідомлення все одно має бути змістовним.
У цій вправі використайте інструкцію raise, щоб «кинути» TypeError, якщо Graph неправильно сформовано, і ValueError, якщо неправильно сформовано Edge, Node або attribute. Тести пройдуть, лише якщо ми і згенеруємо exception через raise, і додамо до нього повідомлення.
Щоб згенерувати помилку з повідомленням, треба передати повідомлення як аргумент типу exception:
# Graph is malformed
raise TypeError("Graph data malformed")
# Edge has incorrect values
raise ValueError("EDGE malformed")
Зареєструйтеся на Exercism, щоб вивчати й опановувати Python, а також 17 концепцій146 вправ та справжнє наставництво від людей, і все це безкоштовно.