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

时间:2014-12-04 19:33:27

标签: syntax racket 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相同的方式处理定义:

  

与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形式,因此对此无动于衷:表格。如果是这样的话,我该如何解决这个问题呢?

1 个答案:

答案 0 :(得分:2)

是的,这是一个错误。事实证明,splicing-syntax-parameterize有一些奇怪的扩展,与Typed Racket检测和安装类型注释的方式不相称。

我已为此错误编写了一个修补程序you can find here。正如预期的那样,您的原始程序现在无法进行类型检查。此修复程序应在Racket 6.1.1.8或更高版本中可用,因此如果您需要此行为,请使用快照构建或使用最新版本的Typed Racket。

否则,这应该包含在下一个Racket版本中。