Luaの区間

Luaの添え字が1から始まることは衆人の知るところである。毀誉褒貶について、私は知らない。添え字を1から始めるとLuaの仮装機械と標準ライブラリが喜ぶということを、私は知る。

それはさておき。

不要なメモリの確保は絶対悪である。もちろん、絶対悪などという言葉は存在しない。訂正しよう。不要なメモリの確保は単なる悪である。

だから、メモリの区間を指定する。C++ならば[first, last)が一般的だ。last - firstによって(差の演算が許されていたならば)距離を計算できて便利だ。

Luaでは[i, j]であることは衆人の知るところである。そろそろ衆人の意味が崩壊しているけれど、気にせずともよろしい。閉区間である。

本物のLuaの区間の話をしよう。

[i, j]の解釈について、いくつかの規則がある。以下では、区間が対象とする文字列やシークエンスの長さをnとする。また、iおよびjnilまたは整数であるとする。

  1. i==nilならば、エラーになるか既定値が用いられる
    • string.byteの既定値は1である。
    • string.subはエラーになる
  2. j==nilならば、エラーになるか既定値が用いられる
    • string.byteの既定値はiである。
    • string.subの既定値はnである。
  3. i<0ならば、i=n+i+1に変換される
  4. j<0ならば、j=n+j+1に変換される
  5. i<1ならば、i=1に修正される
  6. j>nならば、j=nに修正される
  7. i>jならば、空の区間である

くだくだしく書いた。しかし、lstrlib.cstr_subの実装を見たほうが早い。