【发布时间】: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