A tartományspecifikus nyelv (DSL) egy adott területre optimalizált kis nyelv. Mivel a DSL célzott, nagyban növelheti a termelékenységet és a megértést azzal, hogy az író azt deklarálhatja, amit szeretne, nem pedig azt, hogy hogyan.
Az egyik problématerület, ahol ezeket alkalmazzák, a bonyolult testreszabások és konfigurációk.
Például a DOT nyelv segítségével szövegesen leírhatsz egy gráfot, amelyet aztán a Graphviz egyik eszköze (például a dot) képpé alakít.
Egy egyszerű gráf így néz ki:
graph {
graph [bgcolor="yellow"]
a [color="red"]
b [color="blue"]
a -- b [color="green"]
}
Ha ezt egy example.dot fájlba írod, és lefuttatod a dot example.dot -T png -o example.png parancsot, létrejön egy example.png kép, amelyen sárga háttéren egy piros és egy kék kör látható, zöld vonallal összekötve.
Írj egy tartományspecifikus nyelvet, amely hasonlít a Graphviz dot nyelvéhez.
A mi DSL-ünk abban hasonlít a Graphviz dot nyelvéhez, hogy gráf adatszerkezetek létrehozására fogjuk használni. A DOT nyelvvel ellentétben azonban a mi DSL-ünk belső DSL lesz, amelyet csak a saját nyelvünkben használunk.
Tudj meg többet a belső és a külső DSL közötti különbségről.
Ebben a DSL-ben egy gráf egy Graph típusú objektum. Ez egy vagy több tuple-t tartalmazó list-et vár, amelyek a következőket írják le:
NodesEdgesA Node és az Edge implementációját a dot_dsl.py tartalmazza.
A DSL várt felépítéséről, valamint a várt hibatípusokról és hibaüzenetekről a dot_dsl_test.py tesztesetei adnak részletes felvilágosítást.
Néha szükség van arra, hogy kivételt dobj. Amikor ezt teszed, mindig adj meg egy beszédes hibaüzenetet, amely megmutatja, mi a hiba forrása. Ettől a kódod olvashatóbb lesz, és a hibakeresést is jelentősen megkönnyíti. Ha tudod, hogy a hiba forrása egy adott típusú, választhatsz a beépített hibatípusok közül, de ilyenkor is adj meg beszédes üzenetet.
Ez a feladat megköveteli, hogy a raise utasítás használatával „dobj” TypeError-t, ha egy Graph hibás, és ValueError-t, ha egy Edge, Node vagy attribute hibás. A tesztek csak akkor lesznek sikeresek, ha raise-eled a exception-t, és üzenetet is fűzöl hozzá.
Ha üzenettel szeretnél hibát dobni, írd az üzenetet a exception típus argumentumaként:
# Graph is malformed
raise TypeError("Graph data malformed")
# Edge has incorrect values
raise ValueError("EDGE malformed")
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Python nyelvet 17 fogalom146 feladat segítségével, valódi emberi mentorálással, mindez ingyen.