2004-11-27 (Sat) [長年日記]
_ BooのDuck Typing
「foo as duck」と書くと型チェックが動的に行われるというのが目新しい。
[Matzにっき(2004-11-26)より引用]
というとこだけ読むと、「何だ、s.is_a?(String)みたいなもん?」と思えるが、 実際には型チェックを動的に行うというより、リフレクションを使ってメソッド 呼び出しを行って、上手く行けばOK、というもののようだ。 ちなみに、duckの部分は例ではなくって、ほんとにduckと書く。
class Person: [getter(Name)] _name as string def constructor(name): _name = name class Car: [getter(Name)] _name as string def constructor(name): _name = name x as duck = Person("Shugo") print(x.Name) x = Car("March") print(x.Name)
ここで、x as duckの部分をx as Personに変えると、もちろんCarオブジェクトの 代入の部分で(静的な)エラーになる。 ちょっとObjective-Cに似てるかもしれない。duckはidだね。
.NETだとGroovyが使えなくて残念だと思ってたけど、こっちの方が面白そうだな:)
一番気になるのは型推論がほんとにうれしいのか、という点。Haskellだと他の部分が 自分がこれまで使って来た言語と違いすぎていてそこだけ評価できないんだけど、Boo はわりと普通っぽいのでいいかもしれない。 QDBMのインタフェイス書いてちょっと使ってみようかしら。
_ Booのmixin
ソースに含まれているcrazy_ideas.booというファイルを見ると、以下のような コードが、
mixin TraceMixin(Foo, ICollection): def before(name): print(name) def after(name): print(name)
これってメソッドコンビネーション? まだ実装はされてないみたいだけど、どういう仕様になるんだろう。