- Smalltalk総合 Squeak Pharo
221 :デフォルトの名無しさん[sage]:2015/02/11(水) 06:47:42.77 ID:Ids2Eeke - >>220
本当に実装量程度の機能かもしれないし、 からくりがある場合もある。 具体的には、どのクラス?(できれば処理系も)
|
- Smalltalk総合 Squeak Pharo
228 :デフォルトの名無しさん[sage]:2015/02/11(水) 20:49:58.18 ID:Ids2Eeke - >>227
> Kernel-Objects BooleanのifTrueが > インライン展開されてるから書かれてない もし Boolean >> ifTrue: のことなら、処理が書かれていないのではなくて、 self subclassResponsibility 、つまりサブクラスでオーバーライドせよというコードで指示がされているだけで、 実際にそれに従い、True >> ifTrue: 、False >> ifTrue: の方に(普段はインライン展開されてしまうので 無視されますが、明示的にコールしてやりさえすれば)動くコードが書かれています。 たとえば True >> ifTrue: メソッドは、こんな風に明示的にコールできます。 true perform: #ifTrue: with: [3] "=> 3 " True >> #ifTrue: valueWithReceiver: true arguments: {[4]} "=> 4 " 他のインラインされるメソッド群は MessageNode class >> initialize で確認できますが、 (Kernel-Objects MessageNode の class 側に切り替えてでてくる initialize メソッド定義内) whileTrue: を除いては、前述の ifTrue: 同様、明示的にコールしても 動くコードで書かれているので短い記述になっていることにはあまり寄与していないように思います。 そういう意味では Float >> + のように <primitive: 41> などといった記述があるメソッドは 実処理が仮想マシンやプラグインにあるので、具体的なソースは書かれていないことになります。 これはちょっとコード量の削減に寄与しているかもしれません。 余談ですが、<primitive: 41> などの後に書かれているのは、仮想マシンなどに記述された関数のコールが 失敗した場合に実行されるフォールバックコードで、これは Smalltak で記述されています。 個人的には Smalltalk のコードが短く感じるのは、出来ることの印象に反して 実質的にはコード量なりの機能しか実装されていないからだと思います。 C++ などで書かれたものと厳密に(たとえば数理学的に)同等の機能を記述しようと思ったら それなりのコード量になるのではないでしょうか。
|
- Smalltalk総合 Squeak Pharo
230 :デフォルトの名無しさん[sage]:2015/02/11(水) 22:52:16.50 ID:Ids2Eeke - 正直、どうしてこんないい加減なものが動くのか、私もかねてから不思議に思っています。^^;
まあそこが興味の対象であり、数理学的に論じると味わいのなくなる面白いところでもあるわけですが。 手抜きのことも含めて、もちろん他にも短く書くための工夫らしきことはあるので もう少し、システムの中身を覗いてみてください。 設計の参考ということでは、しばらくいじってみて興味をひかれた機能を その動作から実装を予想し、実際にそう実装されているか確認してみると 「その手があったか!」というような発見もあって楽しみながら学べると思います。 (あるいは時間の無駄で終わるかもしれませんが…) 個人的によくお薦めするところでは、print it(式を選択して右クリックメニューなどから print it すると返値が挿入される機構)がどのように実装されているか、コンパイラの 実装やその動作などと併せて予想・確認してみるのは比較的よい題材かと思います。
|