如何使用with-type在无类型模块中使用Typed Racket片段?

时间:2015-03-08 21:44:31

标签: scheme racket typed-racket

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,但当然一切都会分散前缀。

是否有推荐的方法来执行此操作,或者此功能是否已被弃用?

2 个答案:

答案 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")))