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