当我运行以下操作时,我得到了预期的类型错误:
#lang typed/racket
(require racket/stxparam)
(define-syntax-parameter x #f)
(syntax-parameterize ([x #'foo])
(: n Number)
(define n "string")
'foo)
但是当我使用splicing-syntax-parameterize
时,突然间我没有出现类型错误
#lang typed/racket
(require racket/stxparam
racket/splicing)
(define-syntax-parameter x #f)
(splicing-syntax-parameterize ([x #'foo])
(: n Number)
(define n "string"))
在REPL处检查显示n具有类型String,尽管有注释.splicing-syntax-parameterize
的文档声称它以与begin相同的方式处理定义:
Like syntax-parameterize, except that in a definition context, the body forms are spliced into the enclosing definition context (in the same way as for begin).
但是,如果我使用begin而不是splicing-syntax-parameterize:
#lang typed/racket
(begin
(: n Number)
(define n "string"))
然后我得到一个类型错误.是否存在某些原因进行拼接 – 语法参数化从定义中删除类型注释,但是开始没有?我会冒这个猜测,因为拼接语法参数化是基于无类型的开始形式而不是来自Typed Racket的开始形式的行为,因此对形式一无所知.如果是这样的话,我该如何解决这个问题呢?
最佳答案 是的,这是一个错误.事实证明,splicing-syntax-parameterize有一个奇怪的扩展,与Typed Racket检测和安装类型注释的方式不能很好地兼容.
我已经为这个bug编写了一个修复程序,其中包含you can find here.正如预期的那样,您的原始程序现在无法进行类型检查.此修复程序应在Racket 6.1.1.8或更高版本中可用,因此如果您需要此行为,请使用快照构建或使用最新版本的Typed Racket.
否则,这应该包含在下一个Racket版本中.