Even though Ruby is in many ways an acceptable Lisp, extending the language itself is a hard endeavour. By using reflection/meta-programming and taking advantage of its rich grammar, it's certainly possible to bend the language in extreme ways (believe me, I've done it), but there are a couple of serious limitations:
- Everything must be done at run-time, incurring in necessary overhead, sometimes unacceptably so.
- The resulting code must be valid Ruby not only syntactically, but also semantically. That forbids the introduction of new semantic constructs by users themselves.
Now, some people might argue in favour of a special DSL for compile-time macro-building, possibly augmenting the grammar and introduce all sorts of new tricks to do that. But I think that wouldn't be the most general solution, nor the most desirable. The alternative: a simple, object-oriented AST transforms API.
By building an AST transforms API and making it available to users, I argue that we could kill many birds with one stone:
- A rich macro system (or many!) could be implemented as a simple library, with no changes to core ruby.
- Some micro-optimizations could be implemented as a library, which may find their way into core ruby later.
- Experimental, new semantic constructs could be made available to users through simple libraries, and when time has proven their usefulness, maybe they could be implemented natively, if needed.
I'd be up for the task if there is enough interest -- what are people's thoughts on this?