この文書は、コードよりも説明に重点を置いて、AutoHotkeyで使用されるいくつかの一般的な概念と慣習をカバーしています。読者はスクリプトやプログラミングの予備知識を持っていることは想定されていませんが、新しい用語を学ぶ準備はしておく必要があります。
構文に関するより具体的な詳細については、「スクリプト言語」を参照してください。
目次
値
値とは、単にプログラム内の情報の一部です。例えば、送信するキーや実行するプログラムの名前、ホットキーが押された回数、アクティブにするウィンドウのタイトルなど、プログラムまたはスクリプト内で何らかの意味を持つものです。
AutoHotkeyは、これらのタイプの値をサポートしています。
- 文字列(テキスト)
- 数字(整数、浮動小数点数)
- 対象物
- Type関数は、値の型を決定するために使用することができます。
その他、関連する概念もあります。
- boolean
- nothing
文字列
文字列は単なるテキストです。各文字列は実際には文字の並びや列であるが、1つの実体として扱うことができる。文字列の長さは、シーケンス内の文字の数であり、文字列内の文字の位置は、単にその文字の連番です。AutoHotkeyの慣例では、最初の文字が位置1になります。
数値文字列。数字の文字列(またはサポートされているその他の数字フォーマット)は、数学演算や比較で必要とされる場合、自動的に数字として解釈されます。
スクリプト内でリテラルテキストをどのように書くべきかは、文脈によって異なります。例えば、式では、文字列は引用符で囲む必要があります。ディレクティブ(#HotIfを除く)と自動置換ホットストリングでは、引用符は必要ありません。
文字列の動作の詳細については、「文字列のエンコード」を参照してください。
数字
AutoHotkey は次の数値形式をサポートしています。
- 123、00123または などの 10 進整数。-1
- 0x7B、0x007Bまたは などの 16 進数の整数。-0x1
-
3.14159のような10進数の浮動小数点数。
ドキュメントに記載されている場合を除き、16 進数は接頭辞0xまたはを使用する必要があります。このプレフィックスは、または記号が存在する場合はその後、先頭のゼロの前に0X記述する必要があります。たとえば、有効ですが、そうではありません。+-0x001000x1
小数点で書かれた数値は、小数部分がゼロであっても、常に浮動小数点と見なされます。たとえば、42と は42.0通常交換可能ですが、常にではありません。科学表記法も認識されますが (例: 1.0e4and )、小数点がなくても常に浮動小数点数が生成されます。-2.1E-4
ユーザーの地域設定でコンマが指定されている場合でも、小数点記号は常にドットです。
数値が文字列に変換されると、10 進数として書式設定されます。浮動小数点数は完全な精度でフォーマットされます (ただし、冗長な後続ゼロは破棄されます)。これにより、場合によっては不正確さが明らかになることがあります。Format関数を使用して、数値文字列を別の形式で生成します。浮動小数点数は、Round関数を使用してフォーマットすることもできます。
数値の範囲と精度の詳細については、純粋な数値を参照してください。
ブール値
ブーリアン値は、真または偽のいずれかになります。ブール値は、式の真偽など、2つの可能性を持つものを表現するのに使われます。例えば、式(x 注:Objectから派生したすべてのオブジェクトは、さらに共有の動作、プロパティ、メソッドを持ちます。
オブジェクトの使われ方として、以下のようなものがあります。
- アイテムや要素のコレクションを格納する。例えば、Arrayはアイテムのシーケンスを含み、Mapはキーと値を関連付ける。オブジェクトを使用すると、値のグループを1つの値として扱ったり、1つの変数に代入したり、関数に渡したり、関数から返したりすることができます。
- 現実的または概念的なものを表現すること。例えば、画面上の位置をXとYのプロパティで表し、アドレス帳の連絡先をName、PhoneNumber、EmailAddressなどで表します。オブジェクトは、他のオブジェクトと組み合わせることで、より複雑な情報の集合を表現するために使用することができます。
- サービスやサービスの集合をカプセル化することで、スクリプトの他の部分が、そのタスクの実行方法ではなく、タスクに集中できるようにします。例えば、Fileオブジェクトは、ファイルからデータを読み取ったり、ファイルにデータを書き込んだりするメソッドを提供します。ファイルに情報を書き込むスクリプト関数が、Fileオブジェクトをパラメータとして受け取った場合、ファイルがどのように開かれたかを知る必要はありません。同じ関数を使用して、TCP/IPソケットやWebSocketなどの他のターゲットに情報を書き込むことができます(ユーザー定義オブジェクトを使用)。
- 上記の組み合わせ。例えば、GUIはGUIウィンドウを表し、スクリプトにグラフィカルユーザーインターフェースを作成、表示する手段を提供します。コントロールのコレクションを含み、タイトルやFocusedCtrlなどのプロパティによってウィンドウに関する情報を提供します。
オブジェクト(特にクラス)を適切に使用することで、モジュール化され再利用可能なコードを作成することができます。モジュール化されたコードは、通常、テスト、理解、保守が容易です。例えば、あるコードのセクションを改良したり変更したりする際に、他のセクションの詳細を知る必要がなく、またそのセクションに対応する変更を加える必要もありません。再利用可能なコードは、同じまたは類似のタスクのコードを何度も書いたりテストしたりする必要がないため、時間を節約することができます。
オブジェクト・プロトコル
このセクションは、後のセクションでカバーされるこれらの概念に基づいています:変数、関数。
オブジェクトは、メッセージパッシングの原理で動作します。オブジェクトのコードや変数が実際にどこにあるかはわからないので、「give me foo」や「go do bar」のようにオブジェクトにメッセージを渡し、オブジェクトがそのメッセージに応答するのを頼りにする必要があります。AutoHotkeyのオブジェクトは、以下の基本的なメッセージをサポートしています。
- プロパティを取得します。
- プロパティを設定します(:=で示されます)。
- メソッドを呼び出す、()で示される。
プロパティは、設定や取得が可能なオブジェクトのいくつかの側面です。例えば、ArrayにはLengthプロパティがあり、これは配列の要素数に対応する。プロパティを定義すると、そのプロパティはどんな意味でも持つことができます。一般的に、プロパティは変数のように機能しますが、その値は必要に応じて計算され、実際にはどこにも保存されないかもしれません。
各メッセージには以下の内容が含まれており、通常はプロパティまたはメソッドが呼び出される場所に書かれています。
- プロパティまたはメソッドの名前。
- プロパティまたはメソッドの名前。どのようなアクションが実行されるか、値がどのように保存されるか、またはどの値が返されるかに影響を与える可能性のあるゼロ個以上のパラメータ。例えば、プロパティは、配列のインデックスやキーを取ることがあります。
例えば、次のようなものです。
myObj.methodName(arg1) value := myObj.propertyName[arg1]
オブジェクトにはデフォルトのプロパティもあり、プロパティ名なしで角括弧を使用すると、このプロパティが呼び出されます。例えば、次のようなものです。
value := myObj[arg1]
一般にSetは代入と同じ意味を持つので、同じ演算子を使います。
myObj.name := value myObj.name[arg1, arg2, ..., argN] := value myObj[arg1, arg2, ..., argN] := value
変数
変数では、名前を値のプレースホルダーとして使用することができます。その値は、スクリプトの実行中に繰り返し変更される可能性があります。例えば、ホットキーの場合、変数press_countを使って押された回数をカウントし、press_countが3の倍数のとき(3回押すごとに)別のキーを送信することができます。一度しか値が割り当てられない変数でも、役に立つことがあります。例えば、WebBrowserTitleという変数を使えば、好みのWebブラウザを変更したり、ソフトウェアのアップデートでタイトルやウィンドウクラスが変わったりしたときに、コードを更新しやすくすることができます。
AutoHotkeyでは、変数は単に使用することで作成されます。各変数は永久に単一のデータ型に制限されることはなく、代わりに文字列、数値、オブジェクトなど、任意の型の値を保持することができます。値が割り当てられていない変数を読もうとするとエラーとみなされるので、変数を初期化することは重要です。
変数には、主に3つの側面があります。
- 変数の名前。
- 変数名
- 変数の値
変数名には一定の制限があり、詳細は「名前」を参照してください。要するに、ASCII文字(大文字小文字を区別しない)、数字、アンダースコアからなる名前にこだわるのが最も安全であり、数字から始まる名前は使わないようにしましょう。
変数名にはスコープがあり、コード内のどこでその名前を使用してその変数を参照できるか、言い換えれば、その変数が見えるかどうかを定義します。ある変数が与えられたスコープ内で見えない場合、同じ名前で別の変数を参照することができます。両方の変数が同時に存在することもあるが、スクリプトの各部分で見えるのは1つだけである。グローバル変数は、「グローバルスコープ」(つまり関数の外側)で見ることができ、デフォルトで関数から読み取ることができますが、関数内で値を割り当てる場合は宣言する必要があります。ローカル変数は、それを作成した関数の内部でのみ見ることができます。
変数は、値を格納する容器または格納場所と考えることができるので、ドキュメントでは、変数の値を変数の中身と呼ぶことがよくあります。変数x :=42の場合、変数xの値として42という数字がある、あるいはxの値は42である、とも言えます。
注意しなければならないのは、変数とその値は同じものではないということです。例えば、「myArrayは配列である」と言うかもしれませんが、本当の意味は「myArrayは配列への参照を含む変数である」ということです。しかし、「myArray」は単なる変数名であり、配列オブジェクトはその名前を知らないので、さまざまな変数(したがって多くの名前)で参照される可能性があります。
未初期化の変数
変数を初期化するとは、その変数に開始値を割り当てることである。まだ値が割り当てられていない変数は、未初期化(略して未設定)です。初期化されていない変数を読み込もうとすると、エラーとみなされます。このため、名前の間違えや代入のし忘れなどのエラーを検出することができます。
IsSetは、グローバル変数やスタティック変数の初回使用時の初期化など、変数が初期化されているかどうかを判断するために使用できます。
変数の設定を解除するには、直接代入(:=)とunsetキーワード、またはmaybe(var?)演算子を組み合わせます。例えば、以下のようになります。Var := unset, Var1 := (Var2?).
or-maybe演算子(??)は、変数に値がない場合にデフォルト値を提供するために使用することができます。例えば、MyVar ? "Default "は、IsSet(MyVar) ?と同等です。MyVar : "Default "と同じです。
組み込み変数
プログラムには便利な変数が多数組み込まれており、どのスクリプトからも参照することができます。これらの変数は、注意書きがある場合を除き、読み取り専用です。つまり、スクリプトで直接内容を変更することはできません。慣習上、これらの変数のほとんどは接頭辞 A_ で始まります。
A_KeyDelayやA_TitleMatchModeなどの一部の変数は、スクリプトの動作を制御する設定を表し、各スレッドに対して別々の値を保持します。これにより、新しいスレッドで起動したサブルーチン(ホットキー、メニュー、タイマーなど)が、他のスレッドに影響を与えずに設定を変更することができます。
特殊な変数の中には、定期的に更新されるのではなく、スクリプトがその変数を参照するたびに値が取得されたり計算されたりするものがあります。例えば、A_Clipboardはクリップボードの現在の内容をテキストとして取得し、A_TimeSinceThisHotkeyはホットキーが押されてから経過したミリ秒数を計算する。
関連:組み込み変数の一覧。
環境変数
環境変数は、オペレーティングシステムによって管理されています。コマンドプロンプトでSETと入力してEnterを押すと、環境変数の一覧が表示されます。
スクリプトは、EnvSetを使用して新しい環境変数を作成したり、既存の環境変数の内容を変更したりすることができます。このような追加や変更は、システムの他の部分からは見えません。しかし、スクリプトがRunまたはRunWaitを呼び出して起動したプログラムやスクリプトは、通常、親スクリプトの環境変数のコピーを引き継ぎます。
環境変数を取得するには、EnvGetを使用します。たとえば、次のようになります。
Path := EnvGet("PATH")
変数参照(VarRef)
式中では、代入や参照演算子(&)の対象でない限り、各変数参照はその内容に自動的に解決されます。つまり、myFunction(myVar)を呼び出すと、myVarの値がmyFunctionに渡され、変数そのものは渡されません。すると、関数はmyVarと同じ値を持つ独自のローカル変数(パラメータ)を持つことになるが、myVarに新しい値を代入することはできない。要するに、パラメータは値で渡されるのです。
参照演算子(&)は、変数を値のように扱うことができます。&myVarはVarRefを生成し、他の変数やプロパティへの代入、配列への挿入、関数への受け渡し、関数からの戻り値など、他の値と同様に使用することができます。VarRefは、元のターゲット変数に割り当てたり、それを再参照することでその値を取得するために使用することができます。
関数のパラメータは、パラメータ名の前にアンパサンド(&)を付けることでByRefとして宣言することができ、便利です。この場合、呼び出し側ではVarRefを渡す必要がありますが、関数自身はパラメータを参照するだけで(パーセント記号なしで)VarRefを「参照解除」することが可能です。
Path := EnvGet("PATH")class VarRef extends Any
VarRef クラスには現在、定義済みのメソッドやプロパティはありませんが、value is VarRef を使用すると、値が VarRef であるかどうかをテストすることが可能です。
VarRef が COM メソッドのパラメーターとして使用される場合、オブジェクト自体は渡されません。代わりに、その値は一時的な VARIANT にコピーされ、それはバリアント型 VT_BYREF|VT_VARIANT を使用して渡されます。メソッドが戻ると、新しい値がVarRefに割り当てられます。
キャッシング
通常、変数は1つの値を保持し、その値は明確な型(文字列、数値、オブジェクト)を持っていると考えられていますが、AutoHotkeyでは、「値は" myNumber」や「MsgBox myNumber」などの場合、数値と文字列を自動的に変換しています。これらの変換は非常に頻繁に行われるため、数値を含む変数が文字列に変換されるたびに、その結果が変数にキャッシュされます。
現在、AutoHotkey v2では、純粋な数値を変数に代入するときだけキャッシュし、読み込むときはキャッシュしません。これにより、文字列と純粋な数値を区別する機能が維持されます(Type関数や、COMオブジェクトに値を渡す場合など)。
関連
変数:基本的な使い方と例。 変数容量とメモリ:制限事項の詳細。
関数
関数とは、スクリプトが何かを行うための基本的な手段です。
関数は、さまざまな目的を持つことができます。単純な計算を行うだけの関数もあれば、ウィンドウを移動させるなど、すぐに目に見える効果をもたらす関数もあります。AutoHotkeyの強みの1つは、スクリプトがいくつかの関数を呼び出すだけで、他のプログラムを自動化したり、他の多くの一般的なタスクを実行したりすることが簡単にできることです。例については、関数リストを参照してください。
この文書では、経験のない人にはわからないような方法で、いくつかの一般的な単語が使用されています。以下に、関数に関連して頻繁に使用される単語やフレーズをいくつか紹介します。
関数を呼び出す
関数を呼び出すと、プログラムはその関数を呼び出し、実行し、評価する。つまり、関数呼び出しは、一時的にスクリプトから関数に制御を移します。関数が目的を果たすと、制御をスクリプトに戻します。言い換えれば、関数呼び出しに続くコードは、関数が完了するまで実行されません。
しかし、時には、その効果がユーザーに伝わる前に関数が完了することがあります。例えば、Send関数はキーストロークを送信しますが、キーストロークが目的地に到達して意図した効果をもたらす前に戻ることがあります。
パラメータ
通常、関数は、操作方法や操作対象を指示するパラメータを受け取ります。各パラメーターは、文字列や数値などの値です。例えば、WinMoveはウィンドウを移動させるので、どのウィンドウをどこに移動させるかをパラメータで指定します。パラメータは、引数とも呼ばれます。一般的な略語としては、paramやargがあります。
パラメータを渡す
パラメータは関数に渡されます。つまり、関数が呼び出されたときに、関数の各パラメータに対して値が指定されます。例えば、GetKeyStateにキーの名前を渡すと、そのキーが押されているかどうかを判断することができます。
コマンド
関数呼び出しは、プログラムに特定の動作をさせる場合など、コマンドと呼ばれることもあります。(歴史的な理由から、コマンドは、括弧が省略され、戻り値が破棄される、特定のスタイルの関数呼び出しを指す場合があります。しかし、これは厳密には関数呼び出し文である)。
関数は通常、パラメータを特定の順序で記述することを想定しているので、各パラメータの値の意味は、カンマで区切られたパラメータリストの中での位置によって決まります。パラメータによっては省略できるものもあり、その場合はパラメータを空白にすることができますが、それに続くカンマは、残りのすべてのパラメータも省略する場合にのみ省略することができます。たとえば、ControlSendの構文は次のとおりです。
ControlSend Keys[, Control, WinTitle, WinText, ExcludeTitle, ExcludeText]
角括弧は、囲んだパラメータがオプションであることを意味します(括弧自体は実際のコードに表示されません)。ただし、通常はターゲットウィンドウを指定する必要があります。例えば
ControlSend "^{Home}", "Edit1", "A" ; Correct. Control is specified. ControlSend "^{Home}", "A" ; Incorrect: Parameters are mismatched. ControlSend "^{Home}",, "A" ; Correct. Control is omitted.
メソッド
メソッドは、特定のオブジェクトやオブジェクトの種類に関連付けられた関数である。メソッドを呼び出すには、オブジェクトとメソッド名を指定する必要があります。メソッド名は関数を一意に特定するものではなく、メソッド呼び出しが試みられたときに何が起こるかはオブジェクトに依存する。例えば、x.Show()は、xが何であるかによって、メニューを表示したり、GUIを表示したり、エラーを発生させたり、何か他のことをしたりするかもしれない。つまり、メソッドコールは単にオブジェクトにメッセージを渡し、何かをするように指示するものです。詳しくは、「オブジェクトのプロトコル」と「オブジェクトの演算子」を参照してください。
制御フロー
制御フローとは、個々のステートメントが実行される順序のことです。通常、ステートメントは上から下へ順番に実行されますが、制御フローステートメントでは、ステートメントを繰り返し実行したり、特定の条件が満たされた場合にのみ実行するように指定することで、これを上書きすることができます。
ステートメント
ステートメントとは、簡単に言えば、実行すべき何らかのアクションを表現する、言語の最小の独立した要素のことです。AutoHotkeyでは、ステートメントには、代入、関数呼び出し、その他の式が含まれます。ただし、ディレクティブ、ダブルコロンのホットキーとホットストリングタグ、割り当てのない宣言はステートメントではなく、プログラムが最初に起動したとき、スクリプトが実行される前に処理されます。
実行する
実行する、実行する、評価する、実行に移す、など。Executeは、基本的にノンプログラミングの言葉と同じ意味です。
ボディ
制御フロー文の本文は、その文が適用される文または文のグループです。例えば、if文の本体は、特定の条件が満たされた場合にのみ実行される。
例えば、次のような簡単な手順を考えてみましょう。
- メモ帳を開く
- メモ帳が画面に表示されるのを待つ
- "ハロー、ワールド!"と入力する
一度に1つのステップを踏んで、そのステップが終わると次のステップに進むのです。これと同じように、プログラムやスクリプトの制御も、ある文から次の文へと流れていくのが普通です。しかし、既存のメモ帳に入力する場合はどうでしょうか。次のような手順で考えてみましょう。
- 1.メモ帳が起動していない場合
- 1.メモ帳が起動していない場合:メモ帳を開く
- 2.メモ帳が画面に表示されるのを待つ
- 2.それ以外の場合
- 1.メモ帳を起動する
- 3."ハロー、ワールド!"と入力する。
つまり、メモ帳を開くか、メモ帳を起動するかは、すでに起動しているかどうかによります。#1.は条件文であり、if文とも呼ばれる。つまり、ある条件を満たした場合にのみ、その本体(#1.1~#1.2)を実行する。#2.はelse文で、前のif文(#1)の条件が満たされない場合にのみ、その本体(#2.1)を実行する。条件によって、制御は次の2つのうちどちらかに流れます。#1(真の場合)→#1.1→#1.2→#3、または#1(偽の場合)→#2(else)→#2.1→#3です。
上記の命令は、以下のようなコードに変換することができます。
if (not WinExist("ahk_class Notepad")) { Run "Notepad" WinWait "ahk_class Notepad" } else WinActivate "ahk_class Notepad" Send "Hello, world{!}"
文書による指示では、インデントと番号を使ってステートメントをグループ化しました。スクリプトの動作は少し異なります。インデントはコードを読みやすくしますが、AutoHotkeyでは、ステートメントのグループ化には影響しません。その代わり、上図のように中括弧で囲むことでステートメントをグループ化します。これをブロックと呼びます。
構文についての詳細、つまりAutoHotkeyで制御フロー文を書く、または認識する方法については、「制御フロー」を参照してください。
詳細
文字列のエンコード
文字列の各文字は、その序数(文字コード)と呼ばれる数字で表現されます。例えば、"Abc "という値は次のように表されます。
A | b | c | |
---|---|---|---|
65 | 98 | 99 | 0 |
エンコーディング 文字列のエンコーディングは、記号が序数に、序数がバイトにどのようにマッピングされるかを定義します。多くの異なるエンコーディングがありますが、AutoHotkeyでサポートされているものはすべてASCIIをサブセットとして含んでいるので、文字コード0から127は常に同じ意味を持っています。例えば、'A'は常に文字コード65を持ちます。
Null-termination (ヌル文字) 各文字列は「ヌル文字」で終了します。言い換えれば、序列値がゼロの文字が文字列の終わりを示すことになります。文字列の長さは、ヌル終端文字の位置から推測できますが、AutoHotkeyは、パフォーマンスのため、また文字列の長さの範囲内でヌル文字を許可するために、長さも保存します。
注:ヌル終端処理に依存しているため、多くの組み込み関数とほとんどの式演算子はヌル文字が埋め込まれた文字列をサポートしておらず、代わりに最初のヌル文字までしか読みません。しかし、このような文字列の基本的な操作は可能です。例えば、連結、==、!==、Chr(0)、StrLen、SubStr、代入、パラメータ値、戻り値などです。
ネイティブエンコーディング。AutoHotkeyは様々なエンコーディングのテキストを扱う方法を提供していますが、組み込み関数、そしてある程度言語自体が、すべて文字列値がある特定のエンコーディングであることを前提としています。これはネイティブエンコーディングと呼ばれるものです。ネイティブエンコーディングは、AutoHotkeyのバージョンに依存します。
-
AutoHotkeyのUnicodeバージョンはUTF-16を使用します。UTF-16文字列の最小要素は2バイト(16ビット)です。0から65535(U+FFFF)の範囲のUnicode文字は、同じ値の単一の16ビットコードユニットで表され、65536(U+10000)から1114111(U+10FFFF)の範囲の文字は、サロゲートペアで表されます(つまり、0xD800から0xDFFFまでのちょうど二つの16ビットコードユニットです。(サロゲートペアの詳しい説明やエンコード、デコードの方法については、インターネットを検索してください)。
-
AutoHotkeyのANSIバージョンは、システムのロケールまたは「非Unicodeプログラム用の言語」システム設定に依存する、システムのデフォルトANSIコードページを使用します。ANSI文字列の最小の要素は1バイトです。ただし、コードページによっては、複数バイトのシーケンスで表現される文字が含まれています(これらは常に非ASCII文字です)。
注:AutoHotkey v2はネイティブでUnicodeを使用し、ANSIバージョンはありません。
文字。一般に、この文書の他の部分では、文字列の最小単位を意味する用語「文字」を使用しています。ANSI文字列ではバイト、Unicode(UTF-16)文字列では16ビットコードユニットです。実用的な理由から、文字列の長さや文字列内の位置は、完全なUnicode文字でなくても、これらの固定サイズの単位を数えることによって測定されます。
FileRead、FileAppend、FileOpen、Fileオブジェクトは、特定のエンコーディングを持つファイル内のテキストの読み書きの方法を提供します。
StrGetとStrPut関数は、ネイティブエンコーディングと他の指定されたエンコーディングの間で文字列を変換するために使用することができます。しかし、これらは通常、データ構造やDllCall関数と組み合わせた場合にのみ有効です。DllCallに直接渡される文字列やDllCallから渡される文字列は、AStrやWStrのパラメータ型を使用してANSIやUTF-16に変換することができます。
AutoHotkeyのANSIバージョンとUnicodeバージョンの違いを扱うためのテクニックは、Unicode vs ANSIで見つけることができます。
純粋数
純粋数または2進数は、コンピュータのCPUが直接演算処理できる形式でメモリに保存されているものです。ほとんどの場合、AutoHotkeyは必要に応じて数値文字列と純粋数を自動的に変換し、この2つのタイプを区別することはほとんどありません。AutoHotkeyは、主に純粋な数値に2つのデータ型を使用します。
- 64ビット符号付き整数(int64)。
- 64ビットバイナリ浮動小数点数(IEEE 754国際標準のdoubleまたはbinary64フォーマット)。
つまり、スクリプトは以下の制限に影響される。
-
つまり、-9223372036854775808(-0x800000000000、または-263)から9223372036854775807(0x7FFFFFFFFF、または263-1)の範囲内でなければならない。式中の整数定数がこの範囲外の場合、下位64ビットのみが使用されます(値は切り捨てられます)。より大きな値を文字列に含めることもできますが、文字列を数値に変換しようとすると(数学の演算で使用するなど)、同様に切り捨てられることになります。
-
浮動小数点数は、一般に15桁の精度をサポートします。
注:2進浮動小数点形式では正確に表現できない10進数の分数があるため、表現可能な最も近い数値に丸められます。そのため、最も近い数値に丸められ、予想外の結果になることがあります。例えば
MsgBox 0.1 + 0 ; 0.10000000000000001 MsgBox 0.1 + 0.2 ; 0.30000000000000004 MsgBox 0.3 + 0 ; 0.29999999999999999 MsgBox 0.1 + 0.2 = 0.3 ; 0 (not equal)
その対策として、直接の比較を避け、代わりに違いを比較することがあります。例えば
MsgBox Abs((0.1 + 0.2) - (0.3)) < 0.0000000000000001
もう一つの方法は、文字列に変換するなどして、比較の前に明示的に丸めを適用することである。精度を指定しながらこれを行うには、一般に2つの方法があり、どちらも以下に示すとおりです。
MsgBox Round(0.1 + 0.2, 15) = Format("{:.15f}", 0.3)
名称
AutoHotkeyでは、変数、関数、ウィンドウグループ、クラス、プロパティ、メソッドなど、さまざまなものの命名に、同じルールを使用しています。そのルールは以下の通りです。
大文字と小文字を区別する。ASCII 文字の場合はなし。例えば、CurrentDateはcurrentdateと同じです。しかし、'Ä'のような大文字の非ASCII文字は、現在のユーザーのロケールに関係なく、小文字の対応する文字と同等とはみなされません。これは、スクリプトが複数のロケール間で一貫した動作をするのに役立ちます。
最大文字数:253文字
使用可能な文字。文字、数字、アンダースコア、非ASCII文字。ただし、1文字目は数字にできません。
予約語:as, and, contains, false, in, is, IsSet, not, or, super, true, unset. これらの単語は、将来の使用やその他の特定の目的のために予約されています。
宣言キーワードや制御フロー文の名前も、主に間違いを検出するために予約されています。これには次のようなものがあります。Break、Catch、Continue、Else、Finally、For、Global、Goto、If、Local、Loop、Return、Static、Throw、Try、Until、While。
プロパティ名、メソッド名、ウィンドウグループ名には予約語を使用することができる。
オブジェクト参照
スクリプトは、オブジェクトへの参照を通じて、間接的にのみオブジェクトと対話します。オブジェクトを作成するとき、オブジェクトはあなたがコントロールできない場所に作成され、あなたに参照が与えられます。この参照を関数に渡したり、変数や別のオブジェクトに格納したりすると、同じオブジェクトへの新しい参照が作成されます。
例えば、myObjにオブジェクトへの参照が含まれている場合、yourObj := myObjは同じオブジェクトへの新しい参照を作成する。myObj.ans := 42 のような変更は、myObj.ans と yourObj.ans の両方が同じオブジェクトを参照しているため、反映されるでしょう。しかし、myObj := Object()は変数myObjにのみ影響し、変数yourObjはまだ元のオブジェクトを参照しているわけではありません。
参照は、単に代入を使って他の値に置き換えることで解放されます。オブジェクトは、すべての参照が解放された後にのみ削除されます。オブジェクトを明示的に削除することはできませんので、試してはいけません。(ただし、オブジェクトのプロパティ、コンテンツ、関連リソース(Arrayの要素、Guiに関連するウィンドウ、Menuオブジェクトのメニューなど)は削除することができます)。
ref1 := Object() ; Create an object and store first reference ref2 := ref1 ; Create a new reference to the same object ref1 := "" ; Release the first reference ref2 := "" ; Release the second reference; object is deleted
もし理解しにくければ、オブジェクトをレンタルユニットとみなしてみてください。借りるときに渡されるのは、その部屋に入るための鍵です。そして、その鍵を使って同じユニットにアクセスすることができるのですが、そのユニットを使い終わったら、すべての鍵をレンタル業者に返さなければなりません。通常、ユニットは削除されませんが、オブジェクトに保存された値が削除されると解放されるのと同じように、エージェントは、あなたが残したガラクタを削除してくれるかもしれませんね。
https://www.autohotkey.com/docs/v2/Concepts.htm#variable-references