diff --git a/tlanglib/BitwiseAndNode.cs b/tlanglib/BitwiseAndNode.cs new file mode 100644 index 0000000..60b353c --- /dev/null +++ b/tlanglib/BitwiseAndNode.cs @@ -0,0 +1,40 @@ +namespace tlang +{ + internal class BitwiseAndNode : Node + { + public Node Left {get;set;} + public Node Right {get;set;} + + public BitwiseAndNode(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 dleft = l as TDictionary; + + if(dleft != null) + { + if(dleft.MemberExists("band")) + { + var mbm = dleft["band"] as ICallable; + if(mbm != null) + { + return mbm.Call(r); + } + } + } + + if(lnum != null && rnum != null) + return new TNumber((long)lnum.Value & (long)rnum.Value); + + return new TNull(); + } + } +} \ No newline at end of file diff --git a/tlanglib/BitwiseOrNode.cs b/tlanglib/BitwiseOrNode.cs new file mode 100644 index 0000000..4f9a9c9 --- /dev/null +++ b/tlanglib/BitwiseOrNode.cs @@ -0,0 +1,40 @@ +namespace tlang +{ + internal class BitwiseOrNode : Node + { + public Node Left {get;set;} + public Node Right {get;set;} + + public BitwiseOrNode(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 dleft = l as TDictionary; + + if(dleft != null) + { + if(dleft.MemberExists("bor")) + { + var mbm = dleft["bor"] as ICallable; + if(mbm != null) + { + return mbm.Call(r); + } + } + } + + if(lnum != null && rnum != null) + return new TNumber((long)lnum.Value | (long)rnum.Value); + + return new TNull(); + } + } +} \ No newline at end of file diff --git a/tlanglib/EqualsNode.cs b/tlanglib/EqualsNode.cs new file mode 100644 index 0000000..1ef8147 --- /dev/null +++ b/tlanglib/EqualsNode.cs @@ -0,0 +1,40 @@ +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 dleft = l as TDictionary; + + if(dleft != null) + { + if(dleft.MemberExists("eq")) + { + var mbm = dleft["eq"] as ICallable; + if(mbm != null) + { + return mbm.Call(r); + } + } + } + + if(lnum != null && rnum != null) + return new TNumber(lnum.Value == rnum.Value ? 1 : 0); + + return new TNull(); + } + } +} \ No newline at end of file diff --git a/tlanglib/GreaterThanEquals.cs b/tlanglib/GreaterThanEquals.cs new file mode 100644 index 0000000..372fed7 --- /dev/null +++ b/tlanglib/GreaterThanEquals.cs @@ -0,0 +1,40 @@ +namespace tlang +{ + internal class GreaterThanEqualsNode : Node + { + public Node Left {get;set;} + public Node Right {get;set;} + + public GreaterThanEqualsNode(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 dleft = l as TDictionary; + + if(dleft != null) + { + if(dleft.MemberExists("gte")) + { + var mbm = dleft["gte"] as ICallable; + if(mbm != null) + { + return mbm.Call(r); + } + } + } + + if(lnum != null && rnum != null) + return new TNumber(lnum.Value >= rnum.Value ? 1 : 0); + + return new TNull(); + } + } +} \ No newline at end of file diff --git a/tlanglib/GreaterThanNode.cs b/tlanglib/GreaterThanNode.cs new file mode 100644 index 0000000..9e420ba --- /dev/null +++ b/tlanglib/GreaterThanNode.cs @@ -0,0 +1,40 @@ +namespace tlang +{ + internal class GreaterThanNode : Node + { + public Node Left {get;set;} + public Node Right {get;set;} + + public GreaterThanNode(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 dleft = l as TDictionary; + + if(dleft != null) + { + if(dleft.MemberExists("gt")) + { + var mbm = dleft["gt"] as ICallable; + if(mbm != null) + { + return mbm.Call(r); + } + } + } + + if(lnum != null && rnum != null) + return new TNumber(lnum.Value > rnum.Value ? 1 : 0); + + return new TNull(); + } + } +} \ No newline at end of file diff --git a/tlanglib/LeftShift.cs b/tlanglib/LeftShift.cs new file mode 100644 index 0000000..ab94d15 --- /dev/null +++ b/tlanglib/LeftShift.cs @@ -0,0 +1,40 @@ +namespace tlang +{ + internal class LeftShiftNode : Node + { + public Node Left {get;set;} + public Node Right {get;set;} + + public LeftShiftNode(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 dleft = l as TDictionary; + + if(dleft != null) + { + if(dleft.MemberExists("ls")) + { + var mbm = dleft["ls"] as ICallable; + if(mbm != null) + { + return mbm.Call(r); + } + } + } + + if(lnum != null && rnum != null) + return new TNumber((long)lnum.Value << (int)rnum.Value); + + return new TNull(); + } + } +} \ No newline at end of file diff --git a/tlanglib/LessThanEqualsNode.cs b/tlanglib/LessThanEqualsNode.cs new file mode 100644 index 0000000..792c6e5 --- /dev/null +++ b/tlanglib/LessThanEqualsNode.cs @@ -0,0 +1,40 @@ +namespace tlang +{ + internal class LessThanEqualsNode : Node + { + public Node Left {get;set;} + public Node Right {get;set;} + + public LessThanEqualsNode(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 dleft = l as TDictionary; + + if(dleft != null) + { + if(dleft.MemberExists("lte")) + { + var mbm = dleft["lte"] as ICallable; + if(mbm != null) + { + return mbm.Call(r); + } + } + } + + if(lnum != null && rnum != null) + return new TNumber(lnum.Value <= rnum.Value ? 1 : 0); + + return new TNull(); + } + } +} \ No newline at end of file diff --git a/tlanglib/LessThanNode.cs b/tlanglib/LessThanNode.cs new file mode 100644 index 0000000..e16ab6d --- /dev/null +++ b/tlanglib/LessThanNode.cs @@ -0,0 +1,40 @@ +namespace tlang +{ + internal class LessThanNode : Node + { + public Node Left {get;set;} + public Node Right {get;set;} + + public LessThanNode(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 dleft = l as TDictionary; + + if(dleft != null) + { + if(dleft.MemberExists("lt")) + { + var mbm = dleft["lt"] as ICallable; + if(mbm != null) + { + return mbm.Call(r); + } + } + } + + if(lnum != null && rnum != null) + return new TNumber(lnum.Value < rnum.Value ? 1 : 0); + + return new TNull(); + } + } +} \ No newline at end of file diff --git a/tlanglib/LogicalAndNode.cs b/tlanglib/LogicalAndNode.cs new file mode 100644 index 0000000..0d54fb6 --- /dev/null +++ b/tlanglib/LogicalAndNode.cs @@ -0,0 +1,31 @@ +namespace tlang +{ + internal class LogicalAndNode : Node + { + public Node Left {get;set;} + public Node Right {get;set;} + + public LogicalAndNode(Node left, Node right) + { + Left = left; + Right = right; + } + public override TObject Execute(IScopeEnvironment nodeEnv) + { + var l = Left.Execute(nodeEnv); + var r = Right.Execute(nodeEnv); + + var ldict = l as TDictionary; + + if(ldict != null) + { + var lor=ldict["land"] as ICallable; + if(lor != null) + { + return lor.Call(r); + } + } + return new TNumber(l.AsBoolean && r.AsBoolean ? 1 : 0); + } + } +} \ No newline at end of file diff --git a/tlanglib/LogicalOrNode.cs b/tlanglib/LogicalOrNode.cs new file mode 100644 index 0000000..4b9ed67 --- /dev/null +++ b/tlanglib/LogicalOrNode.cs @@ -0,0 +1,31 @@ +namespace tlang +{ + internal class LogicalOrNode : Node + { + public Node Left {get;set;} + public Node Right {get;set;} + + public LogicalOrNode(Node left, Node right) + { + Left = left; + Right = right; + } + public override TObject Execute(IScopeEnvironment nodeEnv) + { + var l = Left.Execute(nodeEnv); + var r = Right.Execute(nodeEnv); + + var ldict = l as TDictionary; + + if(ldict != null) + { + var lor=ldict["lor"] as ICallable; + if(lor != null) + { + return lor.Call(r); + } + } + return new TNumber(l.AsBoolean || r.AsBoolean ? 1 : 0); + } + } +} \ No newline at end of file diff --git a/tlanglib/NotEqualsNode.cs b/tlanglib/NotEqualsNode.cs new file mode 100644 index 0000000..bfb5989 --- /dev/null +++ b/tlanglib/NotEqualsNode.cs @@ -0,0 +1,40 @@ +namespace tlang +{ + internal class NotEqualsNode : Node + { + public Node Left {get;set;} + public Node Right {get;set;} + + public NotEqualsNode(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 dleft = l as TDictionary; + + if(dleft != null) + { + if(dleft.MemberExists("neq")) + { + var mbm = dleft["neq"] as ICallable; + if(mbm != null) + { + return mbm.Call(r); + } + } + } + + if(lnum != null && rnum != null) + return new TNumber(lnum.Value != rnum.Value ? 1 : 0); + + return new TNull(); + } + } +} \ No newline at end of file diff --git a/tlanglib/RightShift.cs b/tlanglib/RightShift.cs new file mode 100644 index 0000000..a2345f4 --- /dev/null +++ b/tlanglib/RightShift.cs @@ -0,0 +1,40 @@ +namespace tlang +{ + internal class RightShiftNode : Node + { + public Node Left {get;set;} + public Node Right {get;set;} + + public RightShiftNode(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 dleft = l as TDictionary; + + if(dleft != null) + { + if(dleft.MemberExists("rs")) + { + var mbm = dleft["rs"] as ICallable; + if(mbm != null) + { + return mbm.Call(r); + } + } + } + + if(lnum != null && rnum != null) + return new TNumber((long)lnum.Value >> (int)rnum.Value); + + return new TNull(); + } + } +} \ No newline at end of file diff --git a/tlanglib/XOrNode.cs b/tlanglib/XOrNode.cs new file mode 100644 index 0000000..bab6d89 --- /dev/null +++ b/tlanglib/XOrNode.cs @@ -0,0 +1,40 @@ +namespace tlang +{ + internal class XOrNode : Node + { + public Node Left {get;set;} + public Node Right {get;set;} + + public XOrNode(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 dleft = l as TDictionary; + + if(dleft != null) + { + if(dleft.MemberExists("xor")) + { + var mbm = dleft["xor"] as ICallable; + if(mbm != null) + { + return mbm.Call(r); + } + } + } + + if(lnum != null && rnum != null) + return new TNumber((long)lnum.Value ^ (long)rnum.Value); + + return new TNull(); + } + } +} \ No newline at end of file