As restrições (de sintaxe) da Internal DSL só existem quando a host language não é flexível o suficiente para que a DSL tenha uma sintaxe específica. Em Java escrever uma DSL Interna é um problema grande exatamente porque a linguagem não é flexível mas em Ruby não existe tanta limitação.
Minha opinião é que você acha 'feio' porque está lendo código Ruby e não lendo código na linguagem que ele foi escrito, que é uma linguagem parecida (por restrições técnicas) com Ruby mas diferente. Se você cria uma DSL que segue a convenção da host language você não tem uma DSL, tem uma API. Talvez tenha até uma Fluent Interface, depende do caso, mas não tem uma nova linguagem, continua preso a antiga.
Veja um exemplo de JMock:
allowing (bank).withdraw(Money.ZERO);
will(throwException(new IllegalArgumentException("you cannot withdraw nothing!");
Isso não é Java, é a linguagem do JMock. Se fosse Java o checkstyle ficaria louco.
Veja a DSL do LOOP em Common Lisp:
[code]
(loop for x in '(a b c d e)
do (print x) )
/code]
'for x in ...' não é lisp, é a DSL do LOOP. Seria possível eu escrever a DSL utilizando o mesmo estilo de Lisp mas não faz sentido neste domínio.