この文書では、AutoHotkeyで使用される一般的な概念と慣習を、コードよりも説明に重点を置いて説明しています。読者に対してはスクリプトやプログラミングの予備知識を持つことは想定していませんが、新しい用語を学ぶ準備はしておいてください。
構文の具体的な内容については、「スクリプト言語」をご覧ください。
値とは、簡単に言えば、プログラム内の情報のことです。例えば、送信するキーや実行するプログラムの名前、ホットキーが押された回数、起動するウィンドウのタイトルなど、プログラムやスクリプトの中で何らかの意味を持つものを指定します。
AutoHotkeyは、このようなタイプの値をサポートしています:
Type関数は、値の型を決定するために使用することができます。
その他、関連する概念もあります:
文字列は単なるテキストです。各文字列は、実際には文字の配列または文字列ですが、1つの実体として扱うことができます。文字列の長さは、その文字列の文字数であり、文字列中のある文字の位置は、その文字の連番でしかありません。AutoHotkeyの慣習では、最初の文字はポジション1になります。
数値の文字列:数値文字列:数字(またはその他のサポートされている数値フォーマット)の文字列は、数学演算や比較で必要とされる場合、自動的に数値として解釈されます。
スクリプトの中でどのようにリテラルテキストを書くべきかは、文脈によって異なります。例えば、式の中では、文字列は引用符で囲む必要があります。ディレクティブ(#HotIfを除く)および自動置換ホットストリングでは、引用符は必要ありません。
文字列の仕組みについてのより詳しい説明は、「文字列のエンコード」をご覧ください。
AutoHotkeyは、これらの数値フォーマットに対応しています:
123
、00123
、-1
などの10進数整数。0x7B
、0x007B
、-0x1
などの16進数の整数値。3.14159
のような10進数の浮動小数点数。16進数の場合は、ドキュメントに記載されている場合を除き、0x
または0X
のプレフィックスを使用する必要があります。この接頭辞は、+
または-
記号がある場合はその後に、先行するゼロの前に書かなければならない。例えば、0x001
は有効ですが、000x1
は無効です。
小数点のある数値は、小数部が0であっても、常に浮動小数点とみなされます。例えば、42
と 42.0
は通常互換性がありますが、常に互換性があるわけではありません。科学表記も認識されるが(例:1.0e4
、-2.1E-4
)、小数点以下がない場合でも常に浮動小数点数の数値が生成されます。
ユーザーの地域設定でカンマが指定されている場合でも、小数点以下の区切り記号は常にドットです。
数値を文字列に変換した場合、10進数でフォーマットされます。浮動小数点数は、完全な精度でフォーマットされます(ただし、余分な末尾のゼロは削除されます)ので、場合によっては不正確であることがわかります。数値文字列を別の形式で出力する場合は、Format関数を使用します。浮動小数点数は、Round関数を使って整形することも可能です。
数値の範囲や精度については、「純粋な数値」をご覧ください。
ブーリアン値は、trueまたはfalseのいずれかになります。ブール値は、式の真偽など、正確に2つの可能な状態を持つものを表現するために使用されます。例えば、(x <= y)
という式は、xがyより小さいか等しい場合にtrueとなる。ブーリアン値は、イエスか ノーか、オンか オフか、ダウンか アップか(GetKeyStateのように)などを表すこともできる。
AutoHotkeyには特定のブーリアン型がないため、整数値である0
を使用して偽を、1
を使用して真を表します。値が真か偽のどちらかであることが要求される場合、空白またはゼロの値は偽とみなされ、他のすべての値は真とみなされます。(オブジェクトは常に真とみなされます。)
true
と false
という言葉は、1と0を含む組み込み変数です。これらは、スクリプトをより読みやすくするために使用することができます。
AutoHotkeyには、他の言語で見られるような、無、null、nil、undefinedを一意に表す値がありません。
「null」または「undefined」値を生成する代わりに、値を持たない変数、プロパティ、配列要素、マップアイテムを読み込もうとすると、UnsetErrorがスローされる。これにより、NULL値を暗黙のうちにコード内に伝播させる場合よりも、より簡単にエラーを特定することができます。こちらもご覧ください:未初期化変数。
関数のオプションパラメータは、関数が呼び出されたときに省略することができます。その場合、関数は動作を変更するか、デフォルト値を使用します。パラメータは通常、コードから文字通り省略することで省略されますが、unset
キーワードを使用することで明示的または条件付きで省略することも可能です。この特別なシグナルは、maybe演算子(var?)を用いて明示的にしか伝搬できなません。未設定のパラメータは、関数が実行される前に自動的にそのデフォルト値(もしあれば)を受け取ります。
主に歴史的な理由から、戻り値が明示されていない関数など、他の言語でnullやundefinedの値が使用される場合に、空文字列が使用されることがあります。
変数や パラメータが「空」または「ブランク」と言われる場合、それは通常、空文字列(長さがゼロの文字列)を意味します。これは、場合によっては同じ効果をもたらすかもしれませんが、パラメータを省略することとは異なります。
オブジェクトは、AutoHotkeyの複合データ型または抽象データ型です。オブジェクトは、任意の数のプロパティ(取得または設定可能)と メソッド(呼び出し可能)で構成されます。各プロパティやメソッドの名称や効果は、特定のオブジェクトやオブジェクトの種類に依存します。
オブジェクトには以下の属性があります:
alpha := []
は、新しいArrayを作成し、alphaに参照を格納します。bravo := alpha
は、オブジェクトではなく参照をbravo
にコピーするので、両者は同じオブジェクトを参照します。配列や変数がオブジェクトを含んでいると言われるとき、実際に含んでいるのはオブジェクトへの参照します。if obj
,!obj
,obj ? x : y
のように、ブール値が要求される場合は常にtrueとみなされます。MsgBox(myObject)
は、空のMsgBoxを表示します。それ以外の場合は、TypeErrorが投げられることがあります(将来的には、これが標準になるはずです)。注: Objectから派生したすべてのオブジェクトは、さらに共有の動作、プロパティ、メソッドを持ちます。
オブジェクトの使われ方としては、以下のようなものがあります:
オブジェクト(特にクラス)を適切に使用することで、モジュール化された 再利用可能なコードを作成することができます。モジュール化されたコードは、通常、テスト、理解、保守が容易です。例えば、他のセクションの詳細を知ることなく、またそのセクションに対応する変更を加えることなく、コードのあるセクションを改良または修正することができます。再利用可能なコードは、同じまたは類似のタスクのコードを何度も書いたりテストしたりする必要がないため、時間を節約することができます。
このセクションでは、後のセクションでカバーされるこれらの概念に基づいています:変数、関数
オブジェクトは、メッセージパッシングの原理で動作します。オブジェクトのコードや変数が実際にどこにあるのかわからないので、「fooを要求」「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
という変数を使えば、好みのウェブブラウザを変更したり、ソフトウェアのアップデートでタイトルや ウィンドウクラスが変わったりしたときに、コードを簡単に更新することができるようにすることができます。
AutoHotkeyでは、変数を使用するだけで変数が作成されます。各変数は永久に単一のデータ型に制限されることはなく、代わりに任意の型の値を保持することができます:文字列、数値、またはオブジェクト。値が割り当てられていない変数を読み込もうとするとエラーとなるため、変数の初期化は重要です。
変数には主に3つの側面があります:
変数名には一定の制約があります。詳細は「名前」を参照してください。要するに、ASCII文字(大文字小文字を区別しない)、数字、アンダースコアからなる名前にして、数字から始まる名前にしないようにするのが無難です。
変数名には 範囲これは、コード内のどこでその名前を使用してその変数を参照できるかを定義するもので、言い換えれば、その変数が見える場所です。ある変数が与えられたスコープ内で見えない場合、同じ名前で別の変数を参照することができます。両方の変数が同時に存在することもありますが、スクリプトの各部分で見えるのは1つだけです。グローバル変数は、「グローバルスコープ」(つまり関数の外側)で見ることができ、デフォルトでは関数から読み込むことができますが、関数内で値を代入する場合は宣言する必要があります。ローカル変数は、それを作成した関数の内部でのみ見ることができます。
変数は、値の入れ物や保管場所と考えることができるので、ドキュメントでは、変数の値を変数の中身と呼ぶことが多いようです。変数x := 42
の場合、「変数xは42という数字を値として持っている」「xの値は42である」という言い方もできる。
注意すべきは、変数とその値は同じではないことです。例えば、「myArray
は配列である」と言いますが、本当の意味は「myArrayは配列への参照を含む変数である」ということです。しかし、"myArray "は単なる変数名であり、配列オブジェクトは自分が名前を持っていることを知らないので、多くの異なる変数(したがって多くの名前)で参照される可能性があるのです。
変数を初期化するとは、その変数に開始値を割り当てることです。まだ値が割り当てられていない変数は、uninitialized(略してunset)です。初期化されていない変数を読み込もうとすると、エラーとみなされます。これにより、名前の間違いや課題の忘れ物などのミスを発見することができます。
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")
式中では、代入や 参照演算子(&)の対象でない限り、各変数参照はその内容に自動的に解決されます。つまり、myFunction(myVar)
を呼び出すと、myVarの値がmyFunctionに渡され、変数そのものは渡されません。この場合、関数はmyVarと同じ値を持つ独自のローカル変数(パラメータ)を持つことになりますが、myVarに新しい値を代入することはできません。要するに、パラメータは値で渡されるのです。
参照演算子(&)により、変数を値のように扱うことができます。&myVar
は VarRef を生成し、他の値と同様に使用することができます。他の変数やプロパティに代入する、配列に挿入する、関数に渡す、関数から返す、など。VarRef は、元のターゲット変数への代入や、参照解除による値の取得に使用することができます。
関数パラメータは,パラメータ名の前にアンパサンド(&)を付けることで,便宜上ByRefとすることができます。これは、呼び出し側がVarRefを渡す必要があり、関数自身がパラメータを参照するだけで(パーセント記号なしで)VarRefを「参照解除」できるようにします。
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の強みの一つは、スクリプトがいくつかの関数を呼び出すだけで、他のプログラムを自動化したり、その他多くの一般的なタスクを実行したりすることができる手軽さです。例として、機能一覧をご覧ください。
この文書では、一般的な単語が、経験のない人にはわからないように使われていることがあります。以下に、機能に関して頻繁に使用される単語やフレーズを紹介します:
関数を呼び出すと、プログラムはその関数を起動、実行、評価します。つまり、関数呼び出しは、スクリプトから関数に一時的に制御を移します。関数が目的を果たすと、スクリプトに制御を戻す。つまり、関数呼び出しに続くコードは、関数が完了するまで実行されない。
しかし、その効果をユーザーが確認する前に機能が終了してしまうこともあります。例えば、Send関数はキーストロークを送信しますが、キーストロークが目的地に到達して意図した効果を発揮する前に戻ってくることがあります。
通常、関数は、操作方法や操作対象を指示するパラメータを受け取ります。各パラメーターは、文字列や数値などの値です。例えば、WinMoveはウィンドウを移動させるので、どのウィンドウをどこに移動させるかをパラメータで指定します。パラメータは引数と呼ばれることもあります。一般的な略語として、param、argがあります。
パラメータは関数に渡されます。つまり、関数が呼び出されたときに、関数の各パラメータに値が指定されることを意味します。例えば、GetKeyStateにキーの名前を渡すと、そのキーが押さえられているかどうかを判断することができます。
関数は値を返すので、関数の結果を返り値と呼ぶことが多い。例えば、StrLenは文字列の文字数を返します。関数は、結果が複数ある場合など、結果を変数に格納することもあります(「値を返す」を参照)。
関数コールは、プログラムに特定の動作を命令する場合など、コマンドと呼ばれることもあります。(歴史的な理由から、コマンドは、括弧が省略され、戻り値が破棄される、関数を呼び出す特定のスタイルを指す場合があります。ただし、これは厳密には関数呼び出し文である。)
関数は通常、パラメータを特定の順序で記述することを想定しているため、各パラメータ値の意味は、カンマで区切られたパラメータリスト内の位置に依存します。一部のパラメータは省略可能で、その場合はパラメータを空白にすることができますが、それに続くカンマは、残りのすべてのパラメータも省略される場合にのみ省略することができます。例えば、ControlSendの構文は以下の通りです:
ControlSend Keys , Control, WinTitle, WinText, ExcludeTitle, ExcludeText
角括弧は、囲んだパラメータがオプションであることを示します(括弧自体は実際のコードに表示されるべきではありません)。ただし、通常はターゲットウィンドウも指定する必要があります。事例:
ControlSend "^{Home}", "Edit1", "A" ; 正しい。制御が指定されている。 ControlSend "^{Home}", "A" ; 不正解です。パラメータが不一致です。 ControlSend "^{Home}",, "A" ; 正しいです。制御が省略されている。
メソッドは、特定のオブジェクトまたはオブジェクトの種類に関連する機能です。メソッドを呼び出すには、オブジェクトとメソッド名を指定する必要があります。メソッド名は関数を一意に特定するものではなく、メソッド呼び出しが試みられたときに何が起こるかは、オブジェクトに依存します。例えば、x.Show()
は、x
が何であるかによって、メニューを表示したり、GUIを表示したり、エラーを発生させたり、何か他のことをしたりします。つまり、メソッドコールは、単にオブジェクトにメッセージを渡し、何かをするように指示するものです。詳しくは、「オブジェクトプロトコル」および「オブジェクトの演算子」をご覧ください。
制御フローとは、個々のステートメントが実行される順序のことです。通常、文は上から下へ順番に実行されますが、制御フロー文では、文が繰り返し実行されたり、ある条件が満たされた場合にのみ実行されるように指定するなど、これを上書きすることができます。
文とは、簡単に言えば、実行されるべき何らかのアクションを表現する言語の最小の独立した要素です。AutoHotkeyでは、ステートメントには、代入、関数呼び出し、その他の式が含まれます。ただし、ディレクティブ、ダブルコロンのホットキーやホットストリングタグ、割り当てのない宣言はステートメントではなく、プログラムが最初に起動したとき、スクリプトが実行される前に処理されます。
実行する、実行する、評価する、実行に移す、など。Executeは、基本的にノンプログラミングの言葉と同じ意味です。
制御フロー文の本体は、それが適用される文または文のグループです。例えば、if文の本文は、特定の条件を満たした場合にのみ実行されます。
例えば、こんな簡単な命令を考えてみましょう:
一歩ずつ進んで、その一歩が終わったら次のステップに進む。同じように、プログラムやスクリプトの制御は、通常、あるステートメントから次のステートメントへと流れます。しかし、既存のメモ帳のウィンドウに入力する場合はどうでしょうか?この改訂版の検討:
そこで、メモ帳を開くか、メモ帳を起動するかは、すでに起動しているかどうかで判断しています。#1 は条件文であり、if文とも呼ばれる。つまり、ある条件を満たした場合にのみ、その本体(#1.1~#1.2)を実行するのです。#2はelse文であり、前のif文(#1)の条件が満たされない場合にのみ、その本体(#2.1)を実行します。条件によって、制御は2通りの流れになります:#1 (if true) → #1.1 → #1.2 → #3、または #1 (if false) → #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を持つ。
ヌル文字の終端:各文字列は「ヌル文字」で終端されます。言い換えれば、序列値がゼロの文字が文字列の終わりを示します。文字列の長さはヌル終端の位置から推測できますが、AutoHotkeyはパフォーマンスのため、また文字列の長さの範囲内でヌル文字を許可するために、長さも保存します。
注:ヌル終端処理に依存しているため、多くの組み込み関数とほとんどの式演算子はヌル文字が埋め込まれた文字列をサポートせず、代わりに最初のヌル文字までしか読みません。ただし、連結、==
、!==
、Chr(0)
、StrLen、SubStr、代入、パラメータ値、戻り値など、文字列の基本操作はサポートされています。
ネイティブエンコーディング:AutoHotkeyは様々なエンコーディングのテキストを扱う方法を提供していますが、組み込み関数、そしてある程度言語自体が、すべて文字列値がある特定のエンコーディングであることを前提としています。これをネイティブエンコードと呼びます。ネイティブエンコードは、AutoHotkeyのバージョンによって異なります:
AutoHotkeyのUnicodeバージョンはUTF-16を使用します。UTF-16文字列の最小の要素は2バイト(16ビット)です。0から65535(U+FFFF)の範囲のユニコード文字は、同じ値の単一の16ビットコードユニットで表され、65536(U+10000)から1114111(U+10FFFF)の範囲の文字は、サロゲートペアで表されます。(サロゲートペアやその符号化・復号化の方法については、インターネットで検索してください。)
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つのデータ型を使用します:
These data types affect the range and precision of pure numeric values for variables, properties, array/map elements and indices, function parameters and return values, and temporary results of operators in an expression. 算術演算子と関数は、64 ビットの整数演算または浮動小数点演算を実行します。ビット演算子は、64ビット整数演算を実行します。
つまり、スクリプトは以下のような制約の影響を受けます:
つまり、-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(ノットイコール)
その対策として、直接の比較を避け、代わりに違いを比較することがあります。事例:
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文字。ただし、数字で始めることができるのはプロパティ名のみです。
予約語: as
、and
、contains
、false
、in
、is
、IsSet
、not
、or
、super
、true
、unset
。これらの単語は、将来の使用やその他の特定の目的のために予約されています。
宣言キーワードや制御フロー文の名前も、主に間違いを検出するために予約されています。包含:Break
、Case
、Catch
、Continue
、Else
、Finally
、For
、Global
、Goto
、If
、Local
、Loop
、Return
、Static
、Switch
、Throw
、Try
、Until
、While
プロパティ名、メソッド名、ウィンドウグループ名には予約語を使用することができる。
スクリプトは、オブジェクトへの参照を通じて、間接的にのみオブジェクトと対話します。オブジェクトを作成するとき、オブジェクトはあなたがコントロールできない場所に作成され、リファレンスが与えられます。この参照を関数に渡したり、変数や別のオブジェクトに格納したりすると、同じオブジェクトへの新しい参照が作成されます。
例えば、myObjにオブジェクトへの参照が含まれている場合、yourObj := myObj
は同じオブジェクトへの新しい参照を作成します。myObj.ans := 42
のような変更は、同じオブジェクトを参照しているため、myObj.ans
とyourObj.ans
の両方に反映されます。しかし、myObj := Object()
は変数myObjにのみ影響し、変数yourObjはまだ元のオブジェクトを参照しているわけではありません。
参照は、代入を使用して他の任意の値に置き換えるだけで解放されます。オブジェクトは、すべての参照が解放された後にのみ削除されます。オブジェクトを明示的に削除することはできませんので、試さないでください。ただし、配列の要素、Guiに関連付けられたウィンドウ、Menuオブジェクトの項目など、オブジェクトのプロパティ、コンテンツ、または関連リソースは削除できます。
ref1 := Object() ; オブジェクトを作成し、最初のリファレンスを格納します。 ref2 := ref1 ; 同じオブジェクトへの新しい参照を作成します ref1 := "" ; 最初のリファレンスを公開します。 ref2 := "" ; 2番目の参照を解除し、オブジェクトを削除します。
わかりにくかったら、モノをレンタルしているようなイメージで考えてみてください。ユニットを借りる際に、ユニットにアクセスするために使用するキーをお渡ししています。鍵の数を増やして、同じユニットにアクセスするために使用することができますが、ユニットを使い終わったら、すべての鍵をレンタルエージェントに返さなければなりません。通常、ユニットは削除されませんが、もしかしたらエージェントは、あなたが残したガラクタを削除させるかもしれません。オブジェクトに保存した値が、オブジェクトを削除するときに解放されるのと同じです。