Put slightly differently: as you've phrased it, evaluation would expand each element but always start stepping into it from the very start. That's not what happens; as the evaluator steps through the list, it throws away its reference to the earlier part completely. So it never becomes 'f' : ('o' : ("o" ++ "bar"))) because when the evaluator is at the 'o' it has completely forgotten about the 'f'. It's got 'o' : ("o" ++ "bar") and any remaining reference (if there is one) to the 'f' is held by something else.
--
brandon s allbery
allbery.b@gmail.comwandering unix systems administrator (available) (412) 475-9364 vm/sms