Работая с макросами, я достиг точки (, которую изо всех сил пытался избежать ), когда мне нужно обновить те узлы в AST, которые поддерживают определенное условие. Например, предположим, что я хотел бы обновить каждый узел:
Literal(Constant(1))
со значением:
Literal(Constant(2))
Эти узлы AST могут находиться где угодно в дереве выражений, поэтому я не могу использовать специальный -сопоставление с образцом. Очевидно, последнее, что я хотел бы сделать, — это написать код полного сопоставления с образцом, способного охватить все примитивы компилятора. Я искал в API , но у меня сложилось впечатление, что такие методы, как collect и семейство traversable , недостаточно хороши для удовлетворения моих потребностей, поскольку они относитесь к дереву как к линейной вещи, и в результате я хочу получить все обновленное дерево. Итак, можно ли разумно обновить неизменяемое дерево выражений? Почему в стандартном API нет такой операции «обновления»?