- 目次ページに戻る / 前 / 次
- 前回からの差分をまとめて見る
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) に変えました。
メモ 2024-01-08 / C++ の try
『コーディングを支える技術――成り立ちから学ぶプログラミング作法』によれば、C++ の try { ... } catch { ... }
の try は飾りなのだそうです(p68)。
C++設計者の Bjarne Stroustrup によれば、try はわかりやすくするためのただの飾りだそうです。
詳しくは『C++の設計と進化』を読むと良いようです。