Scheme 如何使用with type在非类型化模块中使用类型化的球拍片段?

Scheme 如何使用with type在非类型化模块中使用类型化的球拍片段?,scheme,racket,typed-racket,Scheme,Racket,Typed Racket,指示可以使用在非类型化代码中创建“类型化区域” 该表单允许在其他非类型化代码中使用本地化的类型化球拍区域 不过,实际上如何使用这个还有点不清楚。显然,使用此类功能需要在使用#lang racket或类似功能的非类型化模块中进行。如何导入带有类型绑定的 一个天真的尝试就是需要类型化的Racket,但这会导致TR覆盖现有语法形式的失败 (require typed/racket) (struct point (x y)) ; complains about missing type annotat

指示可以使用在非类型化代码中创建“类型化区域”

该表单允许在其他非类型化代码中使用本地化的类型化球拍区域

不过,实际上如何使用这个还有点不清楚。显然,使用此类功能需要在使用
#lang racket
或类似功能的非类型化模块中进行。如何导入带有类型绑定的

一个天真的尝试就是
需要
类型化的Racket,但这会导致TR覆盖现有语法形式的失败

(require typed/racket)

(struct point (x y)) ; complains about missing type annotations
尝试仅在
中使用
,以简单地要求
具有类型
,而不需要其他类型的工作,但是所需的类型绑定(例如
编号
->
)都不存在

似乎唯一的方法是手动使用
仅在
中导入我需要的东西,但这感觉很费力。我也可以在
中使用前缀
,但是当然所有的东西都会有前缀


有没有推荐的方法,或者这项功能有点不受欢迎?

我不知道基本答案。有人猜测这是编写宏时有用的东西,而不是直接编写代码

一个实用的想法:您可以使用
localrequire
来限制TR require的“污染”。您可以在
中使用
,但在
中除外,如果这样做的工作量较少,则只在中使用

例如,docs get close中的这个示例给出了一个奇怪的错误,可能是因为它使用了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
除了在
中之外,使用
排除该项会产生所需的错误:

(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

但是是的。这只是在摆弄边缘,而不是触及核心。

我只会使用
(或者
中重命名)来避免在类型化和非类型化程序中都不起作用的少数标识符。就像对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")))
我会接受这个“标准”答案。我希望它更好,但我真的看不到一个更好的方式是不做任何真正疯狂的可能。