チートシート
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) // 要素数
ハッシュ(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 して返すので、式の動作確認に使えます(基礎設定)。
詳細は基礎設定。
よく使う関数
全部の一覧はシステム関数一覧にあります。
関連