vm2gol v2 (62) case 文の構文を変更 / standardrb に変更



case 文の構文を変更

変更前はこうでした。

case {
  (current_val == 0) {
    case {
      (count == 3) {
        set next_val = 1;
      }
    }
  }
  (0 == 0) {
    case {
      (count == 2) {
        set next_val = 1;
      }
      (count == 3) {
        set next_val = 1;
      }
    }
  }
}

case { ... } の波括弧はなくてもよさそうですね。なくてもパースできそう。外してみましょう。

case
(current_val == 0) {
  case
  (count == 3) {
    set next_val = 1;
  }
}
(0 == 0) {
  case
  (count == 2) {
    set next_val = 1;
  }
  (count == 3) {
    set next_val = 1;
  }
}

ネストが減り、 } がなくなることで行数も減ってすっきりします。

パースの都合としてはこれでも問題ないのですが、各分岐の先頭にキーワードを置いた方が見た目的に落ち着きがいいかも?

when を書くようにしてみます。

case
when (current_val == 0) {
  case
  when (count == 3) {
    set next_val = 1;
  }
}
when (0 == 0) {
  case
  when (count == 2) {
    set next_val = 1;
  }
  when (count == 3) {
    set next_val = 1;
  }
}

ふむ、良いのでは。ということで今回このように変更しました。

ちなみに、なぜ最初からこの形にしていなかったのかというと、 多少冗長でも case { ... } のように波括弧があった方が case 文の範囲が分かりやすくて良いのではないか(パース処理で面倒なことを考える必要が減るのではないか)という、初心者の素朴な直観みたいなものがあったためです。

実用を目指しているわけではなく(自分の)教育用を想定した言語なので、そういう初心者目線の感覚は大事にしたい……という気持ちもあってちょっと悩んだのですが、実装も少しだけシンプルになりますし、変えてしまいました。


パーサの変更はこれだけ:

--- a/vgparser.rb
+++ b/vgparser.rb
@@ -258,6 +258,7 @@ def parse_while
 end
 
 def _parse_when_clause
+  consume "when"
   consume "("
   expr = parse_expr()
   consume ")"
@@ -272,16 +273,12 @@ end
 def parse_case
   consume "case"
 
-  consume "{"
-
   when_clauses = []
 
-  while peek().value != "}"
+  while peek().value == "when"
     when_clauses << _parse_when_clause()
   end
 
-  consume "}"
-
   [:case, *when_clauses]
 end

standardrb に変更

RuboCop を導入したはいいものの、微妙に放置気味でしたし、 この程度の規模のプロジェクトには大げさな感じがして、Standard (standardrb) に変えました。