2009/05/10

[Scheme][.NET]IronSchemeでForm表示

WS0731

参考にしたのはこちら

参考というよりは写経ですが・・・

おー、フォームが表示されました!

 

コードはこちら。

(import (rnrs) (ironscheme clr))

 

(clr-reference System.Windows.Forms)
(clr-using system.windows.forms)

 

(define (make-form) (clr-new form))

 

(define (form-show form) (clr-call form show form))

 

(define (application-run form)
  (clr-static-call application run (clr-cast form form)))

 

(define (form-click-add! form proc)
  (clr-event-add! form click form proc))

 

(define (application-exit)
  (clr-static-call application exit))

 

(define (main)
  (define f (make-form))
  (form-click-add! f (lambda (s a) (application-exit)))
  (application-run f))

 

(main)

 

 

コードの方を追いかけてみます。

(import (rnrs) (ironscheme clr))

モジュール(?)をインポートしてますね。ここの意味が未だによくわからない。

 

(clr-reference System.Windows.Forms)
(clr-using system.windows.forms)

ここでは恐らく、1行目でSystem.Windows.FormsのDLLを参照しているのかな。2行目で使用する名前空間を宣言しているのだと思われます。C#の「using System.Windows.Forms;」と同じ。

 

(define (make-form) (clr-new form))

ここではSystem.Windows.Forms.Formクラスのインスタンスを生成しているんだろうと思います。

new Form();みたいな。

でもこれはmake-form手続きなわけですから・・・。Formクラスのインスタンスを生成するための手続き、ということでなんとなくFactoryMethod的ですね。

 

追記:

うーん、ここはもしやFormクラスのインスタンスではなくmake-form手続きなどの、手続きがわたってくるのかもしれない。

 

(define (form-show form) (clr-call form show form))

form-show手続き。formを引数にとってますね。きっと先ほどのmake-form手続きで生成されたFormクラスのインスタンスを受け取るのでしょう。

clr-call手続きにform show formの順に引数を与えています。formを2回渡してるのはどんな意味なんでしょうか。formインスタンスのshowメソッドにformインスタンスを渡しているようなことをイメージします。

clr-callはクラスのインスタンスメソッドを呼び出すのかな?確かclr-static-call手続きがクラスのインスタンス静的なメソッドを呼び出す手続きなので恐らくそうなのでしょう。

 

(define (application-run form) (clr-static-call application run (clr-cast form form)))

さてこちらはapplication-run手続きにformインスタンスを渡しているようです。

件のclr-static-call手続きが出てきました。これはクラスの静的なメソッドを呼び出す手続きのようだというお話でした。

applicationクラスのrunという静的なメソッドを呼び出しているのだと思われます。C#では[STAThread] 属性のついたMainメソッドでApplication.Runされますね。IronSchemeでも同じくapplicationクラスの静的なメソッドrunにformクラスのインスタンスを渡しているようですが・・・、clr-castがかまされています。どうみても型変換っぽいです。

C#でいう(Form)form;といったところでしょう。Schemeは動的な型付けなので型宣言とうはありませんが、こういったタイミングで方変換が必要になるのはなぜなのでしょうか。

 

(define (form-click-add! form proc) (clr-event-add! form click form proc))

ここではどうもform-clickイベントを追加しているようですね。C#では+=でデリゲートが追加されるあれですね。

しかし、ここでのclr-event-add!手続きの引数であるform click form procが少し良くわかりません。

formにclickイベントを追加、formにprocを追加・・・ですか。なるほど、formのクリックイベントにproc手続きを関連付けているんですね。clr-event-add!手続きは!がついてるので破壊的なメソッドなんでしょうね。Rubyなんかも!がついてるメソッドは破壊的ですね。イベントを"追加"するわけですから必ず副作用が発生しますよね。

 

(define (application-exit) (clr-static-call application exit))

ここではapplication-exitという手続きを定義していますね。

clr-static-call手続きでapplicationクラスのexitという静的なメソッドを呼び出しているようです。見たまんまアプリケーションの終了ですね。C#などでは明示的にexitなんて書かないと思うんですがどうでしたっけ。もちろんC#でもApplicationクラスにExitというメソッドはあります。(同じ.NET Frameworkだから当たり前ですが)

 

(define (main) (define f (make-form)) (form-click-add! f (lambda (s a) (application-exit))) (application-run f))

ここでようやくmain手続きが定義されています。

make-form(formクラスのインスタンスを生成する手続き)をfという名前に束縛しています。

form-click-add!手続きにformを生成する手続きであるmake-form手続き(f)と無名関数を渡しています。無名関数ではsとa(C#でいうsenderとEventArgs eでしょう)を受け取って(受け取っただけで使わずに)、application-exit手続きを実行しています。つまりフォームをクリックしたらアプリケーションを終了するイベントを追加しています。

最後にapplicattion-run手続きにformインスタンスを生成するmake-form手続きを渡しています。

 

・・・・!?

 

ちょっと待った。fにはmake-form手続きが束縛されています・・・。つまりfは呼び出されるたびにformインスタンスを生成しそうなものです・・・。つまりapplication-runされるformとform-click-add!されるフォームが別のformインスタンスになりそうな気が・・・。

取り合えず置いといて。

 

最後に

(main)

でmain手続きが呼び出されています。

 

うーん。謎が一つ残った。何か勘違いしているかな・・・(?)

ところでIronSchemeの情報はどこに行けば手に入るのでしょうか・・・。IDEでの開発の仕方や名前空間や各手続き、定義済みの手続きなどの一覧が見たいのですが・・・・・

 

 

0 件のコメント:

コメントを投稿