At university I had great fun creating a functional programming language that macro expanded to lambda calculus that was then &quot;compiled&quot; to various sets of combinators - I still find the fact that you can express recursive progams using Y purely in terms of two trivial function (S and K) to be one of the most surprising things in CS.