Perhaps an example of a program or language that does this.
I see you talk about Lisp and ML a lot - are you referring to macros(1) to extend the language?
1) http://stackoverflow.com/questions/267862/what-makes-lisp-ma...
Perhaps an example of a program or language that does this.
I see you talk about Lisp and ML a lot - are you referring to macros(1) to extend the language?
1) http://stackoverflow.com/questions/267862/what-makes-lisp-ma...
As opposed to a dynamic metaprogramming (e.g., expression trees in C#).
Neither "static metaprogramming" nor "dynamic metaprogramming" give many relevant results on google, so perhaps other terms are more commonly used?
As I said in the other reply, it seems intriguing that some features of C#, e.g. extension methods, yield return, async .. await are essentially rewrite rules. Ways to get at the compiler features that add them to the C# language would be interesting, but the concept seems to be made much harder by the complex curly-brace syntax not being designed for that; it's rather the opposite of lisp.
Once you've got proper macros, pretty much all the other language features can easily be implemented on top of them, so it makes much more sense to get the macros first instead of adding features one by one. I could never comprehend why the mainstream language designers are not doing it.
Syntax is not an obstacle for a proper macro system, as demonstrated by Template Haskell, Nemerle, Katahdin, PFront and the other meta-languages not based on S-expressions. The only thing you need is a quasiquotation for both constructing and pattern matching the ASTs, and it's possible to implement it for any syntax.
Also see Honu[1], which effectively brings Racket's syntax-case into a curly-brace language.
I occasionally wish there were ways to get at the compiler features that add "yield return" and "async ... await" to the C# language and use them for your own extensions, but the hacks that make c++ templates turing-complete definitely don't seem to be a desirable way to do it.