sexp2ruby 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. checksums.yaml +4 -4
  2. data/.rspec +3 -0
  3. data/.travis.yml +1 -2
  4. data/README.md +9 -0
  5. data/lib/{sexp2ruby/core_extensions → core_extensions}/regexp.rb +0 -0
  6. data/lib/sexp2ruby/node/alias.rb +9 -0
  7. data/lib/sexp2ruby/node/and.rb +9 -0
  8. data/lib/sexp2ruby/node/arglist.rb +16 -0
  9. data/lib/sexp2ruby/node/args.rb +33 -0
  10. data/lib/sexp2ruby/node/array.rb +9 -0
  11. data/lib/sexp2ruby/node/attrasgn.rb +27 -0
  12. data/lib/sexp2ruby/node/back_ref.rb +9 -0
  13. data/lib/sexp2ruby/node/base.rb +36 -0
  14. data/lib/sexp2ruby/node/begin.rb +19 -0
  15. data/lib/sexp2ruby/node/block.rb +24 -0
  16. data/lib/sexp2ruby/node/block_pass.rb +10 -0
  17. data/lib/sexp2ruby/node/break.rb +14 -0
  18. data/lib/sexp2ruby/node/call.rb +70 -0
  19. data/lib/sexp2ruby/node/case.rb +27 -0
  20. data/lib/sexp2ruby/node/cdecl.rb +17 -0
  21. data/lib/sexp2ruby/node/class.rb +9 -0
  22. data/lib/sexp2ruby/node/colon2.rb +9 -0
  23. data/lib/sexp2ruby/node/colon3.rb +9 -0
  24. data/lib/sexp2ruby/node/const.rb +9 -0
  25. data/lib/sexp2ruby/node/cvar.rb +9 -0
  26. data/lib/sexp2ruby/node/cvasgn.rb +9 -0
  27. data/lib/sexp2ruby/node/cvdecl.rb +9 -0
  28. data/lib/sexp2ruby/node/defined.rb +9 -0
  29. data/lib/sexp2ruby/node/defn.rb +66 -0
  30. data/lib/sexp2ruby/node/defs.rb +17 -0
  31. data/lib/sexp2ruby/node/dot2.rb +9 -0
  32. data/lib/sexp2ruby/node/dot3.rb +9 -0
  33. data/lib/sexp2ruby/node/dregx.rb +19 -0
  34. data/lib/sexp2ruby/node/dregx_once.rb +9 -0
  35. data/lib/sexp2ruby/node/dstr.rb +9 -0
  36. data/lib/sexp2ruby/node/dsym.rb +9 -0
  37. data/lib/sexp2ruby/node/dxstr.rb +9 -0
  38. data/lib/sexp2ruby/node/ensure.rb +18 -0
  39. data/lib/sexp2ruby/node/evstr.rb +9 -0
  40. data/lib/sexp2ruby/node/false.rb +9 -0
  41. data/lib/sexp2ruby/node/flip2.rb +9 -0
  42. data/lib/sexp2ruby/node/flip3.rb +9 -0
  43. data/lib/sexp2ruby/node/for.rb +17 -0
  44. data/lib/sexp2ruby/node/gasgn.rb +9 -0
  45. data/lib/sexp2ruby/node/gvar.rb +9 -0
  46. data/lib/sexp2ruby/node/hash.rb +53 -0
  47. data/lib/sexp2ruby/node/iasgn.rb +14 -0
  48. data/lib/sexp2ruby/node/if.rb +41 -0
  49. data/lib/sexp2ruby/node/iter.rb +50 -0
  50. data/lib/sexp2ruby/node/ivar.rb +9 -0
  51. data/lib/sexp2ruby/node/kwsplat.rb +9 -0
  52. data/lib/sexp2ruby/node/lasgn.rb +11 -0
  53. data/lib/sexp2ruby/node/lit.rb +15 -0
  54. data/lib/sexp2ruby/node/lvar.rb +9 -0
  55. data/lib/sexp2ruby/node/masgn.rb +46 -0
  56. data/lib/sexp2ruby/node/match.rb +9 -0
  57. data/lib/sexp2ruby/node/match2.rb +11 -0
  58. data/lib/sexp2ruby/node/match3.rb +17 -0
  59. data/lib/sexp2ruby/node/module.rb +9 -0
  60. data/lib/sexp2ruby/node/next.rb +14 -0
  61. data/lib/sexp2ruby/node/nil.rb +9 -0
  62. data/lib/sexp2ruby/node/not.rb +9 -0
  63. data/lib/sexp2ruby/node/nth_ref.rb +9 -0
  64. data/lib/sexp2ruby/node/op_asgn1.rb +16 -0
  65. data/lib/sexp2ruby/node/op_asgn2.rb +17 -0
  66. data/lib/sexp2ruby/node/op_asgn_and.rb +13 -0
  67. data/lib/sexp2ruby/node/op_asgn_or.rb +13 -0
  68. data/lib/sexp2ruby/node/or.rb +9 -0
  69. data/lib/sexp2ruby/node/postexe.rb +9 -0
  70. data/lib/sexp2ruby/node/redo.rb +9 -0
  71. data/lib/sexp2ruby/node/resbody.rb +19 -0
  72. data/lib/sexp2ruby/node/rescue.rb +32 -0
  73. data/lib/sexp2ruby/node/retry.rb +9 -0
  74. data/lib/sexp2ruby/node/return.rb +13 -0
  75. data/lib/sexp2ruby/node/sclass.rb +9 -0
  76. data/lib/sexp2ruby/node/self.rb +9 -0
  77. data/lib/sexp2ruby/node/splat.rb +13 -0
  78. data/lib/sexp2ruby/node/str.rb +9 -0
  79. data/lib/sexp2ruby/node/super.rb +10 -0
  80. data/lib/sexp2ruby/node/svalue.rb +13 -0
  81. data/lib/sexp2ruby/node/to_ary.rb +9 -0
  82. data/lib/sexp2ruby/node/true.rb +9 -0
  83. data/lib/sexp2ruby/node/undef.rb +9 -0
  84. data/lib/sexp2ruby/node/until.rb +9 -0
  85. data/lib/sexp2ruby/node/valias.rb +9 -0
  86. data/lib/sexp2ruby/node/when.rb +24 -0
  87. data/lib/sexp2ruby/node/while.rb +9 -0
  88. data/lib/sexp2ruby/node/xstr.rb +9 -0
  89. data/lib/sexp2ruby/node/yield.rb +18 -0
  90. data/lib/sexp2ruby/node/zsuper.rb +9 -0
  91. data/lib/sexp2ruby/processor.rb +121 -912
  92. data/lib/sexp2ruby/version.rb +1 -1
  93. data/lib/sexp2ruby.rb +88 -1
  94. data/sexp2ruby.gemspec +1 -0
  95. data/spec/lib/processor_spec.rb +478 -1
  96. metadata +104 -8
  97. data/Rakefile +0 -92
  98. data/test/test_ruby2ruby.rb +0 -496
