Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

変数・スコープ

会話に「記憶」を持たせたいときは、変数の出番ですわ。 一時的なもの、永続するもの、ベースウェアと共有するもの――三種を使い分けますの。 スコープを制する者がゴーストを制する、と申しておきましょう。


変数は (または $)マーカーで宣言・参照する。Pasta には有効範囲(スコープ)の異なる 3 種類の変数がある。代入の値には式や関数呼び出しも使える。

変数の種類とスコープ

スコープ代入参照有効範囲
ローカル$var_name=値$var_name一連のシーンが終わるまで
グローバル$*var_name=値$*var_name永続的
プロパティ$%prop.path=値$%prop.pathSSP 共有プロパティ(ベースウェア管理)

代入の区切りはコロン()でも代入演算子()でも記述できる。

初期化
    score:100
    ユーザー:太郎
    is_active:true

ローカル変数

一連のシーンが終わるまで有効な変数。$変数名 で参照する。

ローカル変数=10
Alice:値は $ローカル変数 です

グローバル変数

$* 修飾子を付けると、永続的に有効なグローバル変数になる。Lua 側では save. に対応する。

*グローバル変数=100
Bob:値は $*グローバル変数 です

プロパティ変数

$% で SSP 共有プロパティを読み書きする。プロパティ ID はドット(.)を含められ、sakura.namebaseware.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 も参照。