search
LoginSignup
0

posted at

updated at

Ruby を Julia にトランスパイル する Gem

はじめに

RubyJuliaにトランスパイルする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());;

現状では失敗するのですが、これはgetsjulializer.rb内で設定されていないからです。

20220330a.png

図の通り、字句解析の結果が配列sに格納され、caseで分岐されますが、ここにgetsreadlineが無いわけです。

成功

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 の作者さんありがとう

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
0