このブログの更新は Twitterアカウント @m_hiyama で通知されます。
Follow @m_hiyama

メールでのご連絡は hiyama{at}chimaira{dot}org まで。

はじめてのメールはスパムと判定されることがあります。最初は、信頼されているドメインから差し障りのない文面を送っていただけると、スパムと判定されにくいと思います。

参照用 記事

仕様の話(2):呼び出しからメッセージへ

条件PやQを書くには副作用のない関数(のようなメソッド)が必要です。条件の評価のときに副作用があると、話がとんでもなくややこしくなります。また、条件評価で例外が生じたりするのも望ましくないので、副作用がなくエラーしない関数的メソッドが欲しいわけで、そういうメソッドはアクセッサ、オブザーバー、クエリーなどと呼んだりします。

一方、実行部のところには、メソッド呼び出しか単純代入文(var = method();)を並べるだけにします。これも話をややこしくしないためです。実行部に並べるメソッドのほうは、アクション、コマンド、ミューテータなどと呼びます。(ここまでの話は、何度かしたことがあります。)

さて、最近、実行部のところをもう少し抽象化したいと思っています。メソッド呼び出しだけでなくて、たとえば、HTTP GET/POSTでやってきたリクエスト+パラメータとかも同じ枠組みで考えたいのですね。そこで、実行部のところには、外部からやって来たメッセージ(あるいはシグナル)の列を書くのだ、と考えます。メソッド呼び出しもメッセージだと思えばいいので、言葉使いとそれに伴う雰囲気が変わるだけ、とも言えます(が、その効果は無視できないものがあります。)

メッセージとメッセージが引き起こす内部効果は別物なので、MESSAGE causes EFFECTのような書き方をしましょう。さらに、EFFECTは状態遷移と外部へのメッセージ(イベントと言ったほうがお馴染み?)発信に分けて、例えば、次のように書きます(別に記述構文はどうでもいいのですが)。


on (value() >= 0) receiving {inc();}
results (value() > 0)
emits {valueChanged();}

これは、「(value() >= 0)の状態で、{inc();}というメッセージを受け取ると、(value() > 0)の状態になり、{valueChanged();}というメッセージ(イベント)が発行される」ということです。

(続く)