What benefit you think is underappreciated? It's a subjective point of view, but my experience is the contrary: that of Lisp-family languages being hyped to exhaustion.
(defn index []
(html5
[:html
[:head]
[:body "the index-page"]]))
Or similarly create your route handler on the back end that will serve up your pages: (defroutes app-routes
(GET "/" [] (index))
(route/resources "/")
; if page is not found
(route/not-found "Page not found"))
Note how concise the language becomes, and this code will expand out to all of the necessary opening and closing tags or boiler plate code that makes your code safe and efficient. None of these syntax structures were previously in the language, they are instead created when needed for abstraction.Am I missing something? What's the special macro-ness here that is different from regular functions?
As an example, I have the beginnings of something like that in javascript at http://taeric.github.io/DancingLinks.html (in the appendix. Functions "div, table, etc.") I've done similar in java before to get the same basic structure that I could run in any c like language. I still miss the flexibility of lisp.
edit: to see another example of mine showing some of the advantage of the "macroness" see http://taeric.github.io/CodeAsData.html and see how little code it took to make a tree walker in lisp. (Not just the tree walker, but indeed, the tree.)
(defmacro or
"Evaluates exprs one at a time, from left to right. If a form
returns a logical true value, or returns that value and doesn't
evaluate any of the other expressions, otherwise it returns the
value of the last expression. (or) returns nil."
{:added "1.0"}
([] nil)
([x] x)
([x & next]
`(let [or# ~x]
(if or# or# (or ~@next)))))
Also check this http://lists.warhead.org.uk/pipermail/iwe/2005-July/000130.h...