Go Language Specification輪読会に参加した
2020-10-16
Techたまたま時間の都合ができたので、前から気になっていたGo Language Specification輪読会に参加してみた。今回はExpressionsの冒頭を読んだ。
面白かったのは、 if u = User{}; true {
のようにifのあとに中括弧を書くとエラーになるという話。
Goの中括弧はブロックを示す場合と、composite literalを示す場合がある。のだが、上記の場合はどちらなのか決定できない。そのため、ifの直後はパーサが特別なモードになっていて、中括弧は必ずブロックと見なすらしい。その結果、上記は(EBNF上はvalidにもかかわらず)エラーになるというわけ。
ちなみに以下のようにまぎらわしい箇所を括弧でくくってやると通る。
if u = (User{}); true {
CやJavaScriptではifのあとに括弧が要るからこういう問題は起こらない。Goでは括弧をなくした代わりにパーサが状態を持つようになったというわけ。
Rubyではこういうのが無数にあるんだけど、Goにもあるのが意外で面白かった。