虚無庵

徒然なるままに

Fukuoka.rb #232 を開催した

fukuokarb.connpass.com

第一部担当です。

今回やったこと

  • Array.new の真実をつきとめた
  • ふつうのコンパイラ作りを始めた

Array.new の真実をつきとめた

Ruby で二次元配列を作りたい場合

a = Array.new(3, [])

とかってしません?これにハマりました。

irb(main):001:0> a = Array.new(3, [])
=> [[], [], []]
irb(main):002:0> a[0] << 1
=> [1]
irb(main):003:0> a
=> [[1], [1], [1]]
irb(main):004:0> a = Array.new(3) { [] }
=> [[], [], []]
irb(main):005:0> a[0] << 1
=> [1]
irb(main):006:0> a
=> [[1], [], []]
irb(main):007:0> 

これをうづらさんから教えてもらった時は「まじかよ!?」と思ったね。思っちゃったね。

別口で watson1978 さんから「Array.new で作成した配列に格納される各アイテムが同一のオブジェクト(object_id が同じ)となる」と教えていただきました。

irb(main):001:0> a = Array.new(3, [])
=> [[], [], []]
irb(main):002:0> a.each {|item| p item.object_id}
260
260
260
=> [[], [], []]

Ruby 全然分からん。

docs.ruby-lang.org

ary = Array.new(3, "foo")
p ary                     #=> ["foo", "foo", "foo"]
ary[0].capitalize!
p ary                     #=> ["Foo", "Foo", "Foo"]  (各要素は同一のオブジェクトである)

リファレンスにもちゃんと書いてあった。

ふつうのコンパイラ作りを始めた

youtu.be

The curent parse.y is a hell

Ruby のパーサーがやばいというのは RubyKaigi 2019 の nagachika さんのトークで初めて認識したのだが、今年の RubyKaigi で

Python がパーサーを PEG に置き換えた

という話を聞いて、個人的に非常に危機感を感じた。以前に書いた記事

職場でも勘違いされているのだが、俺は Ruby というプログラミング言語が好きではない。俺はプログラミングをすることそのものが好きなのであり、Ruby は数ある選択肢のうちの一つでしかない。

Fukuoka.rb が継続して活動できるように尽力したいと考えている。

と書いている通り、Fukuoka.rb が好きなのであって Ruby というプログラミング言語が好きなのではない。ただ Fukuoka.rb が元気に活動するためには Ruby に元気でいてもらわないと困る。

”現在 Ruby のパーサーはなかださん一人でメンテナンスしており誰も引き取れない状況にある”という解釈していて、いま個人的な目標は「パーサーのメンテナンスをなかださんから引き剥がして誰でもメンテナンスできる状態にもっていきたい」というものである。

RubyKaigi Takeout 2020 で目標だった「RubyKaigi で登壇する」を達成してしまい燃え尽きた感が個人的にはあった。RubyKaigi Takeout 2021 の感想戦でうづらさんが

「もっと実用的な Ruby の貢献がしたい」

と言っていて、最近ずっともやもやしていた気持ちが晴れて

「俺も実用的な Ruby への貢献をしよう」

という気持ちになった。

なので突然 Twitter 上でなかださんに絡んでいって今の parse.y をどうしたいかなどを聞いたりした。が、聞いたところで実際何をどうしたらいいのかさっぱり分からんので、まずは積読になっていた Ruby のしくみを再度読み返すことにした。

そんな時に前回の Fukuoka.rb でうづらさんから「Ruby のパーサーについて網羅的に勉強するならコンパイラの勉強をした方がいいのでは?」という提案を受け、あおきさんのふつうのコンパイラをつくろうをポチった。

前置きが長くなったが、parse.y を何とか改善するため1の第一歩としてコンパイラを作ることにした。

その他

asakusarb.doorkeeper.jp

最近の松田明氏による動画アーカイブ発掘調査の結果、過去の RubyKaigi の講演動画を全て発掘することに成功しました。

何か色々とやべー動画が発掘されたらしいので俺は参加予定です(しおいさんがゴッリゴリに推してきた)。

次回

fukuokarb.connpass.com

来週は祝日なのでスキップして、再来週の開催です。


  1. 案外 3 年後くらいに Shopify 勢が何とかしてくれそうな気がしなくもない。