Хочу ускорить пример кода
(define (test)
(letrec ([oddp (lambda (x)
(if (zero? x) #f
(evenp (sub1 x))))]
[evenp (lambda (x)
(if (zero? x) #t
(oddp (sub1 x))))])
(oddp 400000000)))
потому как выполняется он 30-35 секунд, в то время как эквивалентный на sbcl:
(defun test ()
(labels ((oddp1 (x)
(if (zerop x) nil
(evenp1 (1- x))))
(evenp1 (x)
(if (zerop x) t
(oddp1 (1- x)))))
(oddp1 400000000)))
всего лишь 4-8 секунд, а в варианте
(defun test ()
(labels ((oddp1 (x) (declare (fixnum x))
(if (zerop x) nil
(evenp1 (1- x))))
(evenp1 (x) (declare (fixnum x))
(if (zerop x) t
(oddp1 (1- x)))))
(oddp1 400000000)))
Пытаюсь сделать типы в Racket:
(define (test)
(letrec: ([oddp : (Fixnum -> Boolean)
(λ: ([x : Fixnum])
(if (zero? x) #f
(evenp (sub1 x))))]
[evenp : (Fixnum -> Boolean)
(λ: ([x : Fixnum])
(if (zero? x) #t
(oddp (sub1 x))))])
(oddp 400000000)))
Получаю ошибку: Type Checker: Expected Fixnum, but got Integer in: (sub1 x)
Что я делаю не так и как правильно?