Racket 如何在球拍中使用合同

Racket 如何在球拍中使用合同,racket,contract,prng,Racket,Contract,Prng,我在Racket中用carry PRNG写了一个互补乘法。我想使用来限制对库中某些函数的访问,以及。通过使用Racket文档(如上链接),我将以下代码放在了文件的顶部: (require data/queue) (provide (contract-out (make-cmwc-gen (-> (listof integer?) integer? integer? integer? procedure?)) (make-default-cmwc-gen (-> integ

我在Racket中用carry PRNG写了一个互补乘法。我想使用来限制对库中某些函数的访问,以及。通过使用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中强制执行它们的合约?
是新的,并在Racket 5.2中引入。如果您使用的球拍<5.2,您仍然可以使用:

例如:

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

(define (f x) 42)
在Racket 5.2中,首选
外判
,因为合同中的要素可以在合同之后定义。也就是说,如果你在旧系统中尝试类似的方法

#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?
是在合同之后定义的

相比之下,
外包
无需重新安排定义即可工作:

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

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

你用的是哪种球拍
contract out
是在9月份添加的,因此如果您在5.2之前的版本中使用它,它将无法工作。另外,如果您因某种原因无法升级,请尝试使用
provide/contract
。我相信您是正确的。我从racket文档中复制了一个示例程序,但它不起作用。此外,我的版本是5.1.3。不过,我知道合同在5.2之前就已经生效了。在5.1.3中是如何执行的?+1感谢提供/合同和外包之间的差异。