gpt4 book ai didi

racket - 如何在 Racket 中使用 contract-out

转载 作者:行者123 更新时间:2023-12-01 10:08:05 27 4
gpt4 key购买 nike

我在 Racket 中编写了一个带进位的免费乘法 PRNG。我想用 provide限制仅访问我的库中的某些功能,以及 to impose contracts on them .为此,我使用 Racket 文档(上面链接)将以下代码放在文件顶部:

(require data/queue)
(provide
(contract-out
(make-cmwc-gen (-> (listof integer?) integer? integer? integer? procedure?))
(make-default-cmwc-gen (-> integer? procedure?))
(make-cmwc-gen-raw (-> queue? integer? integer? integer? procedure?))
(init-cmwc-seed (-> integer? queue?))))

但是当我在 DrRacket 中运行该文件时,出现以下错误:

. contract-out: not a provide sub-form in: (contract-out (make-cmwc-gen (-> (listof 
integer?) integer? integer? integer? procedure?)) (make-default-cmwc-gen (-> integer?
procedure?)) (make-cmwc-gen-raw (-> queue? integer? integer? integer? procedure?))
(init-cmwc-seed (-> integer? queue?)))

代码不会抛出任何错误,并且在没有插入上述代码的情况下在 DrRacket 中运行时可以正常工作。

限制访问源文件之外的某些功能以及在 Racket 中执行它们的契约(Contract)的正确方法是什么?

最佳答案

contract-out 是新的,并在 Racket 5.2 中引入。如果你使用 Racket < 5.2,你仍然可以使用 provide/contract :

例子:

#lang racket
(provide/contract [f (-> number? number?)])

(define (f x) 42)

在Racket 5.2中,首选contract-out,因为可以在contract之后定义contract中的元素。也就是说,如果你在旧系统中尝试这样的事情,

#lang racket
;; The following will fail since the contract definition doesn't know
;; about p? at the point of its definition.
(provide/contract [f (-> p? p?)])

(define p? number?)
(define (f x) 42)

那么它就会失败,因为 p? 是在契约之后定义的。

相比之下,contract-out 无需重新排列定义即可工作:

#lang racket
(provide (contract-out [f (-> p? p?)]))

(define p? number?)
(define (f x) 42)

关于racket - 如何在 Racket 中使用 contract-out,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8605767/

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