イベントとは

イベントとは、例えば「クリックした時」のように、GUI部品が操作されるなど何らかの現象のことで、またなでしこでは、そのときに特定のプログラムを実行させるために用いる記法も総じてイベントと呼びます。

ちなみに、ユーザがアプリケーションのGUI部品を操作してイベントを起こし、プログラムがそのイベントに対応した処理をする、という形で要求に応える形式を、イベントドリブン方式と言います。

イベント
イベントラベルとはラベル
これについて
 # 一行で書く場合は、"〜"をつける
 クリックされた時は〜文字色は赤色
 # ブロックで書く場合は、インデントする
 ダブルクリックされた時は
  文字色は黒色
 

イベント変数とは

GUI部品のイベントが起きた時に特定の処理をさせるのには、上のサンプルのように書くのでした。ところで、マニュアルを見ると、同じようなイベントの記法を使えるのはGUI部品に限らないことが分かります。

マニュアルより抜粋(一部変更):イベントの動作のテストコード
テストイベントとは変数
# イベントを設定する
テストイベントは〜テストを表示。
テストとは整数=50
# イベントを呼び出す
テストイベント。
 

実はここは少し違和感を持ってもらいたい所です。最初に説明したように、GUI部品が操作されるなどの現象をイベントと呼ぶのに、上のサンプルでは、そのような現象はおろか、GUI部品も存在していません。つまり、トリガーになるGUI部品のイベントなどが無くても、イベント記法で記述された処理を呼び出せるということです。そこで、ややこしいので、トリガーになるイベントと区別するために、処理内容を入れるイベント記法の方を「イベント変数」と呼ぼうというわけです。

なお、イベント変数は公式名称ではない点に注意して下さい。ただ、掲示板などでもこの単語を幾度か使っていますし、直観的な名前なので大体通じるでしょう。

イベント変数の特徴

イベント変数の最大の特徴は、変数であることです。上の例でもテストイベントを変数として宣言しています。では、変数であるイベント変数は、関数(ユーザ定義命令)などとどう違うのでしょうか。

  • イベント変数は処理内容を書き換えられるが、関数では無理
  • 配列・ハッシュとしてイベント変数を利用できる
  • ただし、関数は引数を定義できるが、イベント変数では無理

それでは、イベント変数の利点を使ったTipsを見ていきませう。

変数であることを利用するTips

プログラムを組んでいる途中のテスト段階では、実行状態を確認するためにウェイトを入れたり、デバッグしたりすることが多いですね。それで色んな所に1秒待つを入れていたものの、完成したプログラムでは不要になったり0.01秒に変えたくなります。そんなときに、イベント変数を使うと便利です。

ウェイト処理
ウェイトとは数値=0.01
ウェイト処理とは変数
もしウェイト>0ならば
 ウェイト処理は〜(ウェイト)秒待つ

`始め`と表示
100回、ウェイト処理
`終わり`と表示
 

ウェイトが必要な所にウェイト処理を入れます。もしウェイトを変えて試したいなら、ウェイトの値を変えるだけですし、ウェイトを取り去りたい場合はウェイトを0に設定するだけです。ちなみにここが重要なんですが、0秒待たせようとしても実際には0.01秒程の時間がかかってしまいます。つまり、本当の意味でウェイトを取り去りたいならば、秒待つ命令を実行させない必要があり、そこでイベント変数を使えば、処理内容を真の意味で「無」にできるわけです。

本当はウェイトが0の場合でも、空の変数への参照が発生するため、全く何の処理もしていないわけではないですが、試してみれば分かるように、変数の参照なんて本当に0秒くらいしかかかりません。

配列・ハッシュとして利用するTips

ある変数の値が0ならこの処理、1ならあの処理……のような場合、普通は「もし〜ならば」「〜で条件分岐」のどちらかを使いますが、実はこれをイベント変数で書くことができるのです。

式計算(四則演算)
Aとは数値=1
Bとは数値=2
Cとは数値

演算とはハッシュ
演算@`+`は〜_=A+B
演算@`-`は〜_=A-B
演算@`*`は〜_=A*B
演算@`/`は〜_=A/B
演算子とは配列=`+-*/`を文字列分解

777で乱数初期化
開始時間=システム時間
10万回
 ※1 ハッシュのイベント変数
 C=演算@演算子[4の乱数]
 ※2 ナデシコ(EVAL)する
 #C=EVAL(A&演算子[4の乱数]&B)
 ※3 条件分岐構文
 /*
 演算子[4の乱数]で条件分岐
  `+`ならばC=A+B
  `-`ならばC=A-B
  `*`ならばC=A*B
  `/`ならばC=A/B
 # */
「経過時間: {システム時間-開始時間} [msec]」と表示
 

上のサンプルは、変数AとBに対してひたすら四則演算を行い、その速度を調べるプログラムです。ハッシュのイベント変数を使う場合、ナデシコする場合、条件分岐する場合の3通りを用意していますが、演算子[4の乱数]は3通りすべてで共通して使われているので、違いは実質上どのように四則演算するかの部分だけということになります。結果、四則演算させるにはハッシュのイベント変数が最も速いと分かります。

これは、条件分岐では演算子の一致不一致の判断に時間がかかるのに対し、ハッシュ変数では演算子をキーとして目的のイベント変数に高速でアクセスできるからです(かなり大雑把な説明ですが)。つまり、速いのはむしろハッシュ変数の方で、それをイベント変数として利用したというわけです。「ナデシコする」が遅いのは当然のことで、与えられた文字列をなでしこのプログラム文として解析してから評価する(=evaluate)わけですから、いくら単純な式でも時間がかかってしまいます。

とは言っても、10万回のループでやっと秒単位の差が現れる訳ですから、どの方法も実は大差なくて、その差なんてマイクロ秒単位のものでしかないということです。まぁ実際気にする程のことでもないでしょう。