translate nested ASTs: repeat the translation until it stops changing
gratuitous use of functional programming