// (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); } }
// (- 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)); }
// (* 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)); }
// (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)); }
// (/ 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)); }
uint64_t char_To64bitNum(char *p) { uint64_t res=0; while(*p) { res<<=4; res|= num_value(*p); p++; } return res; }