Что вы хотите, так это отложить оценку. Это распространено в приложениях для работы с электронными таблицами. Я думаю, что R-язык также позволяет что-то подобное.
Вы можете реализовать его практически на любом языке.
Обычный подход заключается в том, что вы определяете класс терминатора (например, Number) и переопределяете операторы (если язык поддерживает его, например, C++, C# или python), чтобы возвращать узлы в дереве. Таким образом, a * 3 + 1 будет эквивалентен чему-то вроде (b = Sum (Mult (a, Number (3)), Number (1)). После того, как у вас есть что-то подобное, вы можете изменить значение a с помощью accessor и затем запросите переоценку верхнего узла, который даст вам нужное значение.
Есть, вероятно, уже несколько вариантов реализации. Его нетрудно реализовать, но это немного утомительно для определения всех классов и требуются неявные преобразования. Это сложнее, если вы хотите оптимизировать оценку.
Excel просто делает это. Я предполагаю, что они устанавливают граф зависимостей при разборе выражений. Вы можете проверить, что круговые ссылки обнаружены. –