変数

grandMA3 ユーザマニュアル » マクロ » 変数 Version 2.0

マクロやコマンドライン入力で使用可能な変数を作成できます。

変数は、さまざまな種類の内容を格納できるコンテナです。ユーザが定義した名前を持ち、変数の内容の代わりとして使用できます。コマンドが実行されると、変数名が変数の内容に置き換わります。

変数には、以下の3種類のデータ型を格納できます。

  • Integer: 符号付き整数
  • Double: 小数部6桁の符号付き固定小数点数
  • Text: 文字列

符号付きの数値は、例えば -7 のような負数にもなり得ることを意味します。

変数には強い型指定がありません。既存の変数は、別の型に変換可能です。

変数名には、任意の文字を使えます。大文字と小文字は区別されます。

ヒント
必須ではありませんが、変数名には空白を入れない方がよいでしょう。代わりに、キャメルケース(例: myName)やパスカルケース(例: MyName)を用いることをお勧めします。

変数には2種類のスコープがあります。スコープは、誰がどこで変数を使用できるかを定義します。

変数は、ユーザに対してスコープを設定することも、グローバル変数にすることも可能です。

ユーザ変数は、それらを作成したユーザプロファイルによってのみ参照・使用できます。グローバル変数は、セッション内のすべてのユーザが参照・使用できます。


SetGlobalVariable と SetUserVariable

グローバル変数でもユーザ変数でも作成方法は同様ですが、それぞれに使用するキーワードは、SetGlobalVariableSetUserVariable になります。

構文は以下の通りです。

SetGlobalVariable ["変数名"] ["Text (空白文字も使用可)"]

SetGlobalVariable ["変数名"] [Integer または Double]

SetUserVariable ["変数名"] ["Text (空白文字も使用可)"]

SetUserVariable ["変数名"] [Integer または Double]

重要
変数名に空白が含まれている場合、引用符が必要です。空白が含まれていない場合は省略できます。
変数内容の文字列についても同様です。確実に Text 型として保存するには、変数内容を引用符で囲んでください。

User name[Fixture]>SetUserVariable MyFavoriteNumber 9
User name[Fixture]>SetUserVariable MyFavoriteText "9"

これら2つコマンド例は同じように見えるかもしれませんが、作成される変数は異なります。最初の例は数値、2番目の例は引用符が使われているため文字列になります。

シングル・クォーテーションとダブル・クォーテーション

引用符で囲まれたテキストを含む文字列を変数に格納したい場合があります。このとき、ソフトウェアが入力をどのように解釈し、実行時に呼び出された変数がどのように解釈されるかが問題になります。

変数システムでは、シングル・クォーテーションとダブル・クォーテーションのペアに対応しています。

異なる引用符が使われている場合、文字列は引用符で囲まれたテキストを含むことができます。

特定の名前のグループ("Spots Grid")をさまざまな状況で操作したいとします。以下のようにして、"Group" と名前を含む内容を、変数に格納できます。

User name[Fixture]>SetUserVariable MySpecialGroup "Group 'Spots Grid' "

変数のテキスト文字列全体がダブル・クォーテーションで、グループ名がシングル・クォーテーションで囲まれていることに注目してください。これら2種類の引用符を逆にしても、同じ結果になります。

これで、変数によってグループをアドレス指定できます。

User name[Fixture]>$MySpecialGroup At 80

これを用いる場合、変数名の前にある $ (ドル)記号に注意してください。この例では、変数を呼び出せるようにコマンドの前に $ を付けています。

ヒント
変数を呼び出すには、コマンドの前に $ を付けます。

ソフトウェアからの応答は以下のようになります。

OK: Group "Spots Grid" At 80

$ 記号の付いた変数名は、変数の内容に置き換えられます。

GetGlobalVariable と GetUserVariable

変数の内容と型は、GetGlobalVariableGetUserVariable キーワードを用いて一覧表示できます。

これらのキーワードでは、表示したい変数を指定します。構文は以下の通りです。

GetGlobalVariable ["変数名"]

