Я пишу простую библиотеку геометрических композиций / манипуляций. Библиотека должна позволять клиентам выражать высокоуровневую логику, как показано ниже:
table_base = Cylinder(r=..., h=..., anchor=None)
table_stem = Cylinder(r=..., h=..., anchor=None)
table_top = Cylinder(r=..., h=..., anchor=None)
# Build an abstract entity 'table' by specifying relationships
# between its components. No concrete locations specified yet.
table = Geometry()
table.add(table_base)
table.stack(table_stem, table_base)
table.stack(table_top, table_stem)
# Provide concrete location for the base
# Assume 'table_base' is accessible via its name
table['table_base'].anchor = (0, 0, 0)
# At this point we have information to populate
# 'anchor' locations for other components
table.build()
Как показано выше, мы сначала строим примитивы (предположим, у меня есть представления для этого). Затем мы строим table
как объект абстрактной геометрии. Наконец, мы предоставляем местоположение якоря для базы. Когда я нажимаю build()
, я хочу, чтобы эта информация каскадно располагалась в дереве зависимостей и заполняла anchor
местоположения для других компонентов. По общему признанию, я могу требовать, чтобы клиенты обновляли свои собственные якорные местоположения, но со сложными объектами это становится утомительным. Что является подходящим представлением для хранения абстрактных связей между компонентами до шага build
?
Как вы, вероятно, можете сказать, у меня нет опыта в компиляторах или написании DSL. Так что даже название того, что я ищу, было бы отличной отправной точкой. Языковые предпочтения Python, но меня больше интересует концептуальное понимание.