Хрен знает, как это называется, поэтому нагуглить не могу. Требуется помощь зала^WЛОРа.
Дан набор выражений для вычисления значений переменных через другие переменные. Абстрактный пример:
a := 3
b := 200
c := sqrt(b) * a
d := b + c
Набор может изменяться в рантайме: выражения и переменные могут выкидываться и добавляться. С каждой переменной может быть связан коллбек. При каждом изменении набора необходимо вычислять актуальные значения переменных — при чем только тех, значения которых реально затронуты данным изменением (т.к. набор в общем случае может быть приличного размера, перевычислять целиком не эффективно) — и дергать коллбеки, асооциированные с изменившимися переменными, сообщая туда новые значения.
В случае, если какая-то переменная невычислима (граф вычислений не связный или содержит рекурсию), надо не виснуть и не сегфолтиться, а выдавать вменяемое сообщение об ошибке.
Это была первая часть балета. Теперь усложняем. Переменные организованы в дерево наборов. Выражения могут содержать ссылки на переменные родительского набора, а также операции свертки по значениям переменных в дочерних узлах. Абстрактный пример:
root [a := 4; b := 25; x := reduce_with_children(sum, x)]
|
+-> first_child [x := parent.a + 1]
|
+-> second_child [x := parent.b * 2]
В принципе, как это реализовывать — понятно. Но самостоятельно возиться очень не хочется.
Вопросы:
Как описанное называется по-умному?
Есть ли какие-то готовые библиотеки, реализующие это? Юзаться библиотека будет из Си. Язык описания выражений для библиотеки не принципиален.