I don't think it's fair to judge DSLs (Embedded DSLs or EDSLs to be more precise) as a whole based on Ruby alone. I write Ruby at my day job and I think it's metaprogramming features are lacking. Languages like Clojure, Scheme, and Common Lisp are much better places to look. Designing languages is an inherent part of programming, but not being able to extend the syntax of your host language (as is the case in many languages) is very limiting.
In the years I've spent writing ES5 JavaScript code, I've constantly wished there was a macro system I could use to stop writing this:
(function($) { doSomeJQueryStuff(); })(jQuery)
and instead write something like this, which is what I could do in any other sane lexically scoped language:
let($ = jQuery) { doSomeJqueryStuff(); }
Instead I had to wait for the language design gods to add similar syntax to ES6. I think any programmer should be able to put on their language designer hat and add some syntax if they want.
In the years I've spent writing ES5 JavaScript code, I've constantly wished there was a macro system I could use to stop writing this:
and instead write something like this, which is what I could do in any other sane lexically scoped language: Instead I had to wait for the language design gods to add similar syntax to ES6. I think any programmer should be able to put on their language designer hat and add some syntax if they want.