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")))
我会接受这个“标准”答案。我希望它更好,但我真的看不到一个更好的方式是不做任何真正疯狂的可能。