@@ -0,0 +1,18 @@
1
+ module Sexp2Ruby
2
+ module Node
3
+ class Ensure < Base
4
+ def to_s(exp)
5
+ body = process exp.shift
6
+ ens = exp.shift
7
+ ens = nil if ens == s(:nil)
8
+ ens = process(ens) || "# do nothing"
9
+ ens = "begin\n#{ens}\nend\n" if ens =~ /(^|\n)rescue/
10
+
11
+ body.sub!(/\n\s*end\z/, '')
12
+ body = indent(body) unless body =~ /(^|\n)rescue/
13
+
14
+ "#{body}\nensure\n#{indent ens}"
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,9 @@
1
+ module Sexp2Ruby
2
+ module Node
3
+ class Evstr < Base
4
+ def to_s(exp)
5
+ exp.empty? ? '' : process(exp.shift)
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Sexp2Ruby
2
+ module Node
3
+ class False < Base
4
+ def to_s(exp)
5
+ "false"
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Sexp2Ruby
2
+ module Node
3
+ class Flip2 < Base
4
+ def to_s(exp)
5
+ "#{process(exp.shift)}..#{process(exp.shift)}"
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Sexp2Ruby
2
+ module Node
3
+ class Flip3 < Base
4
+ def to_s(exp)
5
+ "#{process(exp.shift)}...#{process(exp.shift)}"
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,17 @@
1
+ module Sexp2Ruby
2
+ module Node
3
+ class For < Base
4
+ def to_s(exp)
5
+ recv = process exp.shift
6
+ iter = process exp.shift
7
+ body = exp.empty? ? nil : process(exp.shift)
8
+
9
+ result = ["for #{iter} in #{recv} do"]
10
+ result << indent(body ? body : "# do nothing")
11
+ result << "end"
12
+
13
+ result.join(LF)
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,9 @@
1
+ module Sexp2Ruby
2
+ module Node
3
+ class Gasgn < Base
4
+ def to_s(exp)
5
+ process_iasgn(exp)
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Sexp2Ruby
2
+ module Node
3
+ class Gvar < Base
4
+ def to_s(exp)
5
+ exp.shift.to_s
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,53 @@
1
+ module Sexp2Ruby
2
+ module Node
3
+ class Hash < Base
4
+
5
+ # Some sexp types are OK without parens when appearing as hash values.
6
+ # This list can include `:call`s because they're always printed with parens
7
+ # around their arguments. For example:
8
+ #
9
+ # { :foo => (bar("baz")) } # The outer parens are unnecessary
10
+ # { :foo => bar("baz") } # This is the normal code style
11
+ #
12
+ HASH_VAL_NO_PAREN = [
13
+ :call,
14
+ :false,
15
+ :lit,
16
+ :lvar,
17
+ :nil,
18
+ :str,
19
+ :true
20
+ ]
21
+
22
+ def to_s(exp)
23
+ result = []
24
+
25
+ until exp.empty?
26
+ s = exp.shift
27
+ t = s.sexp_type
28
+ ruby19_key = ruby19_hash_key?(s)
29
+ lhs = process s
30
+
31
+ case t
32
+ when :kwsplat then
33
+ result << lhs
34
+ else
35
+ rhs = exp.shift
36
+ t = rhs.first
37
+ rhs = process rhs
38
+ rhs = "(#{rhs})" unless HASH_VAL_NO_PAREN.include? t
39
+
40
+ if hash_syntax == :ruby19 && ruby19_key
41
+ lhs.gsub!(/\A:/, "")
42
+ result << "#{lhs}: #{rhs}"
43
+ else
44
+ result << "#{lhs} => #{rhs}"
45
+ end
46
+ end
47
+ end
48
+
49
+ result.empty? ? "{}" : "{ #{result.join(', ')} }"
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,14 @@
1
+ module Sexp2Ruby
2
+ module Node
3
+ class Iasgn < Base
4
+ def to_s(exp)
5
+ lhs = exp.shift
6
+ if exp.empty? # part of an masgn
7
+ lhs.to_s
8
+ else
9
+ "#{lhs} = #{process exp.shift}"
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,41 @@
1
+ module Sexp2Ruby
2
+ module Node
3
+ class If < Base
4
+ def to_s(exp)
5
+ expand = ASSIGN_NODES.include? exp.first.first
6
+ c = process exp.shift
7
+ t = process exp.shift
8
+ f = process exp.shift
9
+
10
+ c = "(#{c.chomp})" if c =~ /\n/
11
+
12
+ if t
13
+ unless expand
14
+ if f
15
+ r = "#{c} ? (#{t}) : (#{f})"
16
+ r = nil if r =~ /return/ # HACK - need contextual awareness or something
17
+ else
18
+ r = "#{t} if #{c}"
19
+ end
20
+ return r if r and (indent_lvl + r).size < LINE_LENGTH and r !~ /\n/
21
+ end
22
+
23
+ r = "if #{c} then\n#{indent(t)}\n"
24
+ r << "else\n#{indent(f)}\n" if f
25
+ r << "end"
26
+
27
+ r
28
+ elsif f
29
+ unless expand
30
+ r = "#{f} unless #{c}"
31
+ return r if (indent_lvl + r).size < LINE_LENGTH and r !~ /\n/
32
+ end
33
+ "unless #{c} then\n#{indent(f)}\nend"
34
+ else
35
+ # empty if statement, just do it in case of side effects from condition
36
+ "if #{c} then\n#{indent '# do nothing'}\nend"
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,50 @@
1
+ module Sexp2Ruby
2
+ module Node
3
+ class Iter < Base
4
+ def to_s(exp)
5
+ iter = process exp.shift
6
+ args = exp.shift
7
+ body = exp.empty? ? nil : process(exp.shift)
8
+
9
+ args = case args
10
+ when 0 then
11
+ ""
12
+ else
13
+ " |#{process(args)[1..-2]}|"
14
+ end
15
+
16
+ b, e = if iter == "END"
17
+ [ "{", "}" ]
18
+ else
19
+ [ "do", "end" ]
20
+ end
21
+
22
+ iter.sub!(/\(\)$/, '')
23
+
24
+ # REFACTOR: ugh
25
+ result = []
26
+ result << "#{iter} {"
27
+ result << args
28
+ if body
29
+ result << " #{body.strip} "
30
+ else
31
+ result << ' '
32
+ end
33
+ result << "}"
34
+ result = result.join
35
+ return result if result !~ /\n/ and result.size < LINE_LENGTH
36
+
37
+ result = []
38
+ result << "#{iter} #{b}"
39
+ result << args
40
+ result << LF
41
+ if body
42
+ result << indent(body.strip)
43
+ result << LF
44
+ end
45
+ result << e
46
+ result.join
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,9 @@
1
+ module Sexp2Ruby
2
+ module Node
3
+ class Ivar < Base
4
+ def to_s(exp)
5
+ exp.shift.to_s
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Sexp2Ruby
2
+ module Node
3
+ class Kwsplat < Base
4
+ def to_s(exp)
5
+ "**#{process exp.shift}"
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,11 @@
1
+ module Sexp2Ruby
2
+ module Node
3
+ class Lasgn < Base
4
+ def to_s(exp)
5
+ s = "#{exp.shift}"
6
+ s += " = #{process exp.shift}" unless exp.empty?
7
+ s
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,15 @@
1
+ module Sexp2Ruby
2
+ module Node
3
+ class Lit < Base
4
+ def to_s(exp)
5
+ obj = exp.shift
6
+ case obj
7
+ when Range then
8
+ "(#{obj.inspect})"
9
+ else
10
+ obj.inspect
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,9 @@
1
+ module Sexp2Ruby
2
+ module Node
3
+ class Lvar < Base
4
+ def to_s(exp)
5
+ exp.shift.to_s
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,46 @@
1
+ module Sexp2Ruby
2
+ module Node
3
+ class Masgn < Base
4
+
5
+ # s(:masgn, s(:array, s(:lasgn, :var), ...), s(:to_ary, <val>, ...))
6
+ # s(:iter, <call>, s(:args, s(:masgn, :a, :b)), <body>)
7
+ def to_s(exp)
8
+ case exp.first
9
+ when Sexp then
10
+ lhs = exp.shift
11
+ rhs = exp.empty? ? nil : exp.shift
12
+
13
+ case lhs.first
14
+ when :array then
15
+ lhs.shift # node type
16
+ lhs = lhs.map do |l|
17
+ case l.first
18
+ when :masgn then
19
+ "(#{process(l)})"
20
+ else
21
+ process(l)
22
+ end
23
+ end
24
+ else
25
+ raise "no clue: #{lhs.inspect}"
26
+ end
27
+
28
+ if rhs.nil?
29
+ return lhs.join(", ")
30
+ else
31
+ t = rhs.first
32
+ rhs = process rhs
33
+ rhs = rhs[1..-2] if t == :array # FIX: bad? I dunno
34
+ return "#{lhs.join(", ")} = #{rhs}"
35
+ end
36
+ when Symbol then # block arg list w/ masgn
37
+ result = exp.join ", "
38
+ exp.clear
39
+ "(#{result})"
40
+ else
41
+ raise "unknown masgn: #{exp.inspect}"
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,9 @@
1
+ module Sexp2Ruby
2
+ module Node
3
+ class Match < Base
4
+ def to_s(exp)
5
+ "#{process(exp.shift)}"
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,11 @@
1
+ module Sexp2Ruby
2
+ module Node
3
+ class Match2 < Base
4
+ def to_s(exp)
5
+ lhs = process(exp.shift)
6
+ rhs = process(exp.shift)
7
+ "#{lhs} =~ #{rhs}"
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,17 @@
1
+ module Sexp2Ruby
2
+ module Node
3
+ class Match3 < Base
4
+ def to_s(exp)
5
+ rhs = process(exp.shift)
6
+ left_type = exp.first.sexp_type
7
+ lhs = process(exp.shift)
8
+
9
+ if ASSIGN_NODES.include? left_type
10
+ "(#{lhs}) =~ #{rhs}"
11
+ else
12
+ "#{lhs} =~ #{rhs}"
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,9 @@
1
+ module Sexp2Ruby
2
+ module Node
3
+ class Module < Base
4
+ def to_s(exp)
5
+ "#{exp.comments}module #{util_module_or_class(exp)}"
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,14 @@
1
+ module Sexp2Ruby
2
+ module Node
3
+ class Next < Base
4
+ def to_s(exp)
5
+ val = exp.empty? ? nil : process(exp.shift)
6
+ if val
7
+ "next #{val}"
8
+ else
9
+ "next"
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,9 @@
1
+ module Sexp2Ruby
2
+ module Node
3
+ class Nil < Base
4
+ def to_s(exp)
5
+ "nil"
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Sexp2Ruby
2
+ module Node
3
+ class Not < Base
4
+ def to_s(exp)
5
+ "(not #{process exp.shift})"
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Sexp2Ruby
2
+ module Node
3
+ class NthRef < Base
4
+ def to_s(exp)
5
+ "$#{exp.shift}"
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,16 @@
1
+ module Sexp2Ruby
2
+ module Node
3
+ class OpAsgn1 < Base
4
+
5
+ # [[:lvar, :b], [:arglist, [:lit, 1]], :"||", [:lit, 10]]
6
+ def to_s(exp)
7
+ lhs = process(exp.shift)
8
+ index = process(exp.shift)
9
+ msg = exp.shift
10
+ rhs = process(exp.shift)
11
+
12
+ "#{lhs}[#{index}] #{msg}= #{rhs}"
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,17 @@
1
+ module Sexp2Ruby
2
+ module Node
3
+ class OpAsgn2 < Base
4
+
5
+ # [[:lvar, :c], :var=, :"||", [:lit, 20]]
6
+ def to_s(exp)
7
+ lhs = process(exp.shift)
8
+ index = exp.shift.to_s[0..-2]
9
+ msg = exp.shift
10
+
11
+ rhs = process(exp.shift)
12
+
13
+ "#{lhs}.#{index} #{msg}= #{rhs}"
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,13 @@
1
+ module Sexp2Ruby
2
+ module Node
3
+ class OpAsgnAnd < Base
4
+
5
+ # a &&= 1
6
+ # [[:lvar, :a], [:lasgn, :a, [:lit, 1]]]
7
+ def to_s(exp)
8
+ exp.shift
9
+ process(exp.shift).sub(/\=/, '&&=')
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ module Sexp2Ruby
2
+ module Node
3
+ class OpAsgnOr < Base
4
+
5
+ # a ||= 1
6
+ # [[:lvar, :a], [:lasgn, :a, [:lit, 1]]]
7
+ def to_s(exp)
8
+ exp.shift
9
+ process(exp.shift).sub(/\=/, '||=')
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,9 @@
1
+ module Sexp2Ruby
2
+ module Node
3
+ class Or < Base
4
+ def to_s(exp)
5
+ "(#{process exp.shift} or #{process exp.shift})"
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Sexp2Ruby
2
+ module Node
3
+ class Postexe < Base
4
+ def to_s(exp)
5
+ "END"
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Sexp2Ruby
2
+ module Node
3
+ class Redo < Base
4
+ def to_s(exp)
5
+ "redo"
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,19 @@
1
+ module Sexp2Ruby
2
+ module Node
3
+ class Resbody < Base
4
+ def to_s(exp)
5
+ args = exp.shift
6
+ body = finish(exp)
7
+ body << "# do nothing" if body.empty?
8
+
9
+ name = args.lasgn true
10
+ name ||= args.iasgn true
11
+ args = process(args)[1..-2]
12
+ args = " #{args}" unless args.empty?
13
+ args += " => #{name[1]}" if name
14
+
15
+ "rescue#{args}\n#{indent body.join(LF)}"
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,32 @@
1
+ module Sexp2Ruby
2
+ module Node
3
+ class Rescue < Base
4
+ def to_s(exp)
5
+ body = process(exp.shift) unless exp.first.first == :resbody
6
+ els = process(exp.pop) unless exp.last.first == :resbody
7
+
8
+ body ||= "# do nothing"
9
+ simple = exp.size == 1 && exp.resbody.size <= 3 &&
10
+ !exp.resbody.block &&
11
+ !exp.resbody.return
12
+
13
+ resbodies = []
14
+ until exp.empty? do
15
+ resbody = exp.shift
16
+ simple &&= resbody[1] == s(:array)
17
+ simple &&= resbody[2] != nil && resbody[2].node_type != :block
18
+ resbodies << process(resbody)
19
+ end
20
+
21
+ if els
22
+ "#{indent body}\n#{resbodies.join(LF)}\nelse\n#{indent els}"
23
+ elsif simple
24
+ resbody = resbodies.first.sub(/\n\s*/, ' ')
25
+ "#{body} #{resbody}"
26
+ else
27
+ "#{indent body}\n#{resbodies.join(LF)}"
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,9 @@
1
+ module Sexp2Ruby
2
+ module Node
3
+ class Retry < Base
4
+ def to_s(exp)
5
+ "retry"
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,13 @@
1
+ module Sexp2Ruby
2
+ module Node
3
+ class Return < Base
4
+ def to_s(exp)
5
+ if exp.empty?
6
+ "return"
7
+ else
8
+ "return #{process exp.shift}"
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,9 @@
1
+ module Sexp2Ruby
2
+ module Node
3
+ class Sclass < Base
4
+ def to_s(exp)
5
+ "class << #{process(exp.shift)}\n#{indent(process_block(exp))}\nend"
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Sexp2Ruby
2
+ module Node
3
+ class Self < Base
4
+ def to_s(exp)
5
+ "self"
6
+ end
7
+ end
8
+ end
9
+ end