67 lines
2.1 KiB
C#
67 lines
2.1 KiB
C#
namespace tlang
|
|
{
|
|
internal class EqualsNode : Node
|
|
{
|
|
public Node Left {get;set;}
|
|
public Node Right {get;set;}
|
|
|
|
public EqualsNode(Node left, Node right)
|
|
{
|
|
this.Left = left;
|
|
this.Right = right;
|
|
}
|
|
|
|
public override TObject Execute(IScopeEnvironment nodeEnv)
|
|
{
|
|
var l = Left.Execute(nodeEnv);
|
|
var r = Right.Execute(nodeEnv);
|
|
var lnum = l as TNumber;
|
|
var rnum = r as TNumber;
|
|
var lstr = l as TString;
|
|
var rstr = r as TString;
|
|
var lbool = l as TBoolean;
|
|
var rbool = r as TBoolean;
|
|
var lchar = l as TChar;
|
|
var rchar = r as TChar;
|
|
var dleft = l as TDictionary;
|
|
|
|
if(dleft != null)
|
|
{
|
|
if(dleft.MemberExists("eq"))
|
|
{
|
|
var mbm = dleft["eq"] as ICallable;
|
|
if(mbm != null)
|
|
{
|
|
return mbm.Call(r);
|
|
}
|
|
else {
|
|
var dright = r as TDictionary;
|
|
if(dright != null)
|
|
{
|
|
return TObject.Boolean(dleft == dright);
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
var dright = r as TDictionary;
|
|
if(dright != null)
|
|
{
|
|
return TObject.Boolean(dleft == dright);
|
|
}
|
|
}
|
|
}
|
|
|
|
if(lnum != null && rnum != null)
|
|
return TObject.Boolean(lnum.Value == rnum.Value);
|
|
if(lbool != null && rbool != null)
|
|
return TObject.Boolean(lbool.Value == rbool.Value);
|
|
if(lstr != null && rstr != null)
|
|
return TObject.Boolean(lstr.Value == rstr.Value);
|
|
if(lchar != null && rchar != null)
|
|
return TObject.Boolean(lchar.Value == rchar.Value);
|
|
|
|
|
|
return TObject.Null;
|
|
}
|
|
}
|
|
} |