はじめに
Ruby
をJulia
にトランスパイルするgemがあったので遊んでみました。
インストール
gem install julializer
トランスパイル
julializer xxx.rb
# もしくは
bundle exec julializer xxx.rb
トランスパイル結果を標準出力に表示します。
仕組み
require 'ripper'
行頭でripper
を呼んでいます。
おお、最近読んだ記事にありました、Ruby プログラムのパーサ
ですね。
失敗
require 'julializer'
puts Julializer.ruby2julia('a = gets.to_i')
デバッグするために、プログラム内でjulializer
を呼びます。
トランス対象は、AtCoder
でよく使用されるフレーズを使用します。
実行結果
a=trunc(Int64,parse(string(gets)));;
期待する結果
a=parse(Int64,readline());;
現状では失敗するのですが、これはgets
がjulializer.rb
内で設定されていないからです。
図の通り、字句解析の結果が配列s
に格納され、case
で分岐されますが、ここにgets
やreadline
が無いわけです。
成功
julializer.rb
when :field, :call
when "gets", "readline"
case s[3][1]
when "to_i", "to_int"
"parse(Int64,readline())"
end
when "gets", "readline"
以下を追記しました。
実行結果
a=parse(Int64,readline());;
ひとまず、欲しい結果が得られました。
いやー、ripper
って凄いですね。
まとめ
- ripper の作者さんありがとう
- julializer の作者さんありがとう