(bind-func Rational_greatest_common_divisor
(lambda (m:i64 n:i64)
(if (and (= m 0) (= n 0))
-1
(let ((r 0))
(if (< m 0) (set! m (* m -1)))
(if (< n 0) (set! n (* n -1)))
(while (not (= n 0))
(set! r (% m n))
(set! m n)
(set! n r))
m))))