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))); } }
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)); }
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)); }
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())); } }
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()))); } }
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); } }
public ErlangConstantExpression(ErlangNumber value) { Value = value; }
public ErlangConstantExpression(char c) { Value = new ErlangNumber(c); }
public static ErlangValue Remainder(ErlangValue a, ErlangValue b) { return(OperationWithNumbers(a, b, (x, y) => ErlangNumber.Remainder(x, y))); }
public static ErlangValue BNot(ErlangNumber n) { return(n.IsIntegral ? (ErlangValue) new ErlangNumber((n.IntegerValue + 1) * -1) : new ErlangError("not integral")); }
public static ErlangValue Div(ErlangValue a, ErlangValue b) { return(OperationWithNumbers(a, b, (x, y) => ErlangNumber.Div(x, y))); }