Hatena::Grouprubyist

irykazeの日記 このページをアンテナに追加 RSSフィード

2008-12-07Ruby で DSL

[][]Rubyで言語内DSLを実現するための参考文献へのリンクをまとめてみる。 22:14 Rubyで言語内DSLを実現するための参考文献へのリンクをまとめてみる。 - irykazeの日記 を含むブックマーク はてなブックマーク - Rubyで言語内DSLを実現するための参考文献へのリンクをまとめてみる。 - irykazeの日記 Rubyで言語内DSLを実現するための参考文献へのリンクをまとめてみる。 - irykazeの日記 のブックマークコメント

DSLってなんだ?」っていう人は、まつもとさんの記事を読むと少しわかるかもしれない。

「まつもと直伝 プログラミングのオキテ 第6回 メタプログラミング」

http://itpro.nikkeibp.co.jp/article/COLUMN/20070604/273453/?ST=oss


Rubyはメタプログラミング機能が優れているってって話。

どのような点で優れているかっていうと、Rubyでは、Classクラス(Moduleクラスのサブクラス)のメソッドを駆使して、動的にクラス定義を生成できる。

(いや、Javaとかでも同じことはできるんで、優れているというのは間違っているともいえるけど。)

また、動的にクラス定義を変更することも可能(変数、定数、メソッドの「一覧参照・追加・変更・削除」が可能)

詳しくは、Rubyのリファレンスを参照。


Moduleクラス

http://www.ruby-lang.org/ja/man/html/Module.html


Classクラス

http://www.ruby-lang.org/ja/man/html/Class.html

なお、Classクラスは、Moduleクラスのサブクラスとして実装されている。


Methodクラス

http://www.ruby-lang.org/ja/man/html/Method.html


Symbolクラス

http://www.ruby-lang.org/ja/man/html/Symbol.html

Rubyの実行系では、クラス、メソッドを特定するために、Symbolクラスを利用する。

なお、String <-> Symbolの相互変換が可能。なので、これをうまく使えば、設定ファイルから、動的にクラス定義を生成することが可能。

蛇足だけれど、以下のページによると、Symbolクラスの値は、即値らしい。

http://www.ruby-lang.org/ja/man/html/FAQ_CAD1BFF4A1A2C4EABFF4A1A2B0FABFF4.html#a2.2e1.20.ca.d1.bf.f4.a4.e4.c4.ea.bf.f4.a4.d8.a4.ce.c2.e5.c6.fe.a4.cb.a4.e8.a4.ea.a5.aa.a5.d6.a5.b8.a5.a7.a5.af.a5.c8.a4.cf.a5.b3.a5.d4.a1.bc.a4.b5.a4.ec.a4.de.a4.b9.a4.ab


Rubyで使われる記号の意味 - *

http://www.ruby-lang.org/ja/man/html/Ruby_A4C7BBC8A4EFA4ECA4EBB5ADB9E6A4CEB0D5CCA3.html#a.2a


「機能別索引」

http://www.ruby-lang.org/ja/man/html/_B5A1C7BDCACCBAF7B0FA.html#a.ca.d1.bf.f4.a4.f2.ba.ef.bd.fc.a4.b9.a4.eb

Rubyにおいて、変数・メソッドを定義する、一覧取得する、削除する方法が調べられる。



FAQ:ブロック付きメソッド呼び出し」

http://www.ruby-lang.org/ja/man/html/FAQ_A5D6A5EDA5C3A5AFC9D5A4ADA5E1A5BDA5C3A5C9B8C6A4D3BDD0A4B7.html




あと、DSLを実装するときには、いかにブロックを使いこなすか、ということが重要だと思う。

たとえば、Rakeなんかも、taskを表現するときにはブロックを使ってる。



で、そのブロックの実装には「yield」とか使う、はず。(よくわかんないけど)

http://www.ruby-lang.org/ja/man/html/_A5E1A5BDA5C3A5C9B8C6A4D3BDD0A4B7.html#yield


それに関連して、ブロックを渡すときには、&を使うらしい。

Rubyで使われる記号の意味 - *

http://www.ruby-lang.org/ja/man/html/Ruby_A4C7BBC8A4EFA4ECA4EBB5ADB9E6A4CEB0D5CCA3.html#a.26


それから、単項演算子の再定義には@を使う。

http://www.ruby-lang.org/ja/man/html/Ruby_A4C7BBC8A4EFA4ECA4EBB5ADB9E6A4CEB0D5CCA3.html#a.40


これくらいを知っていると、DSLに関する記事を読んでも、なんとなくイメージがわくんじゃないかと。



たとえば、InfoQにいい記事があったので紹介。

http://www.infoq.com/jp/articles/properties-metaprogramming

あと、こことか。

http://techno.hippy.jp/rorwiki/?An+Exercise+in+Metaprogramming+with+Ruby