diff --git a/include/cyclone/runtime.h b/include/cyclone/runtime.h index 9f748f10..f9c18419 100644 --- a/include/cyclone/runtime.h +++ b/include/cyclone/runtime.h @@ -93,6 +93,16 @@ object Cyc_global_set(void *thd, object *glo, object value); } \ return_closcall1(data, cont, &d) +#define return_exact_double_op(data, cont, OP, z) \ + make_int(i, 0); \ + Cyc_check_num(data, z); \ + if (type_of(z) == integer_tag) { \ + i.value = (int)OP(((integer_type *)z)->value); \ + } else { \ + i.value = (int)OP(((double_type *)z)->value); \ + } \ + return_closcall1(data, cont, &i) + /* Prototypes for primitive functions. */ extern object Cyc_global_variables; diff --git a/scheme/base.sld b/scheme/base.sld index aaa00a65..71adc40b 100644 --- a/scheme/base.sld +++ b/scheme/base.sld @@ -92,6 +92,10 @@ cond-expand when quasiquote + floor + ceiling + truncate + round ) (begin ;; Features implemented by this Scheme @@ -648,4 +652,16 @@ (else #f)))) + (define-c floor + "(void *data, int argc, closure _, object k, object z)" + " return_exact_double_op(data, k, floor, z); ") + (define-c ceiling + "(void *data, int argc, closure _, object k, object z)" + " return_exact_double_op(data, k, ceil, z); ") + (define-c truncate + "(void *data, int argc, closure _, object k, object z)" + " return_exact_double_op(data, k, (int), z); ") + (define-c round + "(void *data, int argc, closure _, object k, object z)" + " return_exact_double_op(data, k, round, z); ") ))