トップ 追記

SRU開発日記


2010年05月13日 ifメソッド

_ ifをメソッドとして宣言する。

Smalltalkではifはメソッドの形を取る。
例えば、Rubyで言うところの、

if(a%3==0)
  puts "fizz"
end

は、Smalltalkでは、

(a%3==0) ifTrue: [ "fizz" printNl ]

のように書く。
このようにifがメソッドの形を取る場合、ifが上書きできるようにする事も可能だと思われた。

一方で、SmalltalkのifはRuby(やその他の言語)に慣れている目には特異な物のように見える。
慣れれば良いのだが、この文に慣れるのは難しいと思われた。

メソッド定義による構文と、書きやすい文の書き方を両立するにはどうしたら良いだろうか?


2010年05月12日 ifとは何か?

_ そもそもこの問題は「if文とは何か?」という問題が源流にあると俺は考えた。

もちろん、booleanな値、trueとかfalseに関しては、どのような振舞いをすべきかは、一般的な合意が取れている。しかし、0や1や-1というような値に関してif文がどのような動きをすべきかは各言語によっても違い、合意が取れていないように感じる。そして、その延長線上に""(空文字列)に対する振舞いがある。
では、このようにbooleanでない値に対してどうするのが一番良いのだろうか?俺はそれはカスタマイズ可能であるのが良いと考えた。では、カスタマイズ可能にするのにどのような手段があるだろうか?その時思いついたのは主に2つの方法だ。
まず、boolean型でない物はboolean型に変換して扱うという方法だ。具体的には、キャスト演算子をオーバーライドして実装する事も考えられるし、to_booleanメソッドを実装してそれを使う事も考えられる。空文字列をboolean型にキャストした時に何を返すかをカスタマイズすれば目的を達成できる。
また、別な方法としてifを文で実装しないという方法がある。Smalltalkでは、ifはメソッドのような形をしている。trueオブジェクトのifTrueメソッドを引数に関数を渡して呼び出すと、引数に渡した関数を実行してくれる(ようにみえる)。falseオブジェクトに対しては逆に引数の関数を実行しない。この方法でも、空文字列のifTrueメソッドを再定義する事で目的を達成できる。
5年前の俺は後者のifメソッドを使う方がよりシンプルで良いアイディアに思えた。

そこでまず、Smalltalkで実際にプログラムを書く事を試してみた。


2010年05月11日 SRUとは何か?

_ SRUとは何か?

Smalltalk + Ruby = SRU

_ 2005年のある日の事


もうURLは失念してしまった。
その日、私が見つけた記事にはRuby on railsのObject型にempty? というメソッドを追加するという物だった。
その記事によると、Ruby本体に似た変更をしようという話は何度も持ち挙がったが、筋が悪いと却下され続けたので、Railsに統合されたという話だった。

その辺の議論はもう残ってないけど、このパッチをRailsに入れたWhy氏のBlogに詳しい。
http://web.archive.org/web/20050307054947/http://redhanded.hobix.com/inspect/objectBlank.html

その時の俺にはnilにメソッドを追加するのは筋が悪いという事は理解できるぐらい分別があったけど、高校生まで使っていたPerlが0や空文字列を偽としていたため、それらが特にWebの世界には便利だという事も強く思った。

http://d.hatena.ne.jp/kwatch/20100131/1264955407
この記事は今年になってから書かれた記事だけど、PHP畑の人から見てもその時俺が感じた事と同じ事が感じられるみたいだ。

この2つの矛盾する問題を解決するために俺はある方法を思いついた。


2010年05月10日

_ てすとてつと

てつとでつ

_ そろそろ動くよ

SRUの開発日記を書きたい。
あとドキュメント。

どうしてこういう風な実装にしたか、とか結構忘れがちなので。

あきたら最終的にはメインの日記と統合する予定。