コンテンツにスキップ

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)")

関連項目

  • マニュアル/文法/関数
  • マニュアル/文法/値と変数
  • マニュアル/文法/フロー制御