90
90
def f; yield([*[1]]); end; f {|a| assert_equal([1], a)}; undef f
91
91
def f; yield([*[1,2]]); end; f {|a| assert_equal([1,2], a)}; undef f
93
def f; yield(*[1]); end; f {|a| assert_equal([1], a)}; undef f
94
def f; yield(*[nil]); end; f {|a| assert_equal([nil], a)}; undef f
95
def f; yield(*[[]]); end; f {|a| assert_equal([[]], a)}; undef f
96
def f; yield(*[*[1]]); end; f {|a| assert_equal([1], a)}; undef f
93
def f; yield(*[1]); end; f {|a| assert_equal(1, a)}; undef f
94
def f; yield(*[nil]); end; f {|a| assert_equal(nil, a)}; undef f
95
def f; yield(*[[]]); end; f {|a| assert_equal([], a)}; undef f
96
def f; yield(*[*[1]]); end; f {|a| assert_equal(1, a)}; undef f
98
98
def f; yield; end; f {|*a| assert_equal([], a)}; undef f
99
99
def f; yield(nil); end; f {|*a| assert_equal([nil], a)}; undef f
100
100
def f; yield(1); end; f {|*a| assert_equal([1], a)}; undef f
101
def f; yield([]); end; f {|*a| assert_equal([], a)}; undef f
102
def f; yield([1]); end; f {|*a| assert_equal([1], a)}; undef f
103
def f; yield([nil]); end; f {|*a| assert_equal([nil], a)}; undef f
104
def f; yield([[]]); end; f {|*a| assert_equal([[]], a)}; undef f
105
def f; yield([1,2]); end; f {|*a| assert_equal([1,2], a)}; undef f
106
def f; yield([*[]]); end; f {|*a| assert_equal([], a)}; undef f
107
def f; yield([*[1]]); end; f {|*a| assert_equal([1], a)}; undef f
108
def f; yield([*[1,2]]); end; f {|*a| assert_equal([1,2], a)}; undef f
101
def f; yield([]); end; f {|*a| assert_equal([[]], a)}; undef f
102
def f; yield([1]); end; f {|*a| assert_equal([[1]], a)}; undef f
103
def f; yield([nil]); end; f {|*a| assert_equal([[nil]], a)}; undef f
104
def f; yield([[]]); end; f {|*a| assert_equal([[[]]], a)}; undef f
105
def f; yield([1,2]); end; f {|*a| assert_equal([[1,2]], a)}; undef f
106
def f; yield([*[]]); end; f {|*a| assert_equal([[]], a)}; undef f
107
def f; yield([*[1]]); end; f {|*a| assert_equal([[1]], a)}; undef f
108
def f; yield([*[1,2]]); end; f {|*a| assert_equal([[1,2]], a)}; undef f
110
110
def f; yield(*[]); end; f {|*a| assert_equal([], a)}; undef f
111
111
def f; yield(*[1]); end; f {|*a| assert_equal([1], a)}; undef f
129
129
def f; yield(*[]); end; f {|a,b,*c| assert_equal([nil,nil,[]], [a,b,c])}; undef f
130
130
def f; yield(*[1]); end; f {|a,b,*c| assert_equal([1,nil,[]], [a,b,c])}; undef f
131
131
def f; yield(*[nil]); end; f {|a,b,*c| assert_equal([nil,nil,[]], [a,b,c])}; undef f
132
def f; yield(*[[]]); end; f {|a,b,*c| assert_equal([[],nil,[]], [a,b,c])}; undef f
132
def f; yield(*[[]]); end; f {|a,b,*c| assert_equal([nil,nil,[]], [a,b,c])}; undef f
133
133
def f; yield(*[*[]]); end; f {|a,b,*c| assert_equal([nil,nil,[]], [a,b,c])}; undef f
134
134
def f; yield(*[*[1]]); end; f {|a,b,*c| assert_equal([1,nil,[]], [a,b,c])}; undef f
135
135
def f; yield(*[*[1,2]]); end; f {|a,b,*c| assert_equal([1,2,[]], [a,b,c])}; undef f
489
489
assert_equal [3,4], [a,b]
494
class TestAssignmentGen < Test::Unit::TestCase
504
:mrhs => [[:args,",",:arg],
505
[:args,",","*",:arg],
510
[:args,",","*",:arg]],
511
:mlhs => [[:mlhs_basic],
512
["(",:mlhs_inner,")"]],
513
:mlhs_inner => [[:mlhs_basic],
514
["(",:mlhs_inner,")"]],
515
:mlhs_basic => [[:mlhs_head],
516
[:mlhs_head,:mlhs_item],
517
[:mlhs_head,"*",:mlhs_node],
518
[:mlhs_head,"*",:mlhs_node,",",:mlhs_post],
520
[:mlhs_head,"*",",", :mlhs_post],
522
[ "*",:mlhs_node,",",:mlhs_post],
524
[ "*",",", :mlhs_post]],
525
:mlhs_head => [[:mlhs_item,","],
526
[:mlhs_head,:mlhs_item,","]],
527
:mlhs_post => [[:mlhs_item],
528
[:mlhs_post,",",:mlhs_item]],
529
:mlhs_item => [[:mlhs_node],
530
["(",:mlhs_inner,")"]],
531
:mlhs_node => [["var"]],
532
:xassign => [["var"," = ",:exp],
535
[:mlhs," = ",:mrhs]],
540
r = obj.subst('var') {
541
var = "v#{vars.length}"
548
def expand_except_paren(obj)
549
return obj if obj.respond_to? :to_str
551
!(s[0] == '(' && s[-1] == ')') &&
552
!(s[0] == '[' && s[-1] == ']')
556
def extract_single_element(ary)
557
raise "not a single element array: #{ary.inspect}" if ary.length != 1
561
def emu_assign_ary(lhs, rv, h)
562
rv = rv.respond_to?(:to_ary) ? rv : [rv]
572
a.pop if a.last == []
585
pre.map! {|e| extract_single_element(e) }
590
star = extract_single_element(star[1..-1])
593
post.map! {|e| extract_single_element(e) } if post
596
emu_assign_single(pre.shift, rv.shift, h)
600
if rv.length < post.length
602
emu_assign_single(post.shift, rv.shift, h)
606
emu_assign_single(post.pop, rv.pop, h)
612
emu_assign_single(star, rv, h)
616
def emu_assign_single(lhs, rv, h={})
617
if lhs.respond_to? :to_str
618
if /\A[a-z0-9]+\z/ =~ lhs
621
raise "unexpected lhs string: #{lhs.inspect}"
623
elsif Sentence === lhs
624
if lhs[0] == '(' && lhs[-1] == ')'
625
emu_assign_ary(lhs[1...-1], rv, h)
626
elsif lhs.length == 1 && String === lhs[0] && /\A[a-z0-9]+\z/ =~ lhs[0]
629
raise "unexpected lhs sentence: #{lhs.inspect}"
632
raise "unexpected lhs: #{lhs.inspect}"
637
def emu_assign(assign)
638
lhs = expand_except_paren(assign[0])
639
rhs = expand_except_paren(assign[2])
640
lopen = Sentence === lhs && lhs[-1] != ')' && lhs.any? {|e| e == '*' || e == ',' }
641
ropen = Sentence === rhs && rhs[-1] != ']' && rhs.any? {|e| e == '*' || e == ',' }
642
lhs = Sentence.new(['(']+lhs.to_a+[')']) if lopen
644
rv = eval((ropen ? ["[",assign[2],"]"] : assign[2]).join(''))
648
emu_assign_single(lhs, rv)
651
def do_assign(assign, vars)
653
code1 = "#{assign}; [#{vars.join(",")}]"
654
assign.gsub!(/\bv\d+\b/, "o.a")
655
code2 = "o=[];class << o; self end.send!(:define_method,:a=){|v|self << v};#{assign};o"
659
return {:ex=>$!.message}
664
return {:ex=>$!.message}
666
assert_equal(vals1, vals2, code1)
669
[vars, vals].transpose.each {|k,v| h[k] = v }
674
assign, vars = rename_var(assign)
676
bruby = do_assign(assign, vars).to_a.sort
677
bemu = emu_assign(assign).to_a.sort
678
assert_equal(bemu, bruby, sent)
682
syntax = Sentence.expand_syntax(Syntax)
683
Sentence.each(syntax, :xassign, 4) {|assign|