時代とともにRubyの使われ方は変わってきましたが、いつの頃からか発生したDSLのホスト言語としての役割にはずっとお世話になってます。人に優しく、故にプログラマ以外にも優しく、これがとてもRubyらしくて好きな点です。 #ruby25th
— Yuki Yugui Sonoda (@yugui) 2018年2月24日
僕にとってRubyはfluentdやchefのための言語ですが、プラガブルなOSSエコシステムであったり、強力なDSLを作りやすかったりするところにその魅力を感じます。特にfluentdは大好きなOSSで、Mackerel運営でもかなり参考にさせてもらっています。 #ruby25th おめでとうございます!
— songmu (@songmu) 2018年2月24日
DSLは本当に感動したところなんだけど、DSL開発ツールとしてのRubyが「発見」されたものなのか意図されたものなのか気になる #ruby25th
— WAKASUGI 5T111111 (@5t111111) 2018年2月24日
言語内宣言的DSLを構築するRubyの能力がいつからできたものなのか、ふと疑問に思った。
この手の記法で一番古くからあるものとして思いつくのはTk bindingだが、これはいつ頃からあったんだろう。
そう思って古いRubyを見てみた。fj.sourcesにて最初に世界に向けて流されたというruby 0.9.5を見てみると、sample/tkhello.rb
に次のような例が既にある。
TkButton.new { text 'hello' command proc{print "hello\n"} pack('fill'=>'x') }
MatzがLispを意識していて1LispでDSLが盛んに構築されていたことを考えると、これはMatz単独の発明ではないかもしれない。でも、この時点で既にブロックというRubyの機能を用いて宣言的にものを記述するという発想はあったことは分かる。
たとえブロックという制御構文を自作するための記法があったとしても、宣言的語彙を構築するという意思がなければAPIはこんな感じの筈だからだ。
TkButton.new {|btn| btn.text = 'hello' btn.command = proc{print "hello\n"} btn.pack = {'fill'=>'x'} }
ChefやVagrantfile
やRSpecといった現代のDSLを知っているとすこし物足りないのは確かであるものの、基本的な形はRubyが最初に一般に投稿された1995年の時点で完成していたことが分かる。
ただし、この発想が更に一歩進んで臨界点を超えて広まり出すにはRakeを待つ必要がある。そして、最後の部品である表現能力のさらなる探索はRSpecによってもたらされたと言うべきであろう。
Rakeが潮目だったという認識でおります
— Kakutani Shintaro (@kakutani) 2018年2月24日