コンテンツにスキップ

チートシート

YAYA の書き方を 1 ページにまとめた早見表です。くわしい説明は、各項目のリンク先を見てください。

YAYA の考え方

  • 辞書は関数の集まりです。名前 { ... } の形で定義し、OnBoot のようにイベント名にすると、そのイベントの応答になります。
  • 関数の中の式や文字列が 1 行ずつ「出力の候補」になります。関数が呼ばれると、候補の中から 1 つがランダムに選ばれて返ります。代入(_a = 1)のような文は候補になりません。
  • 文字列は "..." で囲みます。さくらスクリプトも文字列なので、必ず囲みます。
  • 変数は型を持ちます(整数・実数・文字列・配列・ハッシュ)。宣言は要りません。_ で始まる名前はローカル変数です。
  • 関数の外には、文も変数も書けません。#define などのプリプロセッサだけは外に書けます。
  • if while の条件式は、カッコで囲んでも囲まなくても構いません(if (_a == 1) も if _a == 1 も同じ)。for foreach もヘッダ全体を ( ) で囲めます(Tc603-6 以降。それ以前はエラー)。
  • 記号は半角で書きます(全角の ( や + は使えません)。

関数の書き方

OnBoot
{
  _name = "さくら"
  "\0\s[0]こんにちは、%(_name)さん。\e"
  "\0\s[0]起動しましたね。\e"
}
  • 上の例では、"\0\s[0]こんにちは…" と "\0\s[0]起動しましたね。\e" のどちらかがランダムに返ります(_name = … は候補になりません)。
  • 候補は 1 行に 1 つです。"a" "b" のように 1 行に並べるとエラーになります。"a" / "b" の / は割り算で、候補の区切りではありません。
  • 単独の行に -- を書くと、前後の候補を別々のグループとして、それぞれから 1 つずつ選んでつなぎます(関数)。
  • { は関数名と同じ行にも、次の行にも書けます。
  • コメントは // 行末まで と /* 複数行 */ です。
  • 1 行に複数の文を書くときは ; で区切ります(_a = 1 ; _b = 2)。

引数と返り値

書き方 意味
Func(1, "a") 引数つきで呼び出す。引数なしなら Func だけでよい
_argv[0] _argv[1] 受け取った引数(0 始まり)
_argc 引数の数
Func(&_v) 変数を参照渡し。Func の中で _argv[0] = 99 とすると _v が変わる
return 関数をここで終える。それまでの候補から 1 つを返す
return 式 それまでの候補をすべて捨てて、式の値を返す(Tc573-1以降)

候補の選び方

関数名の後ろに : で付けます(Seq : sequential)。

指定 動き
(なし) 候補からランダムに 1 つ
nonoverlap 前回と同じ候補を続けて選ばない
sequential 上から順に返し、最後まで行ったら戻る
array 候補をすべて汎用配列にして返す
void 中身は実行するが、何も返さない
all 候補をすべてつないだ 1 つの文字列を返す(Tc567-1以降)
last 最後の候補を返す(Tc567-1以降)

選択方式とは別に、次の修飾子も付けられます。

指定 動き
_pool 内側のブロック(if の中身を含む)の候補をばらして、外側の候補と同じ確率で選ぶ
_pool_nonoverlap _pool_sequential ばらした候補全体に、重複回避や順番の選択を使う
melt_ 選んだ出力が汎用配列なら、要素をばらして外側のブロックの候補に加える
OnTest : _pool
{
  "x"
  {
    "y"
    "z"
  }
}
  • _pool がないと、内側の { } は全体で 1 つの候補です(x が 1/2、y z が 1/4 ずつ)。_pool を付けると x y z が 1/3 ずつになります。
  • if の条件が偽なら、その中身の候補は加わりません。if 条件 { "b" "c" } で「条件が真のときだけ候補が増える」書き方ができます。
  • while for foreach の中の候補は、繰り返すたびに 1 つずつ加わります。
  • nonoverlap : { のように選択方式を書いたブロックは、ばらされず 1 つの候補のままです。

詳細は関数。

値と型

種類 書き方 例
整数 10 進・0b(2 進)・0x(16 進)。64 ビット 10 0b1010 0xa
実数 小数点を付ける 3.14
文字列 "..."(展開あり)、'...'(展開なし) "a%(_x)" 'a%(_x)'
複数行の文字列 <<" … ">>(展開あり)、<<' … '>>(展開なし)
汎用配列 (1, "a", 2.5) 配列
簡易配列 カンマ区切りの文字列 "a,b,c" 同上
ハッシュ IHASH("キー", 値, …)(Tc600-3以降) ハッシュ
VOID 未定義の変数・範囲外の要素 文字列なら空、数値なら 0
  • 文字列の中の " は、重ねて書きます("1""2" → 1"2)。
  • 型は GETTYPE で調べます(VOID は 0、整数は 1、実数は 2、文字列は 3、汎用配列は 4、ハッシュは 5)。
  • 実数を文字列にすると小数点以下 6 桁になります(3.0/4*100 → 75.000000)。
  • 整数同士の割り算は切り捨てです(4/3 → 1)。片方を実数にすると実数になります。

変数

書き方 意味
_a = 1 ローカル変数。その関数の中(と内側のブロック)だけで有効。ブロックを抜けると消える
a = 1 グローバル変数。どの関数からも使える。終了時に自動で保存され、次の起動で復元される
ERASEVAR("a") グローバル変数を消す
_a++ _a-- _a += 2 加算・減算・複合代入(-= *= /= %= もある)
  • 未定義の変数は、計算では 0、文字列では空文字列になります(UNDEF + 1 は 1)。
  • 数字で始まる名前や、予約語・関数名と同じ名前は使えません(予約語)。

演算子

優先度の高い順です(算術演算)。

種類 演算子
カッコ・添字 ( ) [ ]
否定 !
増減 ++ --
乗除 * / %
加減 + -
比較 == != >= <= > < _in_ !_in_
論理 && ||
代入 = += -= *= /= %= ,=
カンマ(配列を作る) ,
  • 0 が偽、0 以外が真です。比較の結果は 1 か 0 です。
  • "or" _in_ "World" は、右の文字列に左が含まれるとき 1 になります。
  • + は、どちらかが文字列なら連結です("5" + 1 は "51")。* は数値として計算します("5" * 2 は 10)。
  • == は大文字と小文字を区別します("abc" == "ABC" は 0)。
  • 三項演算子(? :)はありません。

制御構造

if _a < 3
{
  "小"
}
elseif _a < 10
{
  "中"
}
else
{
  "大"
}
やりたいこと 書き方
2 分岐・多分岐 if / elseif / else(ネストした if 以外では、1 文なら { } を省略できる)
値で分岐 case 式 { when 値 { … } when 値1, 値2 { … } others { … } }
位置で選ぶ switch 式 { 候補0 候補1 … }(候補は 1 行に 1 つ。0 始まり)
条件で繰り返す while 条件 { … }
回数で繰り返す for _i = 0 ; _i < 10 ; _i++ { … }(3 つの部分はすべて必須。Tc603-6以降はヘッダ全体を ( ) で囲める)
配列を順に回す foreach 配列 ; _v { … }
キーと値を回す foreach 配列またはハッシュ ; _k, _v { … }(Tc600-3以降)
ループを抜ける・次へ break / continue
case _name
{
  when "さくら" { "さくらだね" }
  when "うにゅう", "うに" { "うにゅうだね" }
  others { "だれ?" }
}
  • case の when にはリテラルだけが書けます(変数や式は不可)。範囲は 3-5 や "a"-"d" と書きます。
  • when と others は、case 式 に続く { } の中に書きます。{ を付けずに when を続けると、読み込み時にエラー(E0051)になります。
  • ループの繰り返し回数には上限があります(既定は 10000 回。looplimit)。超えると OnLoopLimit が呼ばれます。
  • while 1 は無限ループです。必ず break を書いてください。

文字列への埋め込み

書き方 意味
"%(_a)" "%(1+2)" 式を評価して埋め込む(範囲付き展開)
"%_a" 名前の最長一致で埋め込む。実行時に名前を探すので遅い
'%(_a)' シングルクォートなら展開しない

詳細は文字列埋め込み。

配列

_a = (10, 20, 30)
_a[1]            // 20
_a[0,1]          // 範囲(10,20)
_a ,= 40         // 末尾に追加
_a = ("先頭", _a) // 先頭に追加
_a + "!"         // 全要素に演算(10!,20!,…)
ARRAYSIZE(_a)    // 要素数
  • 範囲外の要素は VOID です(GETTYPE(_a[9]) は 0)。
  • 簡易配列は文字列のまま添字で読み書きします(_s = "a,b,c" → _s[1] は b)。区切りは _s[1,"|"] のように指定します。
  • 配列の要素は ARRAYSIZE、検索は ASEARCH、並べ替えは ASORT、分割は SPLIT を使います。

ハッシュ(Tc600-3以降)

_h = IHASH("name", "さくら", "age", 16)
_h["name"]        // さくら
_h["age"] += 1    // 複合代入も使える
_h["none"]        // VOID(キーが無い)
foreach _h ; _k, _v { … }
  • ハッシュは、先に IHASH() で作っておく必要があります。
  • 要素はキーの順に並びます(入れた順ではありません)。
  • 要素には配列やハッシュも入れられます(値の入れ子)。

プリプロセッサ

書き方 意味
#define 前 後 そのファイルの、この行より後ろの文字列を置き換える
#globaldefine 前 後 これ以降に読み込むすべての辞書で置き換える
#ifdef 名前 … #else … #endif 名前が定義されていれば読み込む(Tc574-2 / Tc602-2以降)
__AYA_SYSTEM_YAYA6__ 600 系なら定義されている(500 系と共用の辞書に使う)
__AYA_SYSTEM_FILE__ __AYA_SYSTEM_LINE__ __AYA_SYSTEM_FUNC__ ファイル名・行番号・関数名に置き換わる

詳細はプリプロセッサ。

設定ファイル(yaya.txt)

dic, basis.dic
charset, UTF-8
log, executelog.txt
設定 意味
dic, ファイル 辞書を読み込む(dicif は存在するときだけ、dicdir はフォルダ内のすべて)
charset, UTF-8 文字コード(charset.dic などで用途別にも指定できる)
log, ファイル 実行ログを出す
fncdepth, 数 関数呼び出しの深さの上限(既定 32)
looplimit, 数 ループの回数の上限(既定 10000)
embed.lazy, off "%名前" の名前を読み込み時に確定する(既定 on は実行時に探す)
  • 設定ファイルは DLL 名に .txt を付けた名前です(yaya.txt)。// と /* */ でコメントが書けます。
  • 設定ファイルが無い、または読み込む辞書が 1 つも無いと、シェルモードになります。送った式をそのまま EVAL して返すので、式の動作確認に使えます(基礎設定)。

詳細は基礎設定。

よく使う関数

全部の一覧はシステム関数一覧にあります。

用途 関数
型を調べる・変える GETTYPE CVINT CVSTR CVREAL
配列 ARRAYSIZE ASEARCH ASORT SPLIT
ハッシュ IHASH HASH_KEYS HASH_EXIST
文字列 STRLEN SUBSTR STRSTR REPLACE
式を文字列から実行 EVAL
変数を消す ERASEVAR
乱数 RAND
ファイル FOPEN FREAD FCLOSE

関連