2013-08-26 3 views
0

안녕하세요 저는 라켓이 제공하는 로깅 기능을 사용하는 방법을 배우고 있습니다. 어떻게 작동하는지 파악하기 위해 다음 코드를 작성했습니다.형식화 된 라켓과 동기화를 사용할 수 없습니다.

#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 

내 프로젝트에서 로깅을 지원하기 위해 입력 된 라켓을 사용하고 싶습니다. 이 오류를 해결하는 방법에 대한 단서가 없습니다. 이 문제를 해결하는 데 저를 도우십시오. 감사!

답변

4

업데이트 :sync은 현재 Racket 버전 6.0의 일부로 Typed Racket의 최신 릴리스에서 지원됩니다. 이벤트 유형이 지원되지 않기 때문에


sync 기능

는 형식화 된 라켓의 릴리스 버전에서 기본적으로 아직 지원되지 않습니다. 최신 시험판 버전의 Racket ( snapshot site 또는 github)을 다운로드하는 경우 이벤트를 지원하는 Typed Racket 버전과 sync을 받아야합니다.

경고 : 출시 전 빌드는 버그가있을 가능성이 큽니다. 버그 리포트 환영합니다!

관련 문제