Как проще всего обновить неизменяемый AST?

Работая с макросами, я достиг точки (, которую изо всех сил пытался избежать ), когда мне нужно обновить те узлы в AST, которые поддерживают определенное условие. Например, предположим, что я хотел бы обновить каждый узел:

Literal(Constant(1))

со значением:

Literal(Constant(2))

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

5
задан jeslg 9 July 2012 в 15:10
поделиться