LINUX.ORG.RU

Typed Racket. Что я делаю не так?

 ,


0

2

Хочу ускорить пример кода

(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)))
вообще 2-3 секунды.

Пытаюсь сделать типы в 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)

Что я делаю не так и как правильно?

★★★★★

Последнее исправление: monk (всего исправлений: 2)
Ответ на: комментарий от anonymous

что-то я не понял что это за ворнинг. Код ведь вполне ок?

Функция берёт один аргумент, а ей передано 0. Соответственно портится стек. SBCL это видит и паникует.

monk ★★★★★
() автор топика
Ответ на: комментарий от yyk

Я всего лишь о том, что наличие такой возможности - лучше чем её отсутствие.

IMHO, это как возможность асемблерных вставок в Си/Паскале. Неплохо, но почти никогда не нужно.

monk ★★★★★
() автор топика
Ответ на: комментарий от monk

Почти никогда не нужен и задний противотуманный фонарь в авто. Но без него телега мне ни во что не упёрлась :)

yyk ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.