Skip to content
Silica edited this page Sep 16, 2012 · 2 revisions

#グローバル変数 スクリプト内グローバル変数 ##宣言 global name
空変数として作成される

global type name
type型の変数として作成される

global宣言はスクリプトがその行を実行する度に行われる
同じ名前の変数が再び宣言された場合
前の変数は破棄され新しい変数に置き換えられる
(コンパイルオプションで再宣言に警告を出すことが可能)

##アクセス グローバル変数はあらゆる関数内からアクセス可能である

但し、同じ名前のlocal変数、static変数がある場合はそちらが優先される

##スクリプトのグローバル領域 いかなる関数でもクラスでもない場所
スクリプトの一番外側で定義する関数やクラスはglobal変数である

また、ここで宣言したstatic変数はglobal変数と同一になる

##組み込みのグローバル変数 intやstring等の基本型
nullやtrue等の定数
foreach等の標準ライブラリ関数
arraytable等の標準ライブラリ型
全てはPSLVM構築時に自動的に用意されるグローバル変数である

##PSLVM PSLVMのgetやaddはスクリプト内のグローバル変数を対象とする

##PSL_SHARED_GLOBALコンパイルオプション PSL_SHARED_GLOBALがONの状態(配布状態ではON)では
スクリプト実行上のあらゆる環境で同じグローバル変数を使用する

あらゆる環境とは即ち
PSLVM::run
variable::operator()
である

この機能のお陰で
複数のスクリプトを読み込んでお互いの関数を実行することが可能になったり
C++からPSL関数を呼び出す際に複雑な操作をせずとも良い

が、逆に言えば、他のスクリプトに対して影響を与えたり
標準ライブラリを改変することも可能になってしまう
よってエンドユーザーにスクリプトを開放する場合は
PSL_SHARED_GLOBALをOFFにすることが必要になるかもしれない

PSL_SHARED_GLOBALをOFFにした状態では
variable::operator()を呼び出す場合に環境を渡す必要がある
第一引数にPSLVMのインスタンスを
第二引数に関数に渡す引数としてvariableを渡せば良い
複数の引数を渡す必要がある場合に、環境無しのバージョンと違ってオーバーロードはされていない
func(vm, variable(1, 2, 3)); などの様に対処すること

或いはPSLVMにcallメソッドが追加されるので
vm.call(func, arg);
とすればvmの環境を使ってfunc関数をarg引数で呼び出すことが出来る
func(vm, variable(1, 2, 3));

vm.call(func, variable(1, 2, 3));
は同じ意味である

また、その場合でも環境なしでvariable::operator()を呼び出すことも可能である
その場合、中で一時環境が作られ、最低限の基本型だけが組み込まれる

Clone this wiki locally