diff options
Diffstat (limited to 'test/ruby/sentence.rb')
-rw-r--r-- | test/ruby/sentence.rb | 51 |
1 files changed, 29 insertions, 22 deletions
diff --git a/test/ruby/sentence.rb b/test/ruby/sentence.rb index 048d453cc..50f42d688 100644 --- a/test/ruby/sentence.rb +++ b/test/ruby/sentence.rb @@ -170,6 +170,21 @@ class Sentence @sent.length end + # iterates over children. + # + # Sentence(%w[2 * 7], "+", %w[3 * 5]).each {|v| p v } + # #=> + # #<Sentence: "2" "*" "7"> + # "+" + # #<Sentence: "3" "*" "5"> + # + def each # :yield: element + @sent.each_index {|i| + yield self[i] + } + end + include Enumerable + def inspect "#<#{self.class}: #{inner_inspect(@sent, '')}>" end @@ -206,7 +221,7 @@ class Sentence # Sentence.new(%w[2 + 3]).subst(/\A\d+\z/) {|s| ((s.to_i)*2).to_s } # #=> #<Sentence: "4" "+" "6"> # - def subst(target, &b) + def subst(target, &b) # :yield: string Sentence.new(subst_rec(@sent, target, &b)) end @@ -231,7 +246,7 @@ class Sentence # Sentence(%w[2 * 7], "+", %w[3 * 5]).find_subtree {|s| s[1] == "*" } # #=> #<Sentence: "2" "*" "7"> # - def find_subtree(&b) + def find_subtree(&b) # :yield: sentence find_subtree_rec(@sent, &b) end @@ -268,25 +283,23 @@ class Sentence # s.expand {|s| s[0] == "3" } # #=> #<Sentence: (("2" "*" "7") "+" "3" "*" "5")> # - def expand(&b) + def expand(&b) # :yield: sentence Sentence.new(expand_rec(@sent, &b)) end # :stopdoc: def expand_rec(obj, r=[], &b) if obj.respond_to? :to_ary - s = Sentence.new(obj) - if b.call s - obj.each {|o| + obj.each {|o| + s = Sentence.new(o) + if b.call s expand_rec(o, r, &b) - } - else - a = [] - obj.each {|o| + else + a = [] expand_rec(o, a, &b) - } - r << a - end + r << a + end + } else r << obj end @@ -482,16 +495,10 @@ class Sentence def self.expand_emptyable_syms(rhs, emptyable_syms) if rhs.empty? - elsif rhs.length == 1 - if emptyable_syms[rhs[0]] - yield rhs - yield [] - else - yield rhs - end + yield [] else - rest = rhs.dup - first = rest.shift + first = rhs[0] + rest = rhs[1..-1] if emptyable_syms[first] expand_emptyable_syms(rest, emptyable_syms) {|rhs2| yield [first] + rhs2 |