In my experience such languages are very dangerous and it is better to have a chain of more restrictive languages instead. Most passes only make sense in a fixed sequence anyway. LLVM is infanously broken in this regard, btw., there are too many implicit pass dependencies.<p>E.g., there is no point in keeping a one-handed &#x27;if&#x27; in a language after a pass which lowers it into a two-handed &#x27;if&#x27;. There is no point in keeping a &#x27;lambda&#x27; node in your AST after lambda lifting is done.