diary

I like Hatena Star with a text selection.

2020-08-31 - italian-ruby

github.com

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

動的にできるかなみたいな話もしていた。TracePointつかってもむずいかな、どうだろう。魔術師求む

github.com

だいぶ前にJapaneseというgemを作ったのだけど、それに比べればよっぽど凝っているなあという気持ち。