C言語利用者のためのヒント¶
概要¶
C言語を知っているプログラマがYAYA(AYA)を学ぶ際に陥りやすい落とし穴をまとめたページ。「マニュアルをよく読めば回避できた過去の失敗メモ」として記述されている。
戻り値の扱い¶
C言語と異なり、return 文は存在しない。関数の戻り値は「これまでに出力された候補から選ばれる」方式。
空文字列が候補に混入していると、無音応答が発生するバグを引き起こす。void やアウトプットファイナライザ -- を活用して防ぐこと。
文字列展開¶
- ダブルクォート
""の中では変数・関数が展開される - シングルクォート
''はリテラル扱い(展開されない) %変数名のような括弧なしのパーセント記法は最長一致展開を行うため計算コストが高い
// 以下は等価
"abc%(hemo)efg"
'abc' + EVAL('hemo') + 'efg'
変数と演算子¶
- ローカル変数は
_(アンダースコア) で始める - グローバル変数はロードをまたいで保持される
- 変数の初期値は空文字列(
0ではない) 文字列 + 数値 = 文字列になる- 未定義変数を
==で空文字列と比較するとtrueが返る
未初期化変数のインクリメントは数値にならず文字列の連結になる:
// _sum が初期化されていないと文字列連結になる
hogehoge
{
// ここに _sum=0 が必要。無いとこの関数の結果は空文字
for _i=0 ; _i<10 ; _i++ {
_sum+=_i
}
_sum
}
制御フロー¶
else ifではなくelseifを使うswitchではなくcase/whenを使う- ループ変数に
_プレフィックスを忘れると無限ループになる
// 誤り(_i がグローバル変数になる)
for i=1; i<10; i++ { ... }
// 正しい
for _i=1; _i<10; _i++ { ... }
ゴーストテンプレートの注意点¶
OnAiTalkはAYA固有。aitalkinterval秒ごとに自動発火するres_reference0に値をセットすると、応答にReference?:ヘッダが追加されるghostexlist/ghostexcountは不正確な場合がある
SAORI(外部DLL)の扱い¶
- SAORIは初回呼び出し時にロードされ、SHIORIシャットダウン時にアンロードされる
- 明示的に終了させたい場合は
UNLOADLIBを使う
動的関数呼び出し¶
// 変数の値に応じて関数を動的に選択
EVAL("func_%(var)")
関連項目¶
- マニュアル/文法/関数
- マニュアル/文法/値と変数
- マニュアル/文法/フロー制御