Exemple #1
0
// (modulo x y)
Cell* op_mod(Scheme *sc) {
	Cell* x = first(sc->args);
	Cell* y = second(sc->args);

	Num value = num_value(x);
	if (long_value(y) != 0) {
		value = num_mod(value, num_value(y));
		return s_return_helper(sc, make_number(sc, value));
	} else {
		return error_helper(sc, "modulo: division by zero", NULL);
	}
}
Exemple #2
0
// (- x y ...)
Cell* op_sub(Scheme *sc) {
	Num value;
	Cell* x;
	if (cdr(sc->args) == &g_nil) {
		x = sc->args;
		value = g_zero;
	} else {
		x = cdr(sc->args);
		value = num_value(car(sc->args));
	}
	for (; x != &g_nil; x = cdr(x)) {
		value = num_sub(value, num_value(car(x)));
	}
	return s_return_helper(sc, make_number(sc, value));
}
Exemple #3
0
// (* x y ...)
Cell* op_mul(Scheme *sc) {
	Num value = g_one;

	Cell* x;
	for (x = sc->args; x != &g_nil; x = cdr(x)) {
		value = num_mul(value, num_value(car(x)));
	}
	return s_return_helper(sc, make_number(sc, value));
}
Exemple #4
0
// (quotient x y ...)
Cell* op_intdiv(Scheme *sc) {
	Num value;
	Cell* x;
	if (cdr(sc->args) == &g_nil) {
		x = sc->args;
		value = g_one;
	} else {
		x = cdr(sc->args);
		value = num_value(car(sc->args));
	}
	for (; x != &g_nil; x = cdr(x)) {
		if (long_value(car(x)) != 0)
			value = num_intdiv(value, num_value(car(x)));
		else {
			return error_helper(sc, "quotient: division by zero", NULL);
		}
	}
	return s_return_helper(sc, make_number(sc, value));
}
Exemple #5
0
// (/ x y ...)
Cell* op_div(Scheme *sc) {
	Num value;
	Cell* x;
	if (cdr(sc->args) == &g_nil) {
		x = sc->args;
		value = g_one;
	} else {
		x = cdr(sc->args);
		value = num_value(car(sc->args));
	}
	for (; x != &g_nil; x = cdr(x)) {
		if (!is_zero_double(double_value(car(x))))
			value = num_div(value, num_value(car(x)));
		else {
			return error_helper(sc, "/: division by zero", NULL);
		}
	}
	return s_return_helper(sc, make_number(sc, value));
}
Exemple #6
0
uint64_t char_To64bitNum(char *p)
{
    uint64_t res=0;
    while(*p)
    {
        res<<=4;
        res|= num_value(*p);
        p++;
    }
    return res;
}