protected internal override KecaknoahObject ExpressionOperation(KecaknoahILCodeType op, KecaknoahObject target) { if (target.ExtraType == "TimeSpan") { var t = ((KecaknoahTimeSpan)target).timespan; switch (op) { case KecaknoahILCodeType.Plus: return new KecaknoahTimeSpan(timespan + t); case KecaknoahILCodeType.Minus: return new KecaknoahTimeSpan(timespan - t); default: return KecaknoahNil.Instance; } } else { switch (op) { case KecaknoahILCodeType.Equal: return KecaknoahBoolean.False; case KecaknoahILCodeType.NotEqual: return KecaknoahBoolean.True; default: return KecaknoahNil.Instance; } } }
protected internal override KecaknoahObject ExpressionOperation(KecaknoahILCodeType op, KecaknoahObject target) { if (target.ExtraType == "DynamicObject") { var t = target as KecaknoahDynamicObject; switch (op) { case KecaknoahILCodeType.Equal: return((t == target).AsKecaknoahBoolean()); case KecaknoahILCodeType.NotEqual: return((t != target).AsKecaknoahBoolean()); default: return(base.ExpressionOperation(op, target)); } } else { switch (op) { case KecaknoahILCodeType.Equal: return(KecaknoahBoolean.False); case KecaknoahILCodeType.NotEqual: return(KecaknoahBoolean.True); default: return(base.ExpressionOperation(op, target)); } } }
/// <summary> /// /// </summary> /// <param name="op"></param> /// <param name="target"></param> /// <returns></returns> protected internal override KecaknoahObject ExpressionOperation(KecaknoahILCodeType op, KecaknoahObject target) { if (target.Type == TypeCode.Int64) { return(ExpressionOperation(op, (KecaknoahInteger)target)); } else if (target.Type == TypeCode.Double) { return(ExpressionOperation(op, (KecaknoahFloat)target)); } else { switch (op) { case KecaknoahILCodeType.Equal: return(KecaknoahBoolean.False); case KecaknoahILCodeType.NotEqual: return(KecaknoahBoolean.True); default: return(KecaknoahNil.Instance); } } }
private KecaknoahObject ExpressionOperation(KecaknoahILCodeType op, KecaknoahInteger target) { switch (op) { case KecaknoahILCodeType.Negative: return (-Value).AsKecaknoahFloat(); case KecaknoahILCodeType.Plus: return (Value + target.Value).AsKecaknoahFloat(); case KecaknoahILCodeType.Minus: return (Value - target.Value).AsKecaknoahFloat(); case KecaknoahILCodeType.Multiply: return (Value * target.Value).AsKecaknoahFloat(); case KecaknoahILCodeType.Divide: return (Value / target.Value).AsKecaknoahFloat(); case KecaknoahILCodeType.Modular: return (Value % target.Value).AsKecaknoahFloat(); case KecaknoahILCodeType.Equal: return (Value == target.Value).AsKecaknoahBoolean(); case KecaknoahILCodeType.NotEqual: return (Value != target.Value).AsKecaknoahBoolean(); case KecaknoahILCodeType.Greater: return (Value > target.Value).AsKecaknoahBoolean(); case KecaknoahILCodeType.Lesser: return (Value < target.Value).AsKecaknoahBoolean(); case KecaknoahILCodeType.GreaterEqual: return (Value >= target.Value).AsKecaknoahBoolean(); case KecaknoahILCodeType.LesserEqual: return (Value <= target.Value).AsKecaknoahBoolean(); default: return KecaknoahNil.Instance; } }
private KecaknoahObject ExpressionOperation(KecaknoahILCodeType op, KecaknoahInteger target) { switch (op) { case KecaknoahILCodeType.Negative: return((-Value).AsKecaknoahInteger()); case KecaknoahILCodeType.Plus: return((Value + target.Value).AsKecaknoahInteger()); case KecaknoahILCodeType.Minus: return((Value - target.Value).AsKecaknoahInteger()); case KecaknoahILCodeType.Multiply: return((Value * target.Value).AsKecaknoahInteger()); case KecaknoahILCodeType.Divide: return((Value / target.Value).AsKecaknoahInteger()); case KecaknoahILCodeType.And: return((Value & target.Value).AsKecaknoahInteger()); case KecaknoahILCodeType.Or: return((Value | target.Value).AsKecaknoahInteger()); case KecaknoahILCodeType.Xor: return((Value ^ target.Value).AsKecaknoahInteger()); case KecaknoahILCodeType.Modular: return((Value % target.Value).AsKecaknoahInteger()); case KecaknoahILCodeType.LeftBitShift: return((Value << (int)target.Value).AsKecaknoahInteger()); case KecaknoahILCodeType.RightBitShift: return((Value >> (int)target.Value).AsKecaknoahInteger()); case KecaknoahILCodeType.Equal: return((Value == target.Value).AsKecaknoahBoolean()); case KecaknoahILCodeType.NotEqual: return((Value != target.Value).AsKecaknoahBoolean()); case KecaknoahILCodeType.Greater: return((Value > target.Value).AsKecaknoahBoolean()); case KecaknoahILCodeType.Lesser: return((Value < target.Value).AsKecaknoahBoolean()); case KecaknoahILCodeType.GreaterEqual: return((Value >= target.Value).AsKecaknoahBoolean()); case KecaknoahILCodeType.LesserEqual: return((Value <= target.Value).AsKecaknoahBoolean()); default: return(KecaknoahNil.Instance); } }
/// <summary> /// このオブジェクトに対して二項式としての演算をします。 /// </summary> /// <param name="op">演算子</param> /// <param name="target">2項目の<see cref="KecaknoahObject"/></param> /// <returns></returns> protected internal virtual KecaknoahObject ExpressionOperation(KecaknoahILCodeType op, KecaknoahObject target) { switch(op) { case KecaknoahILCodeType.Equal: return Equals(target).AsKecaknoahBoolean(); case KecaknoahILCodeType.NotEqual: return (!Equals(target)).AsKecaknoahBoolean(); default: throw new InvalidOperationException($"この{nameof(KecaknoahObject)}に対して式操作は出来ません。"); } }
/// <summary> /// このオブジェクトに対して二項式としての演算をしようとしても大体nilです。 /// </summary> /// <param name="op">演算子</param> /// <param name="target">2項目の<see cref="KecaknoahObject"/></param> /// <returns></returns> protected internal override KecaknoahObject ExpressionOperation(KecaknoahILCodeType op, KecaknoahObject target) { switch (op) { case KecaknoahILCodeType.Equal: return (dynamic)this == (dynamic)target; case KecaknoahILCodeType.NotEqual: return (dynamic)this != (dynamic)target; default: return KecaknoahNil.Instance; } }
/// <summary> /// このオブジェクトに対して二項式としての演算をしようとしても大体nilです。 /// </summary> /// <param name="op">演算子</param> /// <param name="target">2項目の<see cref="KecaknoahObject"/></param> /// <returns></returns> protected internal override KecaknoahObject ExpressionOperation(KecaknoahILCodeType op, KecaknoahObject target) { switch (op) { case KecaknoahILCodeType.Equal: return (ExtraType == target.ExtraType).AsKecaknoahBoolean(); case KecaknoahILCodeType.NotEqual: return (ExtraType != target.ExtraType).AsKecaknoahBoolean(); default: return Instance; } }
/// <summary> /// /// </summary> /// <param name="op"></param> /// <param name="target"></param> /// <returns></returns> protected internal override KecaknoahObject ExpressionOperation(KecaknoahILCodeType op, KecaknoahObject target) { if (op == KecaknoahILCodeType.Not) { return((!Value).AsKecaknoahBoolean()); } if (target.Type == TypeCode.Boolean) { var t = (KecaknoahBoolean)target; switch (op) { case KecaknoahILCodeType.AndAlso: return((Value && t.Value).AsKecaknoahBoolean()); case KecaknoahILCodeType.OrElse: return((Value || t.Value).AsKecaknoahBoolean()); case KecaknoahILCodeType.And: return((Value & t.Value).AsKecaknoahBoolean()); case KecaknoahILCodeType.Or: return((Value | t.Value).AsKecaknoahBoolean()); case KecaknoahILCodeType.Xor: return((Value ^ t.Value).AsKecaknoahBoolean()); case KecaknoahILCodeType.Equal: return((Value == t.Value).AsKecaknoahBoolean()); case KecaknoahILCodeType.NotEqual: return((Value != t.Value).AsKecaknoahBoolean()); default: return(KecaknoahNil.Instance); } } else { switch (op) { case KecaknoahILCodeType.Equal: return(False); case KecaknoahILCodeType.NotEqual: return(True); default: return(KecaknoahNil.Instance); } } }
/// <summary> /// このオブジェクトに対して二項式としての演算をしようとしても大体nilです。 /// </summary> /// <param name="op">演算子</param> /// <param name="target">2項目の<see cref="KecaknoahObject"/></param> /// <returns></returns> protected internal override KecaknoahObject ExpressionOperation(KecaknoahILCodeType op, KecaknoahObject target) { switch (op) { case KecaknoahILCodeType.Equal: return((dynamic)this == (dynamic)target); case KecaknoahILCodeType.NotEqual: return((dynamic)this != (dynamic)target); default: return(KecaknoahNil.Instance); } }
/// <summary> /// /// </summary> /// <param name="op"></param> /// <param name="target"></param> /// <returns></returns> protected internal override KecaknoahObject ExpressionOperation(KecaknoahILCodeType op, KecaknoahObject target) { if (target.Type == TypeCode.String) { var t = (KecaknoahString)target; switch (op) { case KecaknoahILCodeType.Plus: return((Value + t.Value).AsKecaknoahString()); case KecaknoahILCodeType.Equal: return((Value == t.Value).AsKecaknoahBoolean()); case KecaknoahILCodeType.NotEqual: return((Value != t.Value).AsKecaknoahBoolean()); case KecaknoahILCodeType.Greater: return((Value.CompareTo(t.Value) > 0).AsKecaknoahBoolean()); case KecaknoahILCodeType.Lesser: return((Value.CompareTo(t.Value) < 0).AsKecaknoahBoolean()); case KecaknoahILCodeType.GreaterEqual: return((Value.CompareTo(t.Value) >= 0).AsKecaknoahBoolean()); case KecaknoahILCodeType.LesserEqual: return((Value.CompareTo(t.Value) <= 0).AsKecaknoahBoolean()); default: return(KecaknoahNil.Instance); } } else { switch (op) { case KecaknoahILCodeType.Equal: return(KecaknoahBoolean.False); case KecaknoahILCodeType.NotEqual: return(KecaknoahBoolean.True); default: return(KecaknoahNil.Instance); } } }
private KecaknoahObject ExpressionOperation(KecaknoahILCodeType op, KecaknoahFloat target) { switch (op) { case KecaknoahILCodeType.Negative: return((-Value).AsKecaknoahFloat()); case KecaknoahILCodeType.Plus: return((Value + target.Value).AsKecaknoahFloat()); case KecaknoahILCodeType.Minus: return((Value - target.Value).AsKecaknoahFloat()); case KecaknoahILCodeType.Multiply: return((Value * target.Value).AsKecaknoahFloat()); case KecaknoahILCodeType.Divide: return((Value / target.Value).AsKecaknoahFloat()); case KecaknoahILCodeType.Modular: return((Value % target.Value).AsKecaknoahFloat()); case KecaknoahILCodeType.Equal: return((Value == target.Value).AsKecaknoahBoolean()); case KecaknoahILCodeType.NotEqual: return((Value != target.Value).AsKecaknoahBoolean()); case KecaknoahILCodeType.Greater: return((Value > target.Value).AsKecaknoahBoolean()); case KecaknoahILCodeType.Lesser: return((Value < target.Value).AsKecaknoahBoolean()); case KecaknoahILCodeType.GreaterEqual: return((Value >= target.Value).AsKecaknoahBoolean()); case KecaknoahILCodeType.LesserEqual: return((Value <= target.Value).AsKecaknoahBoolean()); default: return(KecaknoahNil.Instance); } }
/// <summary> /// /// </summary> /// <param name="op"></param> /// <param name="target"></param> /// <returns></returns> protected internal override KecaknoahObject ExpressionOperation(KecaknoahILCodeType op, KecaknoahObject target) { if (target.Type == TypeCode.Boolean) { var t = (KecaknoahBoolean)target; switch (op) { case KecaknoahILCodeType.Not: return (!Value).AsKecaknoahBoolean(); case KecaknoahILCodeType.AndAlso: return (Value && t.Value).AsKecaknoahBoolean(); case KecaknoahILCodeType.OrElse: return (Value || t.Value).AsKecaknoahBoolean(); case KecaknoahILCodeType.And: return (Value & t.Value).AsKecaknoahBoolean(); case KecaknoahILCodeType.Or: return (Value | t.Value).AsKecaknoahBoolean(); case KecaknoahILCodeType.Xor: return (Value ^ t.Value).AsKecaknoahBoolean(); case KecaknoahILCodeType.Equal: return (Value == t.Value).AsKecaknoahBoolean(); case KecaknoahILCodeType.NotEqual: return (Value != t.Value).AsKecaknoahBoolean(); default: return KecaknoahNil.Instance; } } else { switch (op) { case KecaknoahILCodeType.Equal: return False; case KecaknoahILCodeType.NotEqual: return True; default: return KecaknoahNil.Instance; } } }
private KecaknoahObject ExpressionOperation(KecaknoahILCodeType op, KecaknoahInteger target) { switch (op) { case KecaknoahILCodeType.Plus: return (Value + target.Value).AsKecaknoahInteger(); case KecaknoahILCodeType.Minus: return (Value - target.Value).AsKecaknoahInteger(); case KecaknoahILCodeType.Multiply: return (Value * target.Value).AsKecaknoahInteger(); case KecaknoahILCodeType.Divide: return (Value / target.Value).AsKecaknoahInteger(); case KecaknoahILCodeType.And: return (Value & target.Value).AsKecaknoahInteger(); case KecaknoahILCodeType.Or: return (Value | target.Value).AsKecaknoahInteger(); case KecaknoahILCodeType.Xor: return (Value ^ target.Value).AsKecaknoahInteger(); case KecaknoahILCodeType.Modular: return (Value % target.Value).AsKecaknoahInteger(); case KecaknoahILCodeType.LeftBitShift: return (Value << (int)target.Value).AsKecaknoahInteger(); case KecaknoahILCodeType.RightBitShift: return (Value >> (int)target.Value).AsKecaknoahInteger(); case KecaknoahILCodeType.Equal: return (Value == target.Value).AsKecaknoahBoolean(); case KecaknoahILCodeType.NotEqual: return (Value != target.Value).AsKecaknoahBoolean(); case KecaknoahILCodeType.Greater: return (Value > target.Value).AsKecaknoahBoolean(); case KecaknoahILCodeType.Lesser: return (Value < target.Value).AsKecaknoahBoolean(); case KecaknoahILCodeType.GreaterEqual: return (Value >= target.Value).AsKecaknoahBoolean(); case KecaknoahILCodeType.LesserEqual: return (Value <= target.Value).AsKecaknoahBoolean(); default: return KecaknoahNil.Instance; } }
/// <summary> /// /// </summary> /// <param name="op"></param> /// <param name="target"></param> /// <returns></returns> protected internal override KecaknoahObject ExpressionOperation(KecaknoahILCodeType op, KecaknoahObject target) { if (target.Type == TypeCode.String) { var t = (KecaknoahString)target; switch (op) { case KecaknoahILCodeType.Plus: return (Value + t.Value).AsKecaknoahString(); case KecaknoahILCodeType.Equal: return (Value == t.Value).AsKecaknoahBoolean(); case KecaknoahILCodeType.NotEqual: return (Value != t.Value).AsKecaknoahBoolean(); case KecaknoahILCodeType.Greater: return (Value.CompareTo(t.Value) > 0).AsKecaknoahBoolean(); case KecaknoahILCodeType.Lesser: return (Value.CompareTo(t.Value) < 0).AsKecaknoahBoolean(); case KecaknoahILCodeType.GreaterEqual: return (Value.CompareTo(t.Value) >= 0).AsKecaknoahBoolean(); case KecaknoahILCodeType.LesserEqual: return (Value.CompareTo(t.Value) <= 0).AsKecaknoahBoolean(); default: return KecaknoahNil.Instance; } } else { switch (op) { case KecaknoahILCodeType.Equal: return KecaknoahBoolean.False; case KecaknoahILCodeType.NotEqual: return KecaknoahBoolean.True; default: return KecaknoahNil.Instance; } } }
/// <summary> /// /// </summary> /// <param name="op"></param> /// <param name="target"></param> /// <returns></returns> protected internal override KecaknoahObject ExpressionOperation(KecaknoahILCodeType op, KecaknoahObject target) { if (target.Type == TypeCode.Int64) { return ExpressionOperation(op, (KecaknoahInteger)target); } else if (target.Type == TypeCode.Double) { return ExpressionOperation(op, (KecaknoahFloat)target); } else { switch (op) { case KecaknoahILCodeType.Equal: return KecaknoahBoolean.False; case KecaknoahILCodeType.NotEqual: return KecaknoahBoolean.True; default: return KecaknoahNil.Instance; } } }
/// <summary> /// 二項演算をします。 /// 実際には単項演算子でも適用されるため、-(<see cref="KecaknoahILCodeType.Negative"/>)と /// !(<see cref="KecaknoahILCodeType.Not"/>)にも対応出来ます。 /// <see cref="KecaknoahILCodeType"/>内にはその他の演算も含まれていますが、 /// 複合演算子はILレベルで処理されるので対応する意味はありません。 /// ちなみに<see cref="KecaknoahObject"/>との演算方法はどのように実装しても構いません。 /// Kecaknoah内部では<see cref="KecaknoahObject.Type"/>の比較と内部のValueプロパティによる比較となっています。 /// thisで比較すると99%falseになってしまうので注意してください。 /// </summary> /// <param name="op">演算子</param> /// <param name="target">対象のインスタンス</param> /// <returns></returns> protected internal override KecaknoahObject ExpressionOperation(KecaknoahILCodeType op, KecaknoahObject target) => base.ExpressionOperation(op, target);
/// <summary> /// 値を伴わないコードを追加します。 /// </summary> /// <param name="codeType">追加する<see cref="KecaknoahILCodeType"/></param> internal void PushCode(KecaknoahILCodeType codeType) { codes.Add(new KecaknoahILCode { Type = codeType }); }
/// <summary> /// 整数値を伴うコードを追加します。 /// </summary> /// <param name="codeType">追加する<see cref="KecaknoahILCodeType"/></param> /// <param name="value">値</param> internal void PushCode(KecaknoahILCodeType codeType, long value) { codes.Add(new KecaknoahILCode { Type = codeType, IntegerValue = value }); }
/// <summary> /// 二項演算をします。 /// 実際には単項演算子でも適用されるため、-(<see cref="KecaknoahILCodeType.Negative"/>)と /// !(<see cref="KecaknoahILCodeType.Not"/>)にも対応出来ます。 /// <see cref="KecaknoahILCodeType"/>内にはその他の演算も含まれていますが、 /// 複合演算子はILレベルで処理されるので対応する意味はありません。 /// ちなみに<see cref="KecaknoahObject"/>との演算方法はどのように実装しても構いません。 /// Kecaknoah内部では<see cref="KecaknoahObject.Type"/>の比較と内部のValueプロパティによる比較となっています。 /// thisで比較すると99%falseになってしまうので注意してください。 /// </summary> /// <param name="op">演算子</param> /// <param name="target">対象のインスタンス</param> /// <returns></returns> protected internal override KecaknoahObject ExpressionOperation(KecaknoahILCodeType op, KecaknoahObject target) { return base.ExpressionOperation(op, target); }
/// <summary> /// 浮動小数点数値を伴うコードを追加します。 /// </summary> /// <param name="codeType">追加する<see cref="KecaknoahILCodeType"/></param> /// <param name="value">値</param> internal void PushCode(KecaknoahILCodeType codeType, double value) { codes.Add(new KecaknoahILCode { Type = codeType, FloatValue = value }); }
/// <summary> /// 文字列を伴うコードを追加します。 /// </summary> /// <param name="codeType">追加する<see cref="KecaknoahILCodeType"/></param> /// <param name="value">値</param> internal void PushCode(KecaknoahILCodeType codeType, string value) { codes.Add(new KecaknoahILCode { Type = codeType, StringValue = value }); }
protected internal override KecaknoahObject ExpressionOperation(KecaknoahILCodeType op, KecaknoahObject target) { if (target.ExtraType == "DynamicObject") { var t = target as KecaknoahDynamicObject; switch (op) { case KecaknoahILCodeType.Equal: return (t == target).AsKecaknoahBoolean(); case KecaknoahILCodeType.NotEqual: return (t != target).AsKecaknoahBoolean(); default: return base.ExpressionOperation(op, target); } } else { switch (op) { case KecaknoahILCodeType.Equal: return KecaknoahBoolean.False; case KecaknoahILCodeType.NotEqual: return KecaknoahBoolean.True; default: return base.ExpressionOperation(op, target); } } }
/// <summary> /// このオブジェクトに対して二項式としての演算をします。 /// </summary> /// <param name="op">演算子</param> /// <param name="target">2項目の<see cref="KecaknoahObject"/></param> /// <returns></returns> protected internal virtual KecaknoahObject ExpressionOperation(KecaknoahILCodeType op, KecaknoahObject target) { throw new InvalidOperationException($"この{nameof(KecaknoahObject)}に対して式操作は出来ません。"); }
/// <summary> /// 真偽値を伴うコードを追加します。 /// </summary> /// <param name="codeType">追加する<see cref="KecaknoahILCodeType"/></param> /// <param name="value">値</param> internal void PushCode(KecaknoahILCodeType codeType, bool value) { codes.Add(new KecaknoahILCode { Type = codeType, BooleanValue = value }); }
/// <summary> /// 文字列を伴うコードを追加します。 /// </summary> /// <param name="codeType">追加する<see cref="KecaknoahILCodeType"/></param> /// <param name="value">値</param> internal void PushCode(KecaknoahILCodeType codeType, string value) { codes.Add(new KecaknoahILCode { Type = codeType, StringValue = value }); }
/// <summary> /// 浮動小数点数値を伴うコードを追加します。 /// </summary> /// <param name="codeType">追加する<see cref="KecaknoahILCodeType"/></param> /// <param name="value">値</param> internal void PushCode(KecaknoahILCodeType codeType, double value) { codes.Add(new KecaknoahILCode { Type = codeType, FloatValue = value }); }
/// <summary> /// 整数値を伴うコードを追加します。 /// </summary> /// <param name="codeType">追加する<see cref="KecaknoahILCodeType"/></param> /// <param name="value">値</param> internal void PushCode(KecaknoahILCodeType codeType, long value) { codes.Add(new KecaknoahILCode { Type = codeType, IntegerValue = value }); }
/// <summary> /// 真偽値を伴うコードを追加します。 /// </summary> /// <param name="codeType">追加する<see cref="KecaknoahILCodeType"/></param> /// <param name="value">値</param> internal void PushCode(KecaknoahILCodeType codeType, bool value) { codes.Add(new KecaknoahILCode { Type = codeType, BooleanValue = value }); }
/// <summary> /// 値を伴わないコードを追加します。 /// </summary> /// <param name="codeType">追加する<see cref="KecaknoahILCodeType"/></param> internal void PushCode(KecaknoahILCodeType codeType) { codes.Add(new KecaknoahILCode { Type = codeType }); }
/// <summary> /// このオブジェクトに対して二項式としての演算をします。 /// </summary> /// <param name="op">演算子</param> /// <param name="target">2項目の<see cref="KecaknoahObject"/></param> /// <returns></returns> protected internal virtual KecaknoahObject ExpressionOperation(KecaknoahILCodeType op, KecaknoahObject target) { throw new InvalidOperationException($"この{nameof(KecaknoahObject)}に対して式操作は出来ません。"); }