По мотивам одного проекта, в котором нужно было переводить формулы из таблиц в код, родилась идея языка:
# x, y, z обновляются на каждой итерации
# Тут всё понятно
f: cos(x * y)
# Тут тоже всё понятно
g: z * f
# Функция зависит от значения на прошлом шаге,
# значение на первом шаге задаётся в явном виде.
h = 1
h: @ + g
Всё это транслируется в, например, это:
function __f66() {
__double[4] = cos(__double[1] * __double[0]);
return true;
}
function __g67() {
__double[3] = z * __double[4];
return true;
}
__double[2] = 1;
function __h68() {
__double[2] = __double[2] + __double[3];
return true;
}
while (hasNextInput()) {
__double[0] = nextDouble();
__double[1] = nextDouble();
if (__f66() || __g67()) __h68();
}
Значения вызываются в порядке зависимостей, и вычисление очередной ячейки происходит только в случае, когда хотя бы одна зависимость обновились. "return true" это тривиальный случай, но могут быть функции, которые, например, накапливают значения. Это пока наброски. Можно добавить работу с окнами, зависимость от двух, трёх, N-значений назад. По сравнению с явным программированием таких зависимостей такой формат удобен тем, что освобождает от необходимости хранить промежуточный результат, если от него зависит более одной функции. А использование массива и доступ к его элементам в порядке увеличения индекса позволяет эффективно нагружать кэш процессора. Уверен, что кто-то что-то подобное должен был придумать. Но я ничего не нашёл