2011年09月05日
061*変数とは*Scripture
こんにちゎ、りのです ^ー^
さて、前回の「059*スクリプト屋になる
ということ*Scripture」でお話した通り、
≫ 059*スクリプト屋になるということ*Scripture
「変数」について解説
していきたいと思います。
もし、わからない用語が出てきたら、
もう 1 つのブログに辞書を用意しておき
ますので、そちらを参考にしてください。
さて、早速、本題の「変数とは何か?」からです
が、変数は一言で表すとスクリプトの記憶領域です。
スクリプトの中でスクリプトに何かをおぼえていてほしいときには、この変数を使います。
(オブジェクトやプリムの名前や※ディスクリプションを
変数領域として使う方法もあるのですが、まずは基本を
解説した上で、別の回に応用として触れようと思います。)
※ディスクリプション … 説明文のことです。
例えば、あなたのショップを訪問したユーザーの名前を後日
に確認する場合、この変数に記憶させておく必要があります。
よく、訪問者を無限に記憶させてほしいだとか、ノートカードに
書き込んでほしい、などといったオーダーがありますが、それは
LSL (セカンドライフのスクリプト) の仕様上、できません。
LSL には、1 つのスクリプトファイルで 64kb までという容量の制限があります。
※ 容量をオーバーすると、「Stack-Heap Collision」というエラーが出ます。
※ 複数のスクリプトファイルを連結して、容量を大きくすることもできます。
※ 容量は、変数の数と内容の大きさ、ソースコードの長さなどによって消費されます。
※ 容量は負荷の目安になると言われています。
※ ちなみに、スクリプトファイルには文字数の制限 (約 3,000 行) もあります。
もし、それ以上の容量を使用しているように見えるスクリプトがあれば、それ
はセカンドライフの外で借りたサーバにデータを預けていることが考えられます。
例えば、アバターの UUID (セカンドライフの全てのものを一意に
識別できる 32 桁の ID) を記録していくだけの (簡潔に書かれた)
スクリプトでしたら、約 100 件程度まで記憶できると思います。
たまに「いつまで記憶してくれるの?」といった質問があります
が、スクリプトは変数の内容を、スクリプトがリセット、※コンパイル
される、もしくは、後述のスコープを出るまで、記憶していてくれます。
※コンパイル … 「保存」を押す、機械語への翻訳作業のことです。
さて、それでは変数の具体的な使い方を解説していこうと思い
ますが、その前にスクリプトの基本的な構造を見てみましょう。
スクリプトの構造を簡潔に書き表すと、
[テキスト (教科書) 1 ~ 36 行目]
グローバル変数の宣言 = 初期値の代入;
[テキスト (教科書) 38 ~ 388 行目]
自作関数(自作関数の引数){
処理;
}
[テキスト (教科書) 390 ~ 923 行目]
default{
[テキスト (教科書) 392 ~ 921 行目]
イベント(イベントの引数){
処理;
}
}
となります。
ここで重要になってくるのが括弧 ({ }, ( ), [ ], < >) の入子構造です。
スクリプト中の括弧 ({ }, ( ), [ ], < >) は、(※文字列として扱う
場合を除いて) 入子構造である必要があり、互い違いに組むことができません。
※文字列として扱う … スクリプトとしてではなく、言葉として扱う場合のことです。
考え方としては、括弧を開くときに開き括弧を積み上げていき、閉じるときには 1 番上に
積まれた開き括弧を取り出して対にするイメージを持ってもらうとわかりやすいと思います。
(この仕組みをスタックと言います。)
特に { } は「ローカル変数のスコープ」にもなるため、意識しておいて
ほしいのですが、※字下げを使うとこの入子構造が見直しやすくなります。
※字下げ … 行頭を Tab で揃え、階層を見やすくする措置のことです。
この入子構造を踏まえた上で、もう一度、スクリプトの基本的な
構造を眺めてみると、default ※ステートが見えてくるはずです。
※ステート … イベントの包みのことです。
「グローバル変数の宣言」と「自作関数の定義」は default ステートより先に書きます。
「イベント」は default ステートの中に、そのイベントの中に「処理」を書きます。
そして、最後の行で default ステートを閉じます。
では、この中のどこで変数が出てくるのかと言うと、「グローバル変数の
宣言」と「自作関数の引数」と「イベントの引数」と「処理」の 4 ヵ所です。
変数には「グローバル変数」と「ローカル変数」があります。
また、変数に近い働きをするものとして「定数」と「引数 (ひきすう)」があるの
ですが、定数はグローバル変数、引数はローカル変数のように扱うことができます。
変数は※宣言する場所とスコープによってグローバル変数とローカル変数
に分けられますが、スクリプトの先頭で宣言し、どの「処理」からでも呼び
出すことができる (全域がスコープの) 変数をグローバル変数と言います。
※宣言 … 変数の使用開始を明示して、記憶領域を確保することです。
それに対してローカル変数は、「処理」の中
で宣言し、宣言した「処理」の中の宣言の次の
行から呼び出すことができるようになります。
また、ローカル変数の呼び出しが可能な範囲のことをスコープと言います。
ローカル変数の名前は、スコープが違えば重複していても構いません。
※ グローバル変数のスコープは全域であるため、同じ名前の変数はつくれません。
例えば、「スクリプトの基本的な構造」図中の「自作関数の定義」の中の「処理」は
「イベント」の中の「処理」のスコープの外であるため、どちらからも呼び出せるのが
グローバル変数で、いずれか一方からしか呼び出せないのがローカル変数だと言えます。
それではローカル変数を使う意味がない、と思うかも知れませんが、※一般
的にコンピューター言語ではローカル変数を使った方が処理は軽くなります。
※一般的に … セカンドライフでは定かではありません。
「イベント」の中の「処理」から自作関数を呼び出しても、
スコープの外であるため、ローカル変数は引き渡されません。
「自作関数」の「処理」を終えると、「イベント」の
中の自作関数を呼び出した次の行から処理を再開しますが、
自作関数を呼び出す前のローカル変数の値は残っています。
定数とは、中の値をかえられない、またはかえない変数のことで、セカンドライフ
側で用意してくれていて宣言しなくても使えるものと自分でつくるものとがあります。
セカンドライフ側が用意してくれている定数は、半角アルファベット
の大文字と _ (半角アンダーバー) を使った名前が付けられています。
例えば、PI という定数には 3.14... (円周率) が入っていて、
宣言しなくてもグローバル変数のように扱うことができます。
引数とは、※イベントや※関数に引き渡される値のことで、(厳密に言うと
変数ではないかも知れませんが、) ローカル変数のように扱うことができます。
※イベント … スクリプトを動かすために検出する何かしらの操作のことです。
※関数 … 処理 (加工) を実行する命令のことです。
イベントや自作関数では、名前の後に続く ( ) の中で宣言 (ただし、イベントの引数
には宣言に順序があります。) し、そのイベントや自作関数の中がスコープとなります。
イベントの引数ならシステムから値が引き渡されますが、自作
関数の引数は呼び出すときに値を渡してあげる必要があります。
テキスト 472 行目を例にすると、
listen(integer channel, string name, key id, string message){
listen はユーザーからの入力 (チャット) を受け取るイベント
なのですが、誰かが発言して、この listen が呼び出されても、
発言者の名前や UUID がわからなければ、複雑な対処ができません。
そこで必要になるのが引数で、name という引数には発言者の名前が自動的に引き渡されます。
また、関数も処理を実行する命令である以上、引数を
引き渡して加工してもらう方が複雑な対処ができます。
テキスト (教科書) を見ながら、何行目が
何かを考えるとわかりやすいかも知れません。
次回は「変数型」について解説しようと思っています。
それでゎまた♪
