ひ日誌
2006-11-03 ( ja -> en )
_ [macosx][rubycocoa][ruby][objective-c] addRubyMethod_withType の構文糖
普通のRubyCocoaプログラムの中で、addRubyMethod_withType という名前をそのまま使うのは、生々し過ぎて ruby-ism に少し欠ける気がしたので、構文糖(syntax sugar)あるいは DSL みたいなものを考えてみました。
RubyCocoa 0.4.2から0.4.3d2の間に、OSX::NSObjectの派生クラスでは addRubyMethod_withType というクラスメソッドが追加されてる。これは、Rubyプログラムで定義したメソッドとその型をObjective-Cランタイムに対して宣言する、というような意味を持っている(ですよね?)。このメソッド名は、実装がやることをObjective-C世界の立場で説明しているものなのだけど、Rubyプログラムに書くと:
class Foo < OSX::NSObject
def foo_bar(view, index)
...
end
addRubyMethod_withType(foo:bar:', '@@:@I')
end
こんな感じになって、普通のRubyCocoaプログラマ視点から見るとどうにも違和感がある。それから、CamelCase + '_' はちょっと…。そこで、まず第一段階として別名を考えてみる。これは要するに型宣言みたいなものなので、それっぽい雰囲気で:
class Foo < OSX::NSObject
def foo_bar(view, index)
...
end
objc_form 'foo:bar:', '@@:@I'
end
というような感じ。objc_form という名前の他に、objc_type, objc_prototype, method_form, method_type などなどを思いついたけど、ここではとりあえず objc_form を使った。
さて、objc_form (仮名) の第一引数は、Rubyのメソッド名と同じ名前を指定できる方が普通のRubyCocoaプログラマにやさしくていいかもしれない。引数の数がわかっているので、Objective-Cのセレクタ名に解決可能なはずだ。
class Foo < OSX::NSObject
def foo_bar(view, index)
...
end
objc_form :foo_bar, '@@:@I'
end
宣言しなくてはいけないところがRubyっぽくなくてやや悲しいが、それでも、addRubyMethod_withType と書くより気分はでる。さらに、rails後の現在では、foo_bar が二度出てくるのはDRYじゃなくていや!という気がしなくもないので:
class Foo < OSX::NSObject
def_with_form(:foo_bar, '@@:@I') do |view,index|
...
end
end
というようなDSL的疑似構文を追加するのもいいかもしれない。
さらに、'@@:@Iabracadabra' と呪文のような型指定文字列(詳しくはこちら)も、普通のRubyCocoaプログラマにやさしくないから:
'I -> @ -> @'
と書けるといいかもしれない、などと一瞬思ったのだけど、これは、僕が半端にHaskell入門しかけた素人だからです、多分。