前回の復習
當間が出してくれたモデルを少し見てみよう。
Tcl/Tk on GCL を使ってみよう。他のXLISPでも、それぞれグラフィック インタフェースがはずはずだ。グラフィクスの部分とオブジェクト指向的に 接続することにグラフィカルインタフェースに依存しないプログラムの 部分を増やすことができる。 Phigs も使えるようだし、Phigsはオブジェクト 指向的な3D Graphicsだけど、少し複雑なので、ここではTcl/Tkを最小限度 使うことにしよう。
% gcl (in-package "TK") (tkconnect) (load "/usr/open/lib/gcl-2.2/gcl-tk/demos/widget.lisp")とすると、 widget (Window gadget ウィジェット)と呼ばれるX-windowの 画面要素の例題が動く。例えば、canvas の2D plot などが参考になるはず だ。この部分のソースを調べながら使うことにしよう。
(setf w '.w) (tkconnect) (toplevel w) (wm :minsize w 300 300) (setf c (conc w '.c)) (canvas c :width 300 :height 300) (pack c)などとすればグラフィックスを書くキャンバスができることが分かる。 canvas の中のオブジェクトは、以下のようにして作ったり動かしたり することができる。このあたりはEmacsからinfoでみてみるしかない。
(funcall c :create "oval" 20 20 26 26 :width 1 :outline "black" :tag "a") (funcall c :create "oval" 20 20 26 26 :width 1 :outline "black" :tag "b") (funcall c :create "oval" 20 20 26 26 :width 1 :outline "black" :tag "c") (funcall c :move "a" 10 10) (funcall c :move "b" 30 40)ここでオブジェクトについているタグをオブジェクトIDとして使うことが できる。
(defun step-one (tag) (setf time (+ time 0.1)) )) (defun step-one () (setf time (+ time 0.1)) (funcall c :move "a" (* 10 (sin time)) (* 10 (cos time))) (funcall c :move "b" (* 10 (sin time)) (* 10 (cos time))) (funcall c :move "c" (* 10 (sin time)) (* 10 (cos time))) )とすればオブジェクトが動くのが見えるはずだ。このfuncallがオブジェクト 指向のメッセージ送信の役割を果たしている。しかし、Tcl/Tkではキャンバス の中のグラフィックスを動かすには、canvasにメッセージを送らないと いけない。
これを
(loop (step-one))などとすることによりシミュレーションをおこなうことができる。もし、表示が とびとびになるようなら、極端に遅くなるが、
(loop (step-one)(update))とすると一ステップごとに表示を変えてから動作する。ここらは、シミュレーションの 速度にあわせて調整する必要がある。
もちろん、このような方法ではオブジェクト指向ということはできない。しかし、 一般的に、オブジェクト指向プログラミングでは、オブジェクトは独立に動作 するという仮定で設計するが、プログラミング言語自身は逐次型の言語である のが普通だろう。すると、なんらかのスケジューラが必要になる。
ここでは実験装置がそれを担当することにしよう。
さらに分子の現在の状態をグラフィックスに反映させなければならない。
同時にユーザからの入力を受けつける必要もある。例えば、停止ボタン や、分子の位置の編集などがユーザの入力として考えられる。これらは、 event という形で入力される。
これらをまとめる一つの方法としてMVC(Model View Controller)という仕組みが 考えられる。これはSmallTalk-80を開発した時に使われた技術である。
もちろん実験装置と分子の移動を処理するオブジェクトを分離しても良い。
これらの変更の主体は実験装置だ。これはモデルとしては少しおかしいが 実装としては、こんなものだろう。したがって実験装置はループをもち、 順々に分子を動かすという動作をする。この動作は、コントローラからの メッセージによって変更される。
これらの変更を表示に反映するのがコントローラである。コントー ラがビューとの唯一のインタフェースであるように作ると、GUIと シミュレーションを奇麗にわけることができる。
コントローラの動作は以下の二つが考えられる。
コントローラはさらに、ユーザからの入力を受け取る。このイベントは 実験装置のループと並列に生じる。これを取り扱うのは、どうすれば良い だろうか?
メールにより提出する方法
メールで図を送るには二つの方法がある。
% gzip < file.eps | uuencode file.eps.gz > uuここでfile.eps.gz が相手に伝わるファイル名である。相手が分かるような 名前を付けよう。 このuuというファイルをメールに入れれば良い。
% mailto his-e-mail@his-domain ~*~* を打つと、
Please choose which kind of data you wish to insert: 0: A raw file, possibly binary, of no particular data type. 1: Raw data from a file, with you specifying the content-type by hand.と聞いてくるので、1 と答える。ここで、
Enter your choice as a number from 0 to 1: 1 If you want to include non-textual data from a file, enter the file name. If not, just press ENTER (RETURN):と聞いてくるので file.eps や自分で用意したファイルを入れる。すると、
Enter the MIME Content-type value for the data from file file.eps (type '?' for a list of locally-valid content-types):と聞いてくるので、