Yigal Chripun wrote:
Nick Sabalausky wrote:
I suppose that might make reverse-engineering easier which MS might not like, but I'm not suggesting this as something that MS should like or should even do, but rather suggesting it as (business issues completely aside) something that would possibly gain the benefits of both styles.


that's the exact opposite of a good solution.
I already mentioned several times before the language Nemerle which provide the correct solution. important fact - Nemerle is a .NET language and it does _NOT_ need to modify the underlining system.

The way it works in Nemerle is pretty simple:
the language has a syntax to compose/decompose AST.
a Macro in nemerle is just a plain old function that uses the same syntax you'd use at run-time and this "function" can use APIs to access the compiler's internal data structures (the AST) and manipulate it. you "connect" it to your regular code by either just calling it like a regular function or by using attributes.

let's compare to see the benefits:
in D:
tango.io.Stdout("Hello World").newline; // prints at run-time
pragma(msg, "Hello World"); // prints at compile-time

in Nemerle:
macro m () {
  Nemerle.IO.printf ("compile-time\n");
  <[ Nemerle.IO.printf ("run-time\n") ]>;
}
// and you call it like this:
m();
Nemerle.IO.printf ("run-time\n");

notice how both use the same code, the same printf function?
the only change is that the second line inside the macro is enclosed inside <[ ]> which means output (return) the AST for this code instead of actually running the code and returning the result of the call.

Macros in Nemerle need to be compiled since they are regular Nemerle code and they need to be loaded by the compiler (added to the command line) in order to compile the code the calls the macros.

essentially these are just plugins for the compiler.

compared to the elegance of this solution, templates are just a crude copy-paste mechanism implemented inside the compiler.

Nemerle's interesting, but it has its own issues. The largest one is that it will have to beat history: languages with configurable syntax have failed in droves in the 1970s.

Before I got into D, I was working on Enki. Enki was my own programming language and of course made D look like a piece of crap. In Enki, you had only very few primitives related to macro expansion, and you could construct all language elements - if, while, for, structures, classes, exceptions, you name it, from those primitive elements.

There were two elements that convinced me to quit Enki. One was that I'd got word of a language called IMP72. IMP72 embedded the very same ideas Enki had, with two exceptions: (1) it was created in 1972, and (2) nobody gave a damn ever since. IMP72 (and there were others too around that time) started with essentially one primitive and then generated itself with a bootstrap routine, notion that completely wowed me and I erroneously thought would have the world wowed too.

The second reason was that I've had many coffees and some beers with Walter and he convinced me that configurable syntax is an idea that people just don't like. Thinking a bit more, I realized that humans don't operate well with configurable syntax. To use the hackneyed comparison, no natural language or similar concoction has configurable syntax. Not even musical notation or whatnot. There's one syntax for every human language. I speculated that humans can learn one syntax for a language and then wire their brains to just pattern match semantics using it. Configurable syntax just messes with that approach, and besides makes any program hugely context-dependent and consequently any large program a pile of crap.

That being said, I have no idea whether or not Nemerle will be successful. I just speculate it has an uphill battle to win.


Andrei

Reply via email to