AutoHotkeyで、処理関数を変数で渡して実行したい
朝は、ちょっと雲があったけれど、晴れで、昨日同様、夏を思わせる陽気。
ちょっとムシッとしていた。
AutoHotkeyを使っていて、ほぼ同じような処理をしているけれど、実行したい処理関数が違ったり、実行回数が違うので、関数の共有化が出来ないでいた。
ほぼ同じ処理の長目の関数が、複数存在していて、どうにかならないか、と思っていた。
AutoHotkeyで、処理関数を変数で渡して実行したい!
ということで、調べてみることにした。
まずは、AIに尋ねてみた。
ChatGPT、Copilot、Gemini、Perplexity AI、どれも、残念ながら、大外れ。
「Eval」「Call」「Func」「Run」「Exec」「%実行処理を代入した変数%」とか出してくれたけれど、どれもダメ。
他の言語だったら、Evalを使って実行出来たりするので、これかな、なんて思ったりもしたけれど。
ここまで大外れなのは、珍しい。
一つくらいは、それなりの回答をしてくれるAIがあるのに。
ネットで調べてみても、調べ方が悪いのか、事例が出てこない。
多分、ChatGPTが出したv1のコードだったと思うけれど、それを、v2に変換したものを何気に見ていた。
GitHub - mmikeww/AHK-v2-script-converter: AHK v1 -> v2 script converter
;v1
; 変数にSendコマンドを格納する
mySend := Func("Send")
; 実行するキーストロークを指定
keysToSend := "#s"
; 変数に格納したSendコマンドを実行する
%mySend%(keysToSend)
;v2
; 変数にSendコマンドを格納する
mySend := Send
; 実行するキーストロークを指定
keysToSend := "#s"
; 変数に格納したSendコマンドを実行する
%mySend%(keysToSend)
よーく見ると、一つ違っている。
v2の方は、ダブルコーテーションを使わないで、処理関数そのものを変数に代入している。
そのまま変数に代入なんて出来るの?と思いながら、試しに、「mySend(keysToSend)」で実行してみると...
ビンゴ!
なんと、v2では、特に何か関数をかまさなくても、そのままでいいようだ。
これが出来るなら、配列や2次元配列に入れても出来るかな?と思ってやってみたら、出来た!
以下、事例。
;変数の場合
myAction := Send
myValue := "#s"
myAction(myValue) ; → Send("#s")
;配列の場合
myArray := [SendText, "OKOK"]
myArray[1](myArray[2]) ;→ SendText("OKOK")
;2次元配列の場合
myArray := [[Send, "{F5}"], [Send, "{Tab 9}", SendText, "Happy", Send, "#s"], [Send, "{F2}"]]
myArray[2][3](myArray[2][4]) ;→ SendText("Happy")
矢印で、実際の処理関数を記述した。
事例なので、処理関数や値には、深い意味はない。
話はずれるけれど、AutoHotkeyって、配列を参照する時、「0」からではなく、「1」からなんだよね。
ほとんどのプログラミング言語では、「0」から参照するけれど、初心者の頃って、なんで?って思いがち。(笑)
でも、プログラミングを進めていくと、なるほどなぁ、と思うのだけれど、AutoHotkeyは、どういう訳か、「1」から参照するようになっている。
何か理由でもあるのだろうか?
初心者の疑問をそのまま体現してくれたのだろうか?(笑)
(AIに聞いてみたら、AutoHotkeyの前身の言語が、「1」から開始していたので、その流れのようだ。)
閑話休題。
と、こういう風にすれば、処理関数を変数に代入して、引き渡した先の関数で実行させることが出来るようになる。
あとは、プログラムの中でルールを設けて、Loopで回して引っ張り出せば、色んな処理関数を、実行回数にしばられることなく実行出来るようになる。
これに気付けたお陰で、関数の共有化が出来、管理がしやすくなったし、簡単に処理も増やすことが可能になった。
よかったよかった。
| 固定リンク
「パソコン・インターネット」カテゴリの記事
- 定例のアップデート(2024.11.28)
- 今日はどうだったか(2024.11.22)
- 何かが降ってきた(2024.11.21)
- 画面内の文字をテキスト化(2024.11.19)
- 使われないデータ(2024.11.16)
コメント