Project

General

Profile

Feature #14951 ยป teq.patch

prototype implementation - danga (Dan Garubba), 07/30/2018 01:35 AM

View differences:

defs/id.def
GE >= GEQ
Eq == EQ
Eqq === EQQ
Teq =? TEQ
Neq != NEQ
Not !
Backquote `
object.c
}
/**
* call-seq:
* obj =? other -> true or false
*
* Test Equality -- Returns true if \a obj and \a other are both
* either truthy or falsy and false otherwise.
*/
VALUE
rb_teq(VALUE obj1, VALUE obj2)
{
return (RTEST(obj1) == RTEST(obj2)) ? Qtrue : Qfalse;
}
/**
* Determines if \a obj1 and \a obj2 are equal in terms of
* \c Object#eql?.
*
......
rb_define_method(rb_mKernel, "nil?", rb_false, 0);
rb_define_method(rb_mKernel, "===", rb_equal, 1);
rb_define_method(rb_mKernel, "=?", rb_teq, 1);
rb_define_method(rb_mKernel, "=~", rb_obj_match, 1);
rb_define_method(rb_mKernel, "!~", rb_obj_not_match, 1);
rb_define_method(rb_mKernel, "eql?", rb_obj_equal, 1);
parse.y
%token tCMP RUBY_TOKEN(CMP) "<=>"
%token tEQ RUBY_TOKEN(EQ) "=="
%token tEQQ RUBY_TOKEN(EQQ) "==="
%token tTEQ RUBY_TOKEN(TEQ) "=?"
%token tNEQ RUBY_TOKEN(NEQ) "!="
%token tGEQ RUBY_TOKEN(GEQ) ">="
%token tLEQ RUBY_TOKEN(LEQ) "<="
......
%nonassoc tDOT2 tDOT3
%left tOROP
%left tANDOP
%nonassoc tCMP tEQ tEQQ tNEQ tMATCH tNMATCH
%nonassoc tCMP tEQ tEQQ tTEQ tNEQ tMATCH tNMATCH
%left '>' tGEQ '<' tLEQ
%left '|' '^'
%left '&'
......
| tCMP { ifndef_ripper($$ = tCMP); }
| tEQ { ifndef_ripper($$ = tEQ); }
| tEQQ { ifndef_ripper($$ = tEQQ); }
| tTEQ { ifndef_ripper($$ = tTEQ); }
| tMATCH { ifndef_ripper($$ = tMATCH); }
| tNMATCH { ifndef_ripper($$ = tNMATCH); }
| '>' { ifndef_ripper($$ = '>'); }
......
{
$$ = call_bin_op(p, $1, idEqq, $3, &@2, &@$);
}
| arg tTEQ arg
{
$$ = call_bin_op(p, $1, idTeq, $3, &@2, &@$);
}
| arg tNEQ arg
{
$$ = call_bin_op(p, $1, idNeq, $3, &@2, &@$);
......
pushback(p, c);
return tEQ;
}
if (c == '~') {
if (c == '?') {
return tTEQ;
}
else if (c == '~') {
return tMATCH;
}
else if (c == '>') {
test/ruby/test_object.rb
assert_equal(false, false ^ nil)
end
def test_teq
o = Object.new
assert_equal(true, o =? Object.new)
assert_equal(false, o =? false)
assert_equal(false, o =? nil)
assert_equal(true, false =? false)
assert_equal(true, false =? nil)
assert_equal(false, false =? o)
assert_equal(true, nil =? false)
assert_equal(true, nil =? nil)
assert_equal(false, nil =? o)
end
def test_methods
o = Object.new
a1 = o.methods
    (1-1/1)