Let's say we decided that we thought we avoid capture by making every variable binding be unique and then never worry about renaming. This still doesn't work if you want to substitute with free variables, which is a perfectly reasonable thing to do when working underneath a lambda in, for example, an optimization pass. We start with this (note that no two variables in the expression have the same name): (\x.xx)(\y.\z.yz) This beta reduces to: (\y.\z.yz)(\y.\z.yz) Which beta reduces to: \z.(\y.\z.yz)z There are no longer any toplevel redexes, but there is one underneath the binder that we could reduce (which should be a legitimate optimization in the CBN lambda caluclus). We then reduce this to: \z.\z.zz Capture!