【问题标题】:Unable to use sync with typed racket无法与键入的球拍使用同步
【发布时间】:2013-08-26 01:15:59
【问题描述】:

您好,我正在学习如何使用球拍提供的记录工具。我编写了以下代码来了解事情的运作方式。

#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

我想在我的项目中使用类型化球拍来实现日志记录支持。我不知道如何解决这个错误。请帮我解决这个问题。谢谢!

【问题讨论】:

    标签: scheme racket typed-racket


    【解决方案1】:

    更新: sync 现在在当前版本的 Typed Racket 中得到支持,作为 Racket 版本 6.0 的一部分。


    Typed Racket 的任何发行版本都不原生支持 sync 函数,因为不支持事件类型。如果您下载了最新的 Racket 预发布版本(来自 snapshot sitegithub),您应该获得支持事件和 sync 的 Typed Racket 版本。

    警告:预发布版本更有可能存在错误。欢迎报告错误!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-07
      • 2016-07-29
      • 2016-02-06
      • 1970-01-01
      • 2015-03-20
      • 1970-01-01
      • 2018-05-18
      • 1970-01-01
      相关资源
      最近更新 更多