>>19
The thing is, you cannot tell just by looking at a piece of code, whether the macros used in it are of the
generally sort or the
in general sort. They all might alter the meaning of code in unpredictable ways, and that was just a simple example. Macros introduce hidden mutations just like functions which alter external state introduce mutations: macros mutate your code and impure functions (aka procedures) mutate your state, and all of that is done in a furtive, unobvious way.
This is what makes both macros and impure functions evil - they introduce extra mutation pathways that make your code less obvious, less modular, harder to test and harder to decompose. With macros you can't tell what
code is hidden behind a given piece of code, and with impure procedures you can't tell what
actions are hidden behind a piece of code. Putting macros and impure functions into one language makes for a Molotov cocktail. Isn't that why many Lispers (including the aforementioned Paul Graham, Rich Hickey and the "Land of Lisp" guy) advocate a functional style? Except that Common Lisp isn't made for functional style, so they are stuck with Clojure which is a Javahaskell more than it is a lisp.