2月24日のエントリに「書いてあることはどれも正しいし、この本は一読の価値がある。しかし、読めば読むほど気分が悪くなるのはなぜだろう。」と書いたわけだが、もうちょっと考えてみた。
あの時にも考えたように「正しいことを指摘されると腹が立つ」というのが一つ。もうひとつは彼の文章にはプログラミングに対する愛が感じられないのがもう一つ。彼自身もプログラミングする人のはずなんだけどな。
そして、最後にもっとも大きな理由は、私自身が彼に揶揄される立場だということだろう。たとえば、私は彼の言うアーキテクチャ宇宙飛行士のあらゆる属性を備えているし、オープンソースに対するややナイーブな立場もそうだ。
してみると腹が立つのも当たり前か。
感情は制御して、良いことを学ぶことにしよう。
Gimiteさんにもらったアイディアが当初思ったよりも有意義かもしれないと思えてきた。
localというvisibilityを導入して、関数形式でメソッドが呼ばれたときは「localメソッドを探索(そのクラスのみ)→見つからなかったらその他のメソッドを探索」というのは…効率が悪くなるから駄目でしょうか?
基本的な部分は「private問題」で行った実装と共通なので、そのまま流用する。割と簡単に実装できた。
試してみる。
ふむ、なかなかいい感じだ。後方互換性も高い。ちょっと試してみよう。
また、以前検討していたBasicObjectも導入してみた。こちらもちゃんと動いている。以前試した時にはあまり使えない印象だったが、最近、定数の検索順序を変更したのが、うまくいったみたい。
ただ、まだバグが残っているのでもうちょっと試してからコミットしたい。
名前規則なりなんなり(prefix が local_ ... かっこわるいな)だと、コンパイル時に解決できて嬉しいな、と思います。
ささだくんの立場だとそうでしょうねえ。
さて、うまくコンパイル時に解決できる方法があるかな。
local手続き用のよいprefixがあれば良いのですが。
「良い」の基準
* 長くない
小さな手続きに分割することは抽象化の観点からも推奨するべ
き習慣で、それをじゃましないためには長いprefixは良くない
* 既存のコードへの悪影響が少ない
「_」はどうかなと思ったのですが、標準添付の範囲内だけで
も既にかなり使われているようです。
うーん、思いつかない。
Yacc的には「&」はそこなら曖昧にならなそうな気がしますが、どうでしょう。
Perlerの感覚として手続きに&を付けるのはそれほど違和感がないでしょうから、その連想で自然に覚えられそうな気がします。
ふたつの理由から「&」はあまり良くないように思います。
* あまりにPerl的。Perlですら最近は捨てつつある記法を今さら
導入するには抵抗がある。
* 引数リストの中での「&local」はブロック引数と衝突する
もう、記号が残ってないですねえ。^^;;;
_privatefunc() -> .privatefunc() ('self' 無し)なんてどうでしょう。
確かにドットはprefixには使ってませんねえ。
プレフィクスをつけなくても、(localメソッドが優先的に探索されるなら)「クラス内にその名前のlocalメソッドがあるか」でコンパイル時に判定可能な気がするんですが…。
Rubyはあまりにも動的なので、defがifの中にあったりする可能性がありますので、コンパイル時に決定することは無理ですね。ただ、最初のアクセスでlocalメソッドであることが分かれば自己書換することは...あ、undefされることがあるからダメか...。
あ、なるほど…。
def /.private() みたいに、
スラッシュドットはどうでしょう。
残念、正規表現と重複します。
スラッシュ2つ、とか、後はドットくらいしか思い付かないですね。__privatefunc()ならぎりぎり許せそうな気が。
「スラッシュ2つ」もなかなか面白い外見なのですが、これも(空の)正規表現と重複しますね。
__privatefunc()ですか。標準添付の範囲内だとRuby/Tkで使っているんですが、それくらいなら調整できるかもしれませんね。
ふと、_/privatefunc() もいいかな、と思いました。