Ruby2Ruby与ParseTree兼容吗?

时间:2011-01-26 19:31:42

标签: ruby

require 'ruby2ruby'
require 'parsetree'

code = "puts(var)"
sexp = SexpProcessor.new.process(ParseTree.translate(code))
 # => s(:fcall, :puts, s(:array, s(:vcall, :var)))
code = Ruby2Ruby.new.process(sexp)
 # => UnknownNodeError: Bug! Unknown node-type :fcall to Ruby2Ruby

是否有某种方法可以将Sexps从ParseTree转换回ruby代码?

我开始编写一些可以进行此翻译的代码,但我想知道它是否已经存在。另一个问题是Ruby2Ruby在算术运算中放了很多不需要的括号(比如4+3-2+-2**4(((4 + 3) - 2) + -(2 ** 4)),两者都是等效的)。有没有办法删除它们?

2 个答案:

答案 0 :(得分:2)

我不确定这是否适合您,因为您似乎想要从字符串中解析ruby代码,但如果您确实需要运行代码的源代码,则可以执行以下操作:

$ irb
?> require 'rubygems'
=> true 
?> require 'parse_tree'
=> true 
?> require 'parse_tree_extensions'
=> true 
?> require 'ruby2ruby'
=> true 
?> def calc; 4+3-2+-2**4; end
=> nil 
?> puts method(:calc).to_ruby
def calc
  (((4 + 3) - 2) + -(2 ** 4))
end

虽然这确实增加了你不想要的间距。

答案 1 :(得分:1)

我认为它们应该是兼容的,因为它们是by the same person编写的,但有时会出现漏洞(如this question中所见,同一作者的两个宝石之间存在不兼容性)。