italian-rubyという面白プロダクトを見つけたのでちょっとだけコードを読んでみた。 なんとイタリア語でRubyが書けるgem。READMEにあるサンプルコードを引用する。
# persona.ir classe Persona definisci inizializzatore(nome) @nome = nome fine definisci come_ti_chiami? stampa "Ciao, mi chiamo #{@nome}." fine fine toni = Persona.nuova("Toni") toni.come_ti_chiami?
$ italian-ruby test.rb # Ciao, mi chiamo Toni.
イタリア語全然分からんのでREADMEはコードの部分しか読んでない。イタリア語むずい。DuolingoであとちょっとでLevel 1のゲートまで到達しそうなのだけど。
コードを眺めてみると、どうやらItalian::Ruby::Traduttore.traduci
がitalian-rubyをただのrubyにコンパイルして、それをevalしているよう。
英語風に書くとItalian::Ruby::Translator.translate
だろうか。
これがitalian-ruby
コマンドのエントリポイント
https://github.com/Pluvie/italian-ruby/blob/993ae3212b99a85f2e27f2a40b18b0debc0758c6/bin/italian-ruby
コンパイルはどうやっているのかなーと眺めてみたら、どうやら正規表現でえいやとやっているっぽい。parserを書いているわけではなかった。。
traduci_pezzo
メソッドから力を感じる。
https://github.com/Pluvie/italian-ruby/blob/993ae3212b99a85f2e27f2a40b18b0debc0758c6/lib/italian/ruby/traduttore.rb#L87-L137
また、core_extも充実していて、沢山のライブラリにモンキーパッチでイタリア語のメソッドが生えている。 https://github.com/Pluvie/italian-ruby/tree/993ae3212b99a85f2e27f2a40b18b0debc0758c6/lib/italian/ruby/core_ext
パーサー書いてなかったのはちょっと残念だけど、久しぶりにこういう面白プロダクトを読んだ気がする。めっちゃいい。
twitter.comあーたしかに。endがfineになってるから〜と思ってましたが、対になるdefも予約語じゃなくなってれば構文としてはvalidそうですね。
— Pocke(ぽっけ) (@p_ck_) August 31, 2020
ただ、このままだと単に評価してしまうとメソッド定義内のコードも読まれた時に評価されてしまうので、それを防ぐ必要はありそうです。TracePointかな…
動的にできるかなみたいな話もしていた。TracePointつかってもむずいかな、どうだろう。魔術師求む
だいぶ前にJapaneseというgemを作ったのだけど、それに比べればよっぽど凝っているなあという気持ち。