【问题标题】:How to use contract-out in Racket如何在球拍中使用合同出局
【发布时间】:2011-12-22 15:07:37
【问题描述】:

我已经在 Racket 中编写了一个免费乘以进位 PRNG。我想使用provide 来限制对我库中某些函数的访问,以及to impose contracts on them。使用球拍文档(上面链接),为此我将以下代码放在我的文件顶部:

(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? contract-out 是在 9 月添加的,因此如果您在 5.2 之前的版本中使用它,它将无法正常工作。此外,如果由于某种原因无法升级,请尝试使用provide/contract
  • 我相信你是对的。我从球拍文档中复制了一个示例程序,但它不起作用。此外,我的版本是 5.1.3 。不过,我知道在 5.2 之前已经执行了合同。它们在 5.1.3 中是如何执行的?

标签: racket contract prng


【解决方案1】:

contract-out 是新的,在 Racket 5.2 中引入。如果你使用的是 Racket provide/contract

例子:

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

(define (f x) 42)

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

#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)

【讨论】:

  • +1 感谢提供/合同和外包之间的差异。
猜你喜欢
  • 2016-08-30
  • 2020-09-07
  • 2022-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-07
  • 1970-01-01
  • 2013-03-29
相关资源
最近更新 更多