Pergunta

Hi I'm learning how to use logging facilities provided by racket. I wrote the following piece of code to get the hang of how things are working.

#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)))

The code above compiles and works fine. The problem arises when I used typed racket instead of racket. For the same code (with type annotations and typed/racket) I get a type checker error.

;; 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

I want to use typed racket to implement logging support in my project. I have no clue how to solve this error. Please help me out in solving this problem. thanks!

Foi útil?

Solução

Update: sync is now supported in the current release of Typed Racket, as part of Racket version 6.0.


The sync function isn't supported natively yet in any release version of Typed Racket because event types are not supported. If you download a recent pre-release version of Racket (either from the snapshot site or github), you should get a version of Typed Racket that supports events and sync.

Caveat: the pre-release build is more likely to have bugs. Bug reports welcome!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top