Lua 5.3.3 release - 変更に"python rule"とありますが -
こんにちは、びしょ〜じょです。イベントに複数行ったらお金がなくなりました。
1. はじめに
Lua 5.3.3がリリースされました。
5.3.2からのアップデートなのでbug fix だけ かと思いきや…。
2. new semantics for empty matches ("python rule")
Lua 5.3.3-rc1のリリースではこんな感じのことが書かれてました。
- 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
-
"a,,b,c"
を見ていき、"a"
にマッチし、出力します。 -
",,b,c"
を見ていき、マッチしないのでk
に""
を渡し、長さ0の文字列を出力します。 -
",b,c"
を見ていき、同上 -
"b,c"
を見ていき、"b"
にマッチするので略 -
",c"
を見ていき、0 length -
"c"
を見ていき略 -
""
を見ていき、マッチしないので0len出力 - ファクトリーが全てを消費したので
for
ループが終了。
3-1-2. after 533
操作自体は同じだが…。
-
"a,,b,c"
を見ていき、"a"
にマッチし、出力。 - (?)
",,b,c"
を見ていき、""
を出力? - (?)
",b,c"
を見ていき何もしない? -
"b,c"
を見ていき、"b"
- (?)
",c"
を見ていき、マッチしないので何もしない…? -
"c"
を見ていき、"c"
を出力 - (?)
""
を見ていき…?? -
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でやれ"という意見もあったんですがリリースしてしまいましたね。 みなさん気をつけてください。ボクは今月お金がないので食費に気をつけます。