//TODO: Add integer reduction, consider using fpisanint() instead of fmod approach object *remainder_proc(object *arguments) { if (is_floatnum(car(arguments)) || is_floatnum(cadr(arguments))) { return make_floatnum( fmod((is_floatnum(car(arguments)) ? (car(arguments))->data.floatnum.value : (double)(car(arguments))->data.fixnum.value), (is_floatnum(cadr(arguments)) ? (cadr(arguments))->data.floatnum.value : (double)(cadr(arguments))->data.fixnum.value)) ); } else { return make_fixnum( ((car(arguments) )->data.fixnum.value) % ((cadr(arguments))->data.fixnum.value) ); } }
//TODO: Add integer reduction, consider using fpisanint() instead of fmod approach object *quotient_proc(object *arguments) { if (is_floatnum(car(arguments)) || is_floatnum(cadr(arguments))) { return make_floatnum( (is_floatnum(car(arguments)) ? (car(arguments))->data.floatnum.value : (double)(car(arguments))->data.fixnum.value) / (is_floatnum(cadr(arguments)) ? (cadr(arguments))->data.floatnum.value : (double)(cadr(arguments))->data.fixnum.value) ); } else { return make_fixnum( ((car(arguments) )->data.fixnum.value) / ((cadr(arguments))->data.fixnum.value) ); } }
void Printer::print(LispObjRef obj) { if (is_nil(obj)) output_ << "NIL"; else if (is_fixnum(obj)) output_ << get_ctype<FixnumType>(obj); // (CFixnum)(boost::get<FixnumType>(*obj)); else if (is_floatnum(obj)) output_ << get_ctype<FloatnumType>(obj); //(CFloatnum)(boost::get<FloatnumType>(*obj)); else if (is_string(obj)) output_ << "\"" << get_ctype<StringType>(obj) << "\""; // ""(CString)(boost::get<StringType>(*obj)) << "\""; else if (is_symbol(obj)) output_ << get_ctype<SymbolType>(obj).name; // static_cast<LispSymbol>(boost::get<SymbolType>(*obj)).first; else if (is_cons(obj)) { output_ << "("; print_cons(obj); output_ << ")"; } else if (is_char(obj)) { CChar c = get_ctype<CharType>(obj); if (isprint(c)) { output_ << c; } else { output_ << "#" << std::hex << (int) c << std::dec; } } else output_ << "#UNPRINTABLE#"; }
object *sub_proc(object *arguments) { long result; double result2 = 0.0; bool real_mode = false; bool real = false; real = is_floatnum(car(arguments)); if (real) { real_mode = true; result2 = (car(arguments))->data.floatnum.value; } else result = (car(arguments))->data.fixnum.value; while (!is_empty(arguments = cdr(arguments))) { if (real_mode) { real = is_floatnum(car(arguments)); if (real) result2 -= (car(arguments))->data.floatnum.value; else result2 -= (double)(car(arguments))->data.fixnum.value; } else { real = is_floatnum(car(arguments)); if (real) { result2 = (double)result - (car(arguments))->data.floatnum.value; real_mode = true; } else result -= (car(arguments))->data.fixnum.value; } } //TODO: Consider using fpisanint() instead of fmod approach if (real_mode && fmod(result2, 1) != 0.0) return make_floatnum(result2); else if (real_mode) return make_fixnum(lround(result2)); else return make_fixnum(result); }
object *mul_proc(object *arguments) { long result = 1; double result2 = 1.0; bool real = false; while (!is_empty(arguments)) { real = is_floatnum(car(arguments)); if (real) result2 *= (car(arguments))->data.floatnum.value; else result *= (car(arguments))->data.fixnum.value; arguments = cdr(arguments); } //TODO: Consider using fpisanint() instead of fmod approach if ((real || (result2 != 0.0)) && fmod(result2, 1) != 0.0) return make_floatnum(result2 * (double)result); else if (real || (result2 != 0.0)) return make_fixnum(lround(result2 * (double)result)); else return make_fixnum(result); }
object *is_real_proc(object *arguments) { return make_boolean(is_floatnum(car(arguments))); }
object *is_float_proc(object *arguments) { return is_floatnum(car(arguments)) ? true : false; }