Невозможно использовать синхронизацию с набранной ракеткой

Привет, я учусь использовать средства ведения журнала, предоставляемые racket. Я написал следующий фрагмент кода, чтобы понять, как все работает.

#lang racket

(define list-logger (make-logger 'list-logger))

;;(: log-debug (String Symbol -> Void))
(define (log-debug message name)
  (log-message list-logger 'debug message name))

;;(: sum-a-list ((Listof Integer) (Integer Integer -> Integer) -> Integer))
(define (sum-a-list l operator)
  (begin (log-debug (format "Message ~a" l) 'sum-a-list)
         (cond [(empty? l) 0]
         [else (operator (first l) (sum-a-list (rest l) operator))])))

(define recevier (make-log-receiver list-logger 'debug))

;;(: main (-> Any))
(define (main)
  (begin (sum-a-list (list 1 2 3 4 5 6 7 8) +)
         ;; (: logger (-> Any)
         (define (logger)
           (let ([msg (sync recevier)])
             (match msg
               [(vector level m data x) (begin (printf "~a: ~a\n" level m)
                                               (logger))]
               [else #f ])))
         (logger)))

Приведенный выше код компилируется и отлично работает. Проблема возникает, когда я вместо ракетки использовал наборную ракетку. Для того же кода (с аннотациями типов и набранным / рэкетом) я получаю ошибку проверки типа.

;; code with typed racket and type annotations
#lang typed/racket

(define list-logger (make-logger 'list-logger))

(: log-debug (String Symbol -> Void))
(define (log-debug message name)
  (log-message list-logger 'debug message name))

(: sum-a-list ((Listof Integer) (Integer Integer -> Integer) -> Integer))
(define (sum-a-list l operator)
  (begin (log-debug (format "Message ~a" l) 'sum-a-list)
         (cond [(empty? l) 0]
         [else (operator (first l) (sum-a-list (rest l) operator))])))

(define recevier (make-log-receiver list-logger 'debug))

(: main (-> Any))
(define (main)
  (begin (sum-a-list (list 1 2 3 4 5 6 7 8) +)
         (: logger (-> Any))
         (define (logger)
           (let ([msg (sync recevier)])
             (match msg
               [(vector level m data x) (begin (printf "~a: ~a\n" level m)
                                               (logger))]
               [else #f ])))
         (logger)))

;; type checker error: Type Checker: untyped identifier sync imported from module <typed/racket> in: sync

Я хочу использовать типизированную ракетку для реализации поддержки ведения журнала в моем проекте. Я понятия не имею, как решить эту ошибку. Пожалуйста, помогите мне в решении этой проблемы. Благодарность!


person nihal    schedule 26.08.2013    source источник


Ответы (1)


Обновление: sync теперь поддерживается в текущем выпуске Typed Racket как часть Racket версии 6.0.


Функция sync изначально не поддерживается ни в одной из версий Typed Racket, поскольку типы событий не поддерживаются. Если вы загрузили последнюю предварительную версию Racket (либо с сайта моментальных снимков, либо github), вы должны получить версию Typed Racket, которая поддерживает события и sync.

Предупреждение: предварительная сборка, скорее всего, будет содержать ошибки. Сообщения об ошибках приветствуются!

person Asumu Takikawa    schedule 26.08.2013