【Ruby 3.4 Advent Calender】デフォルトのパーサーが Prism になる?かも?【24日目】
Ruby 3.4 Advent Calender 24日目の記事です。
これはなに
今年 2024年12月25日にリリースされる予定の Ruby 3.4 の新機能や変更点などを1つずつ紹介していく Advent Calender になります。
基本的には NEWS に載っている機能を紹介すると思うんですがここにない機能についても書くかもしれません。
また、記事を書いてる時点ではまだ Ruby 3.4 はリリースされる前なので Ruby 3.4 がリリースされた時点で機能が変わっている 可能性があるかもしれないので注意してください。
記事のまとめは ここを参照 してください。
デフォルトのパーサが Prism になる、かも?
Ruby 3.4 からデフォルトのパーサーが Prism になる?かも?知れません?
Prism とは parse.y に変わる次世代の Ruby のパーサーになります。
かも?と曖昧に言ってるのは開発版の Ruby 3.4-dev のデフォルトのパーサーが Prism になっているのは『実験的にデフォルトのパーサーを Prism にして検証する』みたいな立ち位置なので Ruby 3.4 に入るかどうかはまだ(少なくとも起因となったチケットでは)名言されていないからです。
matz も以下のように書いています。
Prism needs quality and for that it needs to be experimented with on a wider scale. For that reason, I agree with making Prism the default in previews (when Prism passes all tests). Whether it will eventually become the default in 3.4 depends on quality.
まあ〜とはいえ、流石にこのタイミングで切り戻ししないやろガハハ!という気持ちでいま書いています。
bugs.ruby を見てもパッと見、Prism 関連でクリティカルなバグ報告は来てないはず、多分。
デフォルトのパーサが Prims になるとどうなる?
とりあえず、わかりやすいところでいうとシンタックスエラーになった際の出力結果が変わります。
例えば以下のような感じです。
# test.rb
# Ruby 3.3
$ RBENV_VERSION=3.3.6 ruby -v test.rb
ruby 3.3.6 (2024-11-05 revision 75015d4c1f) [x86_64-linux]
test.rb: --> test.rb
Unmatched `(', missing `)' ?Unmatched keyword, missing `end' ?
> 1 def foo(
test.rb:1: syntax error, unexpected end-of-input, expecting ')' (SyntaxError)
def foo(
^
# Ruby 3.4
$ RBENV_VERSION=3.4-dev ruby -v test.rb
ruby 3.4.0dev (2024-12-18T08:14:54Z master 8417d09f93) +PRISM [x86_64-linux]
test.rb: --> test.rb
Unmatched `(', missing `)' ?
Unmatched keyword, missing `end' ?
> 1 def foo(
test.rb:1: syntax errors found (SyntaxError)
> 1 | def foo(
| ^ expected an `end` to close the `def` statement
| ^ unexpected end-of-input, assuming it is closing the parent top level context
| ^ unexpected end-of-input; expected a `)` to close the parameters
Prism のほうが情報量が多いですね。
また、一部のエラーにハイライトが適用されます。
これは NO_COLOR
で非ハイライトにすることもできます。
以前の parse.y を利用する場合は --parser=
で制御することもできます。
$ RBENV_VERSION=3.4-dev ruby --parser=parse.y -v test.rb
ruby 3.4.0dev (2024-12-18T08:14:54Z master 8417d09f93) [x86_64-linux]
test.rb: --> test.rb
Unmatched `(', missing `)' ?
Unmatched keyword, missing `end' ?
> 1 def foo(
test.rb:1: syntax error, unexpected end-of-input, expecting ')' (SyntaxError)
def foo(
^
と、言う感じで期待半分不安半分なところではあるんですが、楽しみではありますねー。
実際に Ruby 3.4 がリリースされた時にはどうなっているのか…。
Discussion