«前の日記(2006-11-02) 最新 次の日記(2006-11-11)» 編集
2002|09|
2003|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|10|11|
2008|01|

ひ日誌


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入門しかけた素人だからです、多分。


«前の日記(2006-11-02) 最新 次の日記(2006-11-11)» 編集