3

私はRacketで無料のキャリー付き乗算PRNGを作成しました。provideライブラリ内の特定の関数へのアクセスのみを制限し、それらにコントラクトを課すために使用したいと思います。ラケットのドキュメント(上記のリンク)を使用して、ファイルの先頭に次のコードを配置しました。

(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でそれらのコントラクトを適用する適切な方法は何ですか?

4

1 に答える 1

7

contract-outは新しく、Racket5.2で導入されました。Racket <5.2を使用している場合でも、次を使用できますprovide/contract

例:

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

(define (f x) 42)

ラケット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)
于 2011-12-22T19:37:26.440 に答える