From: Hideto ISHIBASHI <hideto-i / rr.iij4u.or.jp>
Subject: [ruby-list:22266] Re: StateGraph: state machine interpreter
Date: Thu, 4 May 2000 22:06:17 +0900

> > tra = Transition.new(str, sta, :activated) { print "activated\n" }
> > じゃなくて
> > tra = Transition.new(str, sta, :activated, proc { print "activated\n"})
> > ですか?
> 
> 最初は下のほうだったんですが、イテレータブロックを使うように変更しました。
> 同じイベントドリブン・フレームワークの、TkやGtkにあわせました。
> 直感的にわかりやすいかな、と思って。

なるほど。gtkに合せていただけるなら

tra = Transition.new(str, sta)
tra.set_event(:activate) do
  print "activated\n"
end

の方が趣味に合うかも(^^;

> > あと、めんどくさがりな自分のために‥
> > 
> > module StateGraph
> >   class StateMachine
> >     def add(arg)
> ・・・
> 
> これは便利ですね。でも、いまのところ取り入れるつもりはありません。
> 上のように、御自分で追加して下さいませ m(__)m
> # せっかく状態遷移図を書くのに、これでは元も子もないので・・・ (^^;;

ありゃ、残念。
# 裏技的に入れておいてもらえると助かるのですが‥(笑)

> > # StateGraph::StateMachine#addをしなくても動くのはなぜ?
> 
> なぜでしょう (^^;
> 少くとも、全く同じ動作になるとは考えられないのですが・・・
> # sm.currentすると、つねに"ready"(str)になりませんか?

でも、sm.currentで "ready"が帰るなら、killを呼んだ時に Gtk.main_quitが呼
ばれるはずですよね?

>  * StateMachine#eventは、成功ならtrue、失敗ならfalseを返す
>  -> ブロック(StateMachine#action)の返り値を得ることができない
>  -> しかし普通は返り値は必要ない
>     イベントの返り値を使うような設計は、そもそも間違っている
> 
>  * 例外(UnexpectedEventOccured)を上げる
>  -> いちいち例外が上がるのは面倒臭い
>  -> 「状態遷移図の誤り」なのだから、それ以降の動作は全くの想定外だ
>     例外を上げるべき(ただし、ほとんどの場合、補足しても意味がない)
>     積極的に支持できないが、いちおうブロックの返り値も使える

   * state objectが default handlerを持つ
   -> setしないと何も言わない
   -> 例外を一々補足する必要がない

なんて、どうでしょう?  state objectが 10個 state machineにあったら 90も
の例外の可能性があるわけですよね? #10x9で
さすがにそれだけ補足してまわるのはちょっとやなので‥。

sta = State.new("active)
sta.set_self_transition do # set_default_transitionでも良いかも
  :
end

とすると、

tra = Transition.new(sta, sta, :default, proc)
と同じになるとか。起った eventが定義されてなかった場合にこいつが呼ばれる。
--
           yashi