Typed Racket reference表示可以使用with-type
在无类型代码中创建“类型区域”。
with-type
表单允许在其他无类型代码中使用本地化的Typed Racket区域。
但是有点不清楚如何实际使用这个。显然,使用这样的功能需要使用#lang racket
或类似的东西在非类型化模块中进行。如何导入with-type
绑定?
天真的尝试仅仅是require
Typed Racket,但这会导致TR覆盖现有语法形式的失败。
(require typed/racket)
(struct point (x y)) ; complains about missing type annotations
尝试使用only-in
只需要with-type
而没有其他任何工作,但是不存在所需的类型绑定(例如Number
或->
)
似乎唯一的方法是手动使用only-in
仅导入我需要的东西,但这感觉很费力。我也可以使用prefix-in
,但当然一切都会分散前缀。
是否有推荐的方法来执行此操作,或者此功能是否已被弃用?
答案 0 :(得分:2)
我不知道根本的答案。一个猜测是,在编写宏时,这是一种有用的东西,而不是你直接编写的代码?
一个实用的想法:您可以使用local-require
来限制TR要求的“污染”。如果工作量少于except-in
,则可以转为使用only-in
。
例如,来自文档的这个示例变得接近,但是给出了一个奇怪的错误,大概是因为它正在使用TR的quote
:
#lang racket/base
(let ([x 'hello])
(local-require typed/racket)
(with-type
#:result String
#:freevars ([x String])
(string-append x ", world")))
; /tmp/so.rkt:7:21: quote: identifier used out of context
; in: quote
将except-in
排除在外会产生所需的错误:
(let ([x 'hello])
(local-require (except-in typed/racket quote))
(with-type
#:result String
#:freevars ([x String])
(string-append x ", world")))
; x: broke its contract
; promised: String
; produced: 'hello
; in: String
; contract from: /tmp/so.rkt
; blaming: /tmp/so.rkt
; (assuming the contract is correct)
; at: /tmp/so.rkt:14.17
但是,是的。这只是摆弄边缘而不是它的核心。
答案 1 :(得分:1)
我只想使用except-in
(或者rename-in
)来避免在类型和非类型化程序中无法使用的少数标识符。就像Greg的程序修改一样:
#lang racket/base
(require (except-in typed/racket struct))
(struct point (x y))
(let ([x 'hello])
(with-type
#:result String
#:freevars ([x String])
(string-append x ", world")))