当我运行以下内容时,出现了预期的类型错误:
#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
相同的方式处理定义:
与syntax-parameterize类似,只是在定义上下文中,正文表单被拼接到封闭的定义上下文中(与begin相同)。
但是,如果我使用begin
代替splicing-syntax-parameterize
:
#lang typed/racket
(begin
(: n Number)
(define n "string"))
然后我做得到类型错误。是否有某些原因splicing-syntax-parameterize
剥离了定义中的类型注释,但begin
没有?我会冒这个猜测,因为splicing-syntax-parameterize
的行为基于无类型begin
形式,而不是来自Typed Racket的begin
形式,因此对此无动于衷:
表格。如果是这样的话,我该如何解决这个问题呢?
答案 0 :(得分:2)
是的,这是一个错误。事实证明,splicing-syntax-parameterize
有一些奇怪的扩展,与Typed Racket检测和安装类型注释的方式不相称。
我已为此错误编写了一个修补程序you can find here。正如预期的那样,您的原始程序现在无法进行类型检查。此修复程序应在Racket 6.1.1.8或更高版本中可用,因此如果您需要此行为,请使用快照构建或使用最新版本的Typed Racket。
否则,这应该包含在下一个Racket版本中。