魔術師をめざして

魔術師を目指して、相場・数学・プログラム言語を研究しています。

AutoHotKey(5)

このところぼくは AutoHotKey のテストコードを山ほど書いたのだ。

f:id:fxrobot:20131223040045j:plain

 実際にテストコードを書いて動かしてみると、多くのことがわかった。やはり、リファレンスだけを見て理解したと思っていても勘違いがあるものだ。

以前の記事でも書いたが、次の①~⑤の If 文の条件部はすべて同じ働きをする。

f:id:fxrobot:20131223024028p:plain

条件部の A = %B% のような部分を「比較式」と呼ぶことにすれば、比較式は「変数◎値」という形式以外は許されないのだ。
◎は、 = 、 <> 、 > 、 >= 、 < 、 <=  のいずれかである。

 しかし、If (A = B) のようにカッコで囲えば、そのなかには (A = 1 && B = 2) のような任意の式「任意式」を書くことができる。このときの If (A = B) の B は値ではなく変数として評価される。つまり If A = %B% のように働くのである。

これは、普通のプログラミング言語では比較式を「Key == 'a'」などと書くところを AutoHotKey では「Key = a」というように書き始めたのが由来なのではないかと思う。この場合 a の部分に来るのは変数ではなく直接的な値ということだ。

f:id:fxrobot:20131223022707j:plain

左のコードを見てほしい。

「a = あ」は、文字通り変数 a に「あ」を入れている。
「b = "あ"」は変数 b に「あ」ではなく文字列「"あ"」を入れているのだ。

「If a = あ」は成立している。このときもし「If (a = あ)」と書けば、変数 a の内容と変数 あ の内容を比較することになる。

「If (a = "あ")」は普通のプログラミング言語におけるような比較となる。a の内容は「あ」だから成立している。

「If b = "あ"」はおもしろい比較だ。b の内容は文字列「"あ"」だから「"あ"」=「”あ”」となり成立している。

 なお、ブロック If 文を書くときには注意が必要。

If 比較式
{
    ブロック
}

という形が基本であり、

If 比較式 {
    ブロック
}

というようには書けない。ただし、If (任意式) というふうにカッコで囲った場合は、

If (任意式) {
    ブロック
}

のように書くとができる。この辺りをしっかり押さえていれば、AutoHotKey の全体も容易に理解できすぐに書くこともできるようになると思う。

 f:id:fxrobot:20131223022936j:plainWhile における条件部は任意式であるため、

While 任意式 {
     ブロック
}

というような書き方が可能となる。任意式をカッコで囲っても問題はない。

なお、i := 1 と m := 2 は i = 1 と m = 2 と書いても問題はない。

f:id:fxrobot:20131223022952j:plain

Loop における条件部も任意式であるため、While とどうように、

Loop {
    ブロック
} Until 任意式

という書き方ができる。

 

AutoHotKey に対し、最初の時点で違和感を感じて敬遠してしまう人はオペレーションの直後からカンマがあること(改善された)、= と := という 2つの代入、% の使い方、If 文の比較式と任意式、などなど、普通のプログラミング言語の習慣とはちょっと違う形式に戸惑うのだろう。

しかし、今回、ここに書いたことに注意を向ければ、直ぐに全体がスッキリしてくると思う。

 さて、これであと書くことといえば、仕様の詳細部分になるのだが、確かにリファレンスがあっても書くべきことは多い。でも、それを書いたとして読んで助かる人というのがいるのだろうか。自己満足でもいいが、その辺りのことはちょっと考えてみようと思う。