Вот как я реализовал функции в Urlang:
(define/export/arity (quotient n m)
(Math.floor (/ n m)))
(define/export/arity (remainder n m)
(% n m))
(define/export/arity (quotient/remainder n m)
(values (quotient n m) (remainder n m)))
(define/export/arity (modulo n m)
(var [who (λ() (string->symbol "modulo"))])
(unless (and (number? n) (not (infinite? n)))
(raise-argument-error (who) "integer?" 1 n m))
(unless (and (number? m) (not (infinite? m)))
(raise-argument-error (who) "integer?" 2 n m))
(% (+ (% n m) m) m))
Здесь Math.floor
, %
и +
являются стандартными JavaScript функциями / операторами.
Для любопытных: JavaScript произведено:
function remainder(n,m){if(!((arguments.length===2)===false))VOID;else (raise_arity_error_m((string__gsymbol("remainder")),2,arguments));;return (n%m);};
function quotient_qremainder(n,m){if(!((arguments.length===2)===false))VOID;else (raise_arity_error_m((string__gsymbol("quotient/remainder")),2,arguments));;return (values((quotient(n,m)),(remainder(n,m))));};
function modulo(n,m){if(!((arguments.length===2)===false))VOID;else (raise_arity_error_m((string__gsymbol("modulo")),2,arguments));;var who=(function(){return (string__gsymbol("modulo"));});(((!((number_p(n))&&(!(infinite_p(n)))))===false)?undefined:((function(){return (raise_argument_error((who()),"integer?",1,n,m));})()));(((!((number_p(m))&&(!(infinite_p(m)))))===false)?undefined:((function(){return (raise_argument_error((who()),"integer?",2,n,m));})()));return (((n%m)+m)%m);};
ОБНОВЛЕНИЕ
Вот небольшой контекст. Код реализует остаток и модуль по времени выполнения Схемы. Среда выполнения реализована в Urlang (то есть JavaScript с синтаксисом s-выражения).
Из вывода JavaScript вы можете видеть, что:
- Схема
remainder
реализовано как n%m
. - Схема
modulo
реализована как ((n%m)+m)%m
Это предполагает, что номера Схемы представлены как JavaScript числа (то есть без бигнумов) .