示例#1
0
        private static Object Equal(IEnumerable <Object> args)
        {
            // TODO: Validate: number.
            var areEqual = args.Skip(1).All(arg => (Number)arg == (Number)args.First());

            return(Boolean.FromBool(areEqual));
        }
示例#2
0
        private static Object IsNull(IEnumerable <Object> args)
        {
            var argsArray = args.ToArray();

            ValidateArgCount(1, argsArray.Length);

            return(Boolean.FromBool(argsArray[0] == ConsCell.Nil));
        }
示例#3
0
        private static Object IsPair(IEnumerable <Object> args)
        {
            var argsArray = args.ToArray();

            ValidateArgCount(1, argsArray.Length);

            bool isPair = argsArray[0] is ConsCell;

            return(Boolean.FromBool(isPair));
        }
示例#4
0
        private static Object IsBoolean(IEnumerable <Object> args)
        {
            var argsArray = args.ToArray();

            ValidateArgCount(1, argsArray.Length);

            bool isBoolean = argsArray[0] is Boolean;

            return(Boolean.FromBool(isBoolean));
        }
示例#5
0
        private static Object Not(IEnumerable <Object> args)
        {
            var argsArray = args.ToArray();

            ValidateArgCount(1, argsArray.Length);

            bool isFalse = argsArray[0] == Boolean.FALSE;

            return(Boolean.FromBool(isFalse));
        }
示例#6
0
        private static Object IsList(IEnumerable <Object> args)
        {
            var argsArray = args.ToArray();

            ValidateArgCount(1, argsArray.Length);

            var arg = argsArray[0];

            if (!(arg is ConsCell))
            {
                return(Boolean.FALSE);
            }
            return(Boolean.FromBool(((ConsCell)arg).CheckIfIsList()));
        }
示例#7
0
    private Object EvaluateNumberOp(Number left, Number right, BinaryOp.OpType type)
    {
        switch (type)
        {
        case BinaryOp.OpType.Add:
            return(new Number(left.value + right.value));

        case BinaryOp.OpType.Subtract:
            return(new Number(left.value - right.value));

        case BinaryOp.OpType.Divide:
            return(new Number(left.value / right.value));

        case BinaryOp.OpType.Power:
            return(new Number(Math.Pow(left.value, right.value)));

        case BinaryOp.OpType.Multiply:
            return(new Number(left.value * right.value));

        case BinaryOp.OpType.Modulo:
            return(new Number(left.value % right.value));

        case BinaryOp.OpType.Equal:
            return(Boolean.FromBool(left.value == right.value));

        case BinaryOp.OpType.GreaterThan:
            return(Boolean.FromBool(left.value > right.value));

        case BinaryOp.OpType.GreaterOrEqual:
            return(Boolean.FromBool(left.value >= right.value));

        case BinaryOp.OpType.LessThan:
            return(Boolean.FromBool(left.value < right.value));

        case BinaryOp.OpType.LessOrEqual:
            return(Boolean.FromBool(left.value <= right.value));

        case BinaryOp.OpType.NotEqual:
            return(Boolean.FromBool(left.value != right.value));

        default:
            return(new Error($"unsupported operation with numbers: {type}. Consider doing a type transformation"));
        }
    }