拼接语法参数化禁用Typed Racket类型注释

当我运行以下操作时,我得到了预期的类型错误:

#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版本中.

点赞