您好我正在学习如何使用球拍提供的日志工具。我编写了以下代码来了解事情是如何运作的。
#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
我想使用键入的球拍在我的项目中实现日志记录支持。我不知道如何解决这个错误。请帮我解决这个问题。谢谢!
答案 0 :(得分:4)
更新: sync
现在支持当前版本的Typed Racket,作为Racket 6.0版的一部分。
由于不支持事件类型,因此在Typed Racket的任何发行版本中都不支持sync
函数。如果您下载最新的预发布版本的Racket(来自snapshot site或github),您应该会获得支持事件和sync
的Typed Racket版本。