こんにちは、びしょ〜じょです。イベントに複数行ったらお金がなくなりました。


1. はじめに

Lua 5.3.3がリリースされました。

diffu-lua-5.3.2-lua-5.3.3

5.3.2からのアップデートなのでbug fix だけ かと思いきや…。

2. new semantics for empty matches ("python rule")

Lua 5.3.3-rc1のリリースではこんな感じのことが書かれてました。

Re: [ANN] Lua 5.3.3 (rc1) now available

  • new semantics for empty matches ("Python rule")

なるほど。ところで以下のようなコードを考える。

for k in ("a,,b,c"):gmatch"[^,]*" do
    print(k)
end

Lua5.3.2までは以下のようになる。

$ lua
Lua 5.3.2  Copyright (C) 1994-2015 Lua.org, PUC-Rio
> for k in ("a,,b,c"):gmatch"[^,]*" do
>   print(k)
> end
a


b

c

さて、"python rule"なLua 5.3.3では。

$ lua533
Lua 5.3.3  Copyright (C) 1994-2016 Lua.org, PUC-Rio
> for k in ("a,,b,c"):gmatch"[^,]*" do
>   print(k)
> end
a

b
c

文字通り、Lua 5.3.3ではempty matchにpython ruleを適用しているようですね。

3. python rule is 何

Pythonに明るくないので、python ruleがよくわからなかった。検索してみても出てこなかったので、まぁ、"empty matchはPythonでのように扱われる"という話です。

いやPython知らんのでどうなるか分からんのだが。

3-1. case1: gmatch

ということで上記を見てみます。 "a,,b,c"gmatch()"[^,]*"にマッチする文字列を次々取り出すファクトリー(イテレーター)となり、kに値を渡して出力していく。

3-1-1. before 533

  1. "a,,b,c"を見ていき、"a"にマッチし、出力します。
  2. ",,b,c"を見ていき、マッチしないのでk""を渡し、長さ0の文字列を出力します。
  3. ",b,c"を見ていき、同上
  4. "b,c"を見ていき、"b"にマッチするので略
  5. ",c"を見ていき、0 length
  6. "c"を見ていき略
  7. ""を見ていき、マッチしないので0len出力
  8. ファクトリーが全てを消費したのでforループが終了。

3-1-2. after 533

操作自体は同じだが…。

  1. "a,,b,c"を見ていき、"a"にマッチし、出力。
  2. (?) ",,b,c"を見ていき、""を出力?
  3. (?) ",b,c"を見ていき何もしない?
  4. "b,c"を見ていき、"b"
  5. (?) ",c"を見ていき、マッチしないので何もしない…?
  6. "c"を見ていき、"c"を出力
  7. (?) "" を見ていき…??
  8. for終了

よくわからないですね!! もすうこし見てみます。

3-2. case2: gsub

置換してみます。こんな感じ。

print(("a12b3c"):gsub("[^0-9]*", "X"))

3-2-1. before 533

まず、以下の結果が得られる。

$ lua
Lua 5.3.2  Copyright (C) 1994-2015 Lua.org, PUC-Rio
> print(("a12b3c"):gsub("[^0-9]*", "X"))
XX1X2XX3XX      7

3-2-2. after 533

$ lua533
Lua 5.3.3  Copyright (C) 1994-2016 Lua.org, PUC-Rio
> print(("a12b3c"):gsub("[^0-9]*", "X"))
X1X2X3X 4

どちらも よくわからないですね!!

4. おわりに

メーリングリストでもこの変更に関しては"Lua 5.4でやれ"という意見もあったんですがリリースしてしまいましたね。 みなさん気をつけてください。ボクは今月お金がないので食費に気をつけます。