コード例 #1
0
ファイル: ErlangExpression.cs プロジェクト: ixmilia/erlang
        public override ErlangValue Evaluate(ErlangProcess process)
        {
            var result = Expression.Evaluate(process);

            if (result.Kind == ErlangValueKind.Error)
            {
                return(result);
            }
            switch (Operator)
            {
            case ErlangOperatorKind.Plus:
                return(ErlangValue.Multiply(result, ErlangNumber.One));

            case ErlangOperatorKind.Minus:
                return(ErlangValue.Multiply(result, ErlangNumber.NegativeOne));

            case ErlangOperatorKind.Not:
                return(ErlangValue.Not(result));

            case ErlangOperatorKind.BNot:
                if (result.Kind == ErlangValueKind.Number)
                {
                    return(ErlangNumber.BNot((ErlangNumber)result));
                }
                else
                {
                    return(new ErlangError("not integral"));
                }

            default:
                return(new ErlangError(string.Format("Invalid unary operator: {0}", Operator)));
            }
        }
コード例 #2
0
 public static ErlangValue Remainder(ErlangNumber a, ErlangNumber b)
 {
     if (!a.IsIntegral || !b.IsIntegral)
     {
         return(new ErlangError("not integers"));
     }
     return(new ErlangNumber(a.IntegerValue % b.IntegerValue));
 }
コード例 #3
0
 public static ErlangValue EqualsColonEquals(ErlangValue a, ErlangValue b)
 {
     // this only matters for numbers
     if (a.Kind == ErlangValueKind.Number && b.Kind == ErlangValueKind.Number)
     {
         return(ErlangNumber.ExactlyEquals((ErlangNumber)a, (ErlangNumber)b) ? ErlangAtom.True : ErlangAtom.False);
     }
     return(EqualsEquals(a, b));
 }
コード例 #4
0
 private static bool DoBooleanOp(ErlangNumber a, ErlangNumber b, Func <double, double, bool> doubleOp, Func <BigInteger, BigInteger, bool> bigOp)
 {
     if (a.IsIntegral && b.IsIntegral)
     {
         return(bigOp(a.IntegerValue, b.IntegerValue));
     }
     else
     {
         return(doubleOp(a.AsDouble(), b.AsDouble()));
     }
 }
コード例 #5
0
 private static ErlangNumber DoNumericOp(ErlangNumber a, ErlangNumber b, Func <double, double, double> doubleOp, Func <BigInteger, BigInteger, BigInteger> bigOp)
 {
     if (a.IsIntegral && b.IsIntegral)
     {
         return(new ErlangNumber(bigOp(a.IntegerValue, b.IntegerValue)));
     }
     else
     {
         return(new ErlangNumber(doubleOp(a.AsDouble(), b.AsDouble())));
     }
 }
コード例 #6
0
 public static bool ExactlyNotEquals(ErlangNumber a, ErlangNumber b)
 {
     if (a.IsIntegral != b.IsIntegral)
     {
         return(true);
     }
     if (a.IsIntegral)
     {
         return(a.IntegerValue != b.IntegerValue);
     }
     else
     {
         return(a.DoubleValue != b.DoubleValue);
     }
 }
コード例 #7
0
ファイル: ErlangExpression.cs プロジェクト: ixmilia/erlang
 public ErlangConstantExpression(ErlangNumber value)
 {
     Value = value;
 }
コード例 #8
0
ファイル: ErlangExpression.cs プロジェクト: ixmilia/erlang
 public ErlangConstantExpression(char c)
 {
     Value = new ErlangNumber(c);
 }
コード例 #9
0
 public static ErlangValue Remainder(ErlangValue a, ErlangValue b)
 {
     return(OperationWithNumbers(a, b, (x, y) => ErlangNumber.Remainder(x, y)));
 }
コード例 #10
0
 public static ErlangValue BNot(ErlangNumber n)
 {
     return(n.IsIntegral
         ? (ErlangValue) new ErlangNumber((n.IntegerValue + 1) * -1)
         : new ErlangError("not integral"));
 }
コード例 #11
0
 public static ErlangValue Div(ErlangValue a, ErlangValue b)
 {
     return(OperationWithNumbers(a, b, (x, y) => ErlangNumber.Div(x, y)));
 }