GetUserVariable ["変数名"]

これらのコマンドは、変数名、型、および内容に関する情報を Command Line History ウィンドウ に表示します。

GetGlobalVariable ではグローバル変数のみが、GetUserVariable ではユーザ変数のみが表示されます。

この構文では、変数名が既知であることを前提としています。

ワイルドカードの * (アスタリスク) 記号 を用いると、すべての変数を表示したり、名前をフィルタリングして一覧表示したりできます。

"MySpecialGroup" という変数の現在の内容は、以下のコマンドで表示できます。

User name[Fixture]>GetUserVariable MySpecialGroup

Command Line History ウィンドウには、以下のように表示されます。

                  MySpecialGroup  Text  "Group 'Spots Grid' "
OK: GetUserVariable "MySpecialGroup"

以下の例は、名前に "Our" という語が含まれるすべてのグローバル変数を一覧表示します。

User name[Fixture]>GetUserVariable *ur*

"O" はアスタリスクにマッチするため、"Our" で始まる変数も表示されます。先頭にあるワイルドカードのアスタリスクは、指定文字の前に何らかの文字が必要であることを示しています。この例では、"Hour" で始まる変数や、名前のどこかに "ur" が含まれる変数も表示されます。"Our" で始まる変数を指定するには、以下のように入力します。

User name[Fixture]>GetUserVariable Our*

この例は、すべてのユーザ変数を表示します。

User name[Fixture]>GetUserVariable *

変数の使用

変数は、その内容が必要な場所で用いられます。

重要
変数を呼び出すには、コマンドの前に $ を付けます。
変数を定義するには、コマンドの最後に $ を付けます。

変数名の前に $ (ドル)記号を付けることによって、それ以降が変数名であり、それを変数の内容に置き換える必要があることをソフトウェアに伝えます。

これがコマンドで有効でない場合、Command Line History ウィンドウにエラーメッセージが表示されます。

前の例では、以下のように変数が使われました。

User name[Fixture]>$MySpecialGroup At 80

$MySpecialGroupが、変数の文字列内容("Group 'Spots Grid' ")に置き換わります。変数にはコマンドを表す文字列が含まれているため、これが動作します。

重要
変数を用いる際の引用符は重要で、その有無によって大きな違いが生じます。

以下のように引用符を付けて変数を用いると、その内容が具体的な文字列として呼び出されるため、正しく動作しません。

User name[Fixture]>$"MySpecialGroup" At 80

変数内容が文字列として明示的に呼び出されるため、以下のような結果になって失敗します。

Illegal object: Fixture "Group 'Spots Grid' " At 80

変数内容を文字列として用いようとし、コマンドとして解釈されません。

他の場合では、これが役立つことがあります。変数に文字列として使いたい内容が含まれている場合、変数名を引用符で囲む必要があります。以下の例を見てください。

この例では、グループ名を含む変数を使用しています。

User name[Fixture]>SetUserVariable MyGroupName "Spots Grid"

この変数は、以下のように文字列が使われる場所で使用できます。

User name[Fixture]>Group $"MyGroupName" At 80

このコマンドは動作しますが、以下のように引用符を省くと、文字列がコマンドとして解釈されるため失敗します。

User name[Fixture]>Group $MyGroupName At 80
Illegal object: Group "Spots" Grid At 80

この文字列はコマンドとして解釈されます。

DeleteGlobalVariable と DeleteUserVariable

変数は、DeleteGlobalVariable および DeleteUserVariable キーワードによって削除できます。

構文は以下のようになります。

DeleteGlobalVariable ["変数名"]

DeleteUserVariable ["変数名"]

重要
変数の削除は取り消せません。変数の削除については、他に付け加えることはありません。削除された変数は、もう存在しません。

特定の変数を削除するにはその名前が必要ですが、ワイルドカードの * (アスタリスク)によって、それにマッチする変数を削除することも可能です。

変数の連結

変数は、新しい変数に格納することで連結できます。

