【问题标题】:Splicing syntax parameterize disables Typed Racket type annotations拼接语法参数化禁用 Typed Racket 类型注解
【发布时间】:2015-02-02 19:55:54
【问题描述】:

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

#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 表单,因此对: 表单一无所知。如果是这种情况,我该如何解决这个问题?

【问题讨论】:

    标签: syntax racket typed-racket


    【解决方案1】:

    是的,这是一个错误。事实证明,splicing-syntax-parameterize 有一个有点奇怪的扩展,它不能很好地与 Typed Racket 检测和安装类型注释的方式配合使用。

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

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

    【讨论】:

      猜你喜欢
      • 2017-04-01
      • 1970-01-01
      • 2014-05-27
      • 2015-06-28
      • 2012-10-14
      • 1970-01-01
      • 1970-01-01
      • 2021-07-11
      • 1970-01-01
      相关资源
      最近更新 更多