変数・スコープ
会話に「記憶」を持たせたいときは、変数の出番ですわ。 一時的なもの、永続するもの、ベースウェアと共有するもの――三種を使い分けますの。 スコープを制する者がゴーストを制する、と申しておきましょう。
変数は $(または $)マーカーで宣言・参照する。Pasta には有効範囲(スコープ)の異なる 3 種類の変数がある。代入の値には式や関数呼び出しも使える。
変数の種類とスコープ
| スコープ | 代入 | 参照 | 有効範囲 |
|---|---|---|---|
| ローカル | $var_name=値 | $var_name | 一連のシーンが終わるまで |
| グローバル | $*var_name=値 | $*var_name | 永続的 |
| プロパティ | $%prop.path=値 | $%prop.path | SSP 共有プロパティ(ベースウェア管理) |
代入の区切りはコロン(:)でも代入演算子(=)でも記述できる。
*初期化
$score:100
$ユーザー:太郎
$is_active:true
ローカル変数
一連のシーンが終わるまで有効な変数。$変数名 で参照する。
$ローカル変数=10
Alice:値は $ローカル変数 です
グローバル変数
$* 修飾子を付けると、永続的に有効なグローバル変数になる。Lua 側では save. に対応する。
$*グローバル変数=100
Bob:値は $*グローバル変数 です
プロパティ変数
$% で SSP 共有プロパティを読み書きする。プロパティ ID はドット(.)を含められ、sakura.name や baseware.version などをそのまま記述できる。
$%sakura.name=Alice # プロパティへ書き込み
$name=$%sakura.name # プロパティから読み込み
さくら:$%sakura.name # インライン参照
変数参照の空白ルール
会話行の中で変数を展開するには、$変数名 の直後に1 文字以上の空白を置く。
*表示
$ユーザー:太郎
ぱすた:$ユーザー さん、こんにちは!
重要: 空白がないと最長一致で変数名を解釈し、後続の文字まで変数名に取り込んでしまう。意図しない動作を避けるため、変数参照の直後には必ず空白(または識別子に含まれない記号)を置く。
式(Expression)のサポート
変数代入では式を記述できる。代入可能な値は次のとおり。
| 値の種類 | 構文例 | 説明 |
|---|---|---|
| リテラル値 | $score=100 | 数値・文字列リテラル |
| 単語参照 | $value=@word_name | 登録済み単語の参照 |
| 変数参照 | $new=$old | 他の変数の値をコピー |
| 式 | $result=$a + $b * 2 | 算術式 |
| ローカル関数呼び出し | $r=@calculate() | SCENE.calculate(act) の戻り値 |
| グローバル関数呼び出し | $r=@*calculate() | GLOBAL.calculate(act) の戻り値 |
| 関数呼び出し(引数付き) | $sum=@add(x:10 y:20) | 名前付き引数で呼び出し |
$calc=($x + $y)* 2 # 括弧による優先順位制御
対応する算術演算子は キーワード・マーカー を参照。複雑な演算や条件判定は Lua ブロックで関数化できる。
関数スコープの展開先
| DSL 構文 | Lua 展開先 | 説明 |
|---|---|---|
@func() | SCENE.func(act) | ローカルスコープ(シーン内) |
@*func() | GLOBAL.func(act) | グローバルスコープ(永続領域) |
@* のグローバルスコープは、変数 $* → save. と対称の構造である。
式文(ExprStmt)
代入を伴わず、式の評価(副作用)だけを行うには $=expr と書く。変数名を省略し、結果を捨てる。
$=@副作用関数() # ローカル: SCENE.副作用関数(act)
$=@*グローバル副作用() # グローバル: GLOBAL.グローバル副作用(act)
var_set の全バリアント(ローカル・グローバル・式文)はすべて $ で始まり、変数操作のシグナルとして一貫して認識される。
スコープを使い分ければ、ゴーストは過去を覚え、世界と繋がりますわ。 次は会話に多様性を生む「単語定義」へ。ランダムの魔法をご覧に入れましょう!
権威的仕様: 変数・スコープの厳密な定義は doc/spec/09-variables.md を参照。式の構文は doc/spec/01-grammar-model.md も参照。