コード例 #1
0
ファイル: primitives.c プロジェクト: ptdecker/ptscheme
//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)
            );
    }
}
コード例 #2
0
ファイル: primitives.c プロジェクト: ptdecker/ptscheme
//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)
            );
    }

}
コード例 #3
0
ファイル: LispPrinter.cpp プロジェクト: johnfredcee/lispp
	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#";
	}
コード例 #4
0
ファイル: primitives.c プロジェクト: ptdecker/ptscheme
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);
}
コード例 #5
0
ファイル: primitives.c プロジェクト: ptdecker/ptscheme
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);
}
コード例 #6
0
ファイル: primitives.c プロジェクト: ptdecker/ptscheme
object *is_real_proc(object *arguments) {
    return make_boolean(is_floatnum(car(arguments)));
}
コード例 #7
0
ファイル: util.c プロジェクト: benbscholz/bscheme
object *is_float_proc(object *arguments) {
	return is_floatnum(car(arguments)) ? true : false;
}