不具合の修正
- 1回のリクエストで APPEND_RUNTIME_DIC / DICLOAD / DICUNLOAD / UNDEFFUNC を2回以上呼ぶと、エラー(E0100)になったり解放済みのメモリを使ったりするのを直した
- DICUNLOAD / UNDEFFUNC のあと、実行中の関数から別の関数を呼ぶと違う関数が動くことがあるのを直した
- FUNCDECL_WRITE の setter の中や代入の右辺でグローバル変数が増えると、解放済みのメモリに書き込むのを直した(ERASEVAR の destorier も同様)
- GETSECCOUNT に4つの引数を渡すと、引数が全部無視されて現在時刻になるのを直した
- gcc でのビルド(Linux / macOS など)で、文字列などを種にした SRAND の乱数列が参照実装と違っていたのを直した
- 辞書のヒアドキュメントで、閉じの
'>>の直後の1文字が消えていた('>>;と続けると壊れる)のを直した - 構文エラーの式で、E0022 や E0029 のあとに余分に出ていた E0083(内部エラー20)を出さないようにした
速度の改善
- セーブファイルの読み書きに要素数の2乗の時間がかかっていたのを直した(40000要素の配列2つで、読み込みが約22.6秒から約0.1秒に)
- 文字列の
+=を繰り返すと2乗の時間がかかっていたのを直した(40万回で約113秒から約0.3秒に)
動作の変更
- INSERT: 負の位置は末尾から数え、範囲外の位置は先頭か末尾に寄せるようにした(それまではエラーで処理が中断していた)。挿入する値が数値でも挿入するようにした
- 汎用配列の範囲外と VOID への
[ ]の読み出しを、未定義の変数と同じく VOID にした(それまでは空文字列)。範囲指定の読み出しが範囲外のときは空の範囲になる - システム関数に知らない文字コード名を渡すと、OSのデフォルトで続けずに警告 W0012 で失敗するようにした(CHARSETTEXTTOID は -1 を返す)。DICLOAD で数値の文字コードIDが無視されていたのも直した
- セーブファイルの実数を、小数6桁に丸めず元の値に戻せる桁数で保存するようにした。無限大と NaN も保存できる。指数表記は使わないので、以前の版でも読める
- EVAL に渡すコードの中でヒアドキュメントを使えるようにした
- FUNCDECL_READ / FUNCDECL_WRITE / FUNCDECL_ERASE で、変数がまだ無いときは空の変数を作ってから登録するようにした(それまでは何もせず0を返していた)