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)); }
private static Object IsNull(IEnumerable <Object> args) { var argsArray = args.ToArray(); ValidateArgCount(1, argsArray.Length); return(Boolean.FromBool(argsArray[0] == ConsCell.Nil)); }
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)); }
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)); }
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)); }
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())); }
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")); } }