gpt4 book ai didi

scheme - 如何使用 with-type 在非类型化模块中使用类型化 Racket 片段?

转载 作者:行者123 更新时间:2023-12-01 02:11:22 25 4
gpt4 key购买 nike

Typed Racket reference表示可以使用 with-type 在无类型代码中创建“类型化区域”。

The with-type form allows for localized Typed Racket regions in otherwise untyped code.



不过,目前还不清楚如何实际使用它。显然,需要在使用 #lang racket 的无类型模块中使用此类功能。或类似的东西。 with-type应该怎么做绑定(bind)被导入?

一个天真的尝试只是到 require Typed Racket,但这会导致 TR 覆盖现有句法形式的失败。
(require typed/racket)

(struct point (x y)) ; complains about missing type annotations

尝试使用 only-in只需要 with-type并且没有其他任何工作,但是不存在所需的类型绑定(bind)(例如 Number-> )。

似乎唯一的方法是手动使用 only-in只导入我需要的东西,但这感觉很费力。我也可以使用 prefix-in , 但是当然所有的东西都会被前缀分散。

是否有推荐的方法,或者此功能是否已被弃用?

最佳答案

我不知道基本答案。一个猜测是,与您直接编写的代码相反,它在编写宏时会很有用?

一个实用的想法:你可以使用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

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

关于scheme - 如何使用 with-type 在非类型化模块中使用类型化 Racket 片段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28932258/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com