AutoHotKey(2)
この3日ほど、AutoHotKey を調べている。
そしてぼくは AutoHotKey をプログラミング言語として評価してみたのだ。
その内容の詳細については別の機会を予定しているが、今回はその概要と感想などを書いてみようと思う。
なお、このブログで AutoHotKey といえばとくに断りがなければ、それは AutoHotKey_L を指すものとする。
さて、AutoHotKey は、果たしてぼくの求めるプログラミング言語要件を満たし、GUI が簡単に書けるのだろうか。
① GUI が簡単に記述できる
② 文字列操作が充実している
③ ヒアドキュメントが可能
④ 連想配列がある
⑤ 正規表現がある
⑥ Unicode 対応
⑦ 実行フィル(.exe)が作成可能
AutoHotKey はこれらが可能だ。そのうえ、GUI は、ぼくの知る言語の中で最も簡単に記述できるものの一つだ。文字列関数も十分なものが揃っている。ヒアドキュメントも強力なものだ(改善の余地があると思うが)。
連想配列は配列と共に Object として定義される。操作性も十分なものだ。正規表現は Perl5 互換で不満のないものだ。Unicode 対応は、内部が UTF-16(Windows と同じ)でソースファイルは UTF-8 で読み込む(他のエンコーディングも可能)。
実行ファイル(.exe)を作るのはワンタッチといえるほど実に簡単。ただし、スクリプトファイルをバインドしているだけなので中身をエディタで見ることができる。また、パスワードを与えて暗号化する仕様が以下のとおり存在する。
Ahk2exe.exe /in <infile.ahk> [/out <outfile.exe>][/icon <iconfile.ico>][/pass <passphrase>]
しかし、以下の画像のとおりサポートしていないとのメッセージだ。
なお、AutoHotKey は最新のソースコード(C++)が GPL で提供されている。
https://github.com/Lexikos/AutoHotkey_L
ぼくも最新版のソースコードを一式ダウンロードしておいた。
さて、全体的な印象を述べたい。
AutoHotKey は、例えばフォントの設定なども詳細におこなえ心強いが、その詳細な指定が反映しない場合もあり、そういった面での完成度に多少の不安を感じる。
また、言語仕様における構文構造なども不完全な部分があり、B級感を避けられない部分もあるが、コツをつかんでしまえば実用上は問題ない。
ぼくは Mery 用の AutoHotKey 構文ファイル(未完成&不満あり)を作って、AutoHotKey のプログラムの切れ端をいろいろ作って実験しているところだ。AutoHotKey の構文ファイルは wxBasic の構文ファイルよりも先に完成しそうだ。
こんな感じね。(上は全体の一部)
あと少し基本を押さえれば、その後は、リファレンスを見ながらプログラム開発が始められそうな段階まで来ることができたと思う。まぁ、いうなら AutoHotKey がそれほど簡単だということだね。
AutoHotKey を使えば、GUI に悩まされることもなく、思い通りのプログラムを作ることができる。これは当然のことのようで、プログラミング言語が GUI を扱うようになってから何十年もの間、実現しなかったことだ。
「簡単なことを簡単に」、それができて当然だと思い続けてきたが、AutoHotKey でプログラムを書いているとそれを感じるんだ。ずいぶん気にいったようだね。うん、本来なら wxBasic のほうがよいはずだと思うけど、開発が停止しているからね。それに、最新のソースコードが公開されていないようだしね。
正規表現なども wxWidgets で実現しているようだけど、wxBasic 2.8 でラップしていないようだしね。でも、次の版でもリリースされれば一気に解決するかも。話しを AutoHotKey に戻そう。
これは AutoHotKey を一番最初に見たときから気づいていたことだけど、AutoIt の GUI よりも好ましいと感じていたのだ。ただし、AutoIt は Python のように信用でき AutoHotKey は初期の Perl のような感じなのかも知れない。危なっかしいところもあるけど、楽しくておもしろい。
最後に AutoHotKey の特徴的な仕様を一つ具体的に取りあげたいと思う。
AutoHotKey には = と := という2つの代入がある。
まず、最初にこれはなんだろう、どうちがうんだろうって思うんじゃないだろうか。
a = あああ
b := あああ
この2つはどう違う?
この2つの違いがよく理解できればそれだけで AutoHotKey はおもしろくなると思う。
a = あああ は、変数 a に「あああ」がストレートに代入される。ただそれだけだ。
b := あああ は、変数 b に「あああ」を評価した結果が代入される。つまり「あああ」の中身を調べてそれを代入する。中身は空だから b には空が代入される。
じゃぁ、こうしてみよう。
あああ := "いいい"
a = あああ
b := あああ
あああ := "いいい" は、:= だから「"いいい"」が評価され、文字列「いいい」となりそれが左辺の変数「あああ」に代入される。
a = あああ は、前と変わらずストレートに「あああ」が代入される。
b := あああ は「あああ」が評価され、その中身「いいい」が b に代入される。
どうなるか試してみよう。
; -----------------------------
; 代入テストプログラム
; -----------------------------
あああ := "いいい"
a = あああ
b := あああ
MsgBox a ;=> a
MsgBox b ;=> b
MsgBox %a% ;=> あああ
MsgBox %b% ;=> いいい
あああ := "ううう"
b := あああ
MsgBox % b ;=> ううう
MsgBox % "a= " a " b= " b ;①=> a= あああ b= ううう
MsgBox a= %a% b= %b% ;②=> a= あああ b= ううう
; -----------------------
まず、;(セミコロン)はコメントの開始を意味する。; 以降、行末までがコメントとなる。
MsgBox a は「a」をストレートに表示する。
MsgBox %a% は「%a%」を評価し、その結果、変数「a」の中身を表示する。
変数がいくつもある場合、一々すべてを % と % で囲うのは面倒なので、MsgBox % のあとに半角スペースを1つ空けて評価する内容を並べることができる。
① と ② は同じ結果となる異なる書き方だ。
この「代入テストプログラム」をよく見て理解できれば AutoHotKey の正門をくぐれたといえると思う。なお、今回の代入に関する説明は便宜上の表現を用いた。また、一つだけ説明しなかったこともある。ご了承いただきたい。
今回はこういう細かいことを書く予定ではなかったが、ついつい書いてしまった。