ここで求めているのは、連結された変数を含む複合文字列の作成です。出力は常に文字列です。数値変数の算術的加算については、後述を参照してください。

構文は以下のようになります。

SetGlobalVariable [MyConcatResult] $[変数名]$[変数名]

SetUserVariable [MyConcatResult] $[変数名]$[変数名]

連結する変数間や、連結の一部となる他の文字列との間に、空白を入れてはいけません。

文字列を変数に連結するには、引用符で囲み、それらの末尾と先頭の引用符との間に空白を入れずに追加します。引用符の内側には空白があってもかまいません。後述の例を参照してください。

以下の例では、3つの変数を用います。

変数名 内容
MyInteger Integer 9
MyKeyword Text Group
MyGroupName Text Perfect Macro

目標は、これらの変数を、グループを保存するためのコマンド文字列に連結することです。

1つのコマンドでも可能ですが、ここでは別の機能を見るために分割しています。

最初に、キーワードと整数を連結して新しい変数にします。

User name[Fixture]>SetUserVariable MyCommandString $"MyKeyword" "$"MyInteger"

このコマンドには多くの引用符があります。変数名を引用符で囲むと、その内容が文字列として解釈されます。これは、Integer 型の変数が Text 型に変換されることも意味しています。

また、2つの変数の間には、空白を挿入するための " " があります。

以下のコマンドで結果を確認します。

User name[Fixture]>GetUserVariable MyCommandString

次に、マクロ名を文字列に追加します。

User name[Fixture]>SetUserVariable MyCommandString $"MyCommandString" "$"MyGroupName"" "

これも分かりにくいかもしれません。2つの変数名は引用符で囲まれています。両者の間には、引用符で囲まれた空白とシングルクォーテーションがあります。そして、最後の変数名の後には、引用符で囲まれたシングルクォーテーションと空白があります。

このコマンドの引用符を取ると、SetUserVariable MyCommandString $MyCommandString '$MyGroupName' になります。

MyCommandString の既存内容が MyCommandString に代入され、さらに MyGroupName の内容がシングルクォーテーションで囲まれて追加されます。

結果として、MyCommandString が Group 9 'Perfect Macro' という文字列になります。

これで、いくつかのフィクスチャを選択して、以下のようにコマンドを実行できます。

User name[Fixture]>Store $MyCommandString

グループが、グループ9に名前付きで保存されます。このコマンドでは、引用符を使わないでください。

変数の加算

Integer/Double 型の変数を連結すると、算術演算の加算になります。この場合、引用符は使いません。

結果は変数に格納する必要があります。

この例では、以下の3つの変数を用います。

変数名 内容
MyInteger Integer 9
MySignedInteger Integer -2
MyDouble Double 6.500000

最初の2つの変数は、以下のコマンドで互いに加算できます。

User name[Fixture]>SetUserVar MyResult $MyInteger$MySignedInteger

結果は、Command Line History で確認できます。変数に7という値が格納されていることが分かります。

Double と Integer を加算することもできます。データの損失を避けるため、結果は Double になります。

User name[Fixture]>SetUserVar MyResult $MyInteger$MyDouble

MyResult には、15.500000 という値が格納されます。

型変換

上の例では、型変換が行われています。

Integer または Double は、変数名を引用符で囲むことによって Text に変換できます。変換はコマンド実行時に行われます。

Integer に変換可能な Text を含む変数は、引用符を付けずに設定することで変換できます。

Integer は、0.000000 という値の Double に加算することで Double に変換できます。

Double を Integer に変換することはできません。

この例では、以下の変数を用います。

変数名 内容
MyInteger Integer 9
MyEmptyDouble Double 0.000000
MyText Text Hello

この例では、Integer を Text に変換しています。

User name[Fixture]>SetUserVariable MyInteger $"MyInteger"

これを Integer に戻すには、以下のコマンドを用います。

User name[Fixture]>SetUserVariable MyInteger $MyInteger

Integer を Double に変換するには、以下のコマンドを用います。

User name[Fixture]>SetUserVariable MyResultr $MyInteger"MyEmptyDouble