I'm bewildered by all the built-in Mathematica functions that purport to prevent evaluation in some way: Unevaluated
, Defer
, Hold
, and over half a dozen of the form Hold*
. The Mathematica documentation just explains each function in isolation without explaining why you would choose one or the other. Can anyone offer a coherent explanation of all these functions? The whole thing seems like a convoluted mess to me. Relating it all to Lisp macros might be a good place to start.
Most of the Mathematica language is amazingly well-designed but it seems like Wolfram really painted himself into a corner on this aspect. Or I could be missing something.