Luaの区間
Luaの添え字が1から始まることは衆人の知るところである。毀誉褒貶について、私は知らない。添え字を1から始めるとLuaの仮装機械と標準ライブラリが喜ぶということを、私は知る。
それはさておき。
不要なメモリの確保は絶対悪である。もちろん、絶対悪などという言葉は存在しない。訂正しよう。不要なメモリの確保は単なる悪である。
だから、メモリの区間を指定する。C++ならば[first, last)
が一般的だ。last - first
によって(差の演算が許されていたならば)距離を計算できて便利だ。
Luaでは[i, j]
であることは衆人の知るところである。そろそろ衆人の意味が崩壊しているけれど、気にせずともよろしい。閉区間である。
本物のLuaの区間の話をしよう。
[i, j]
の解釈について、いくつかの規則がある。以下では、区間が対象とする文字列やシークエンスの長さをn
とする。また、i
およびj
はnil
または整数であるとする。
i==nil
ならば、エラーになるか既定値が用いられるstring.byte
の既定値は1
である。string.sub
はエラーになる
j==nil
ならば、エラーになるか既定値が用いられるstring.byte
の既定値はi
である。string.sub
の既定値はn
である。
i<0
ならば、i=n+i+1
に変換されるj<0
ならば、j=n+j+1
に変換されるi<1
ならば、i=1
に修正されるj>n
ならば、j=n
に修正されるi>j
ならば、空の区間である
くだくだしく書いた。しかし、lstrlib.c
のstr_sub
の実装を見たほうが早い。