2015-12-06 15 views
6

Hãy nói rằng tôi có một số tập tin a.rkt:Yêu cầu định danh không được cung cấp bởi một module trong vợt

#lang racket 
(define a 12) 

bây giờ tôi muốn viết một số trường hợp thử nghiệm, sử dụng các tập tin b.rkt đòi hỏi a.rkt:

#lang racket 
(require "a.rkt") 
a 

Có cách nào để tôi có thể nhận được b.rkt để nhận dạng số nhận dạng được xác định trong a.rkt mà không cần phải provide từ tệp đầu tiên không? (Lý tưởng nhất là không phải thay đổi tệp đầu tiên.)

Tôi không thấy bất kỳ điều gì ngay lập tức trong the documentation for require/provide.

+0

Ý tưởng gọn gàng cho câu hỏi tự trả lời, nhưng bạn có thể muốn thêm động lực hơn trong câu hỏi. Tức là, làm rõ rằng đây là để thử nghiệm, không phải cái gì bạn muốn làm nói chung. –

+0

Đó là một ý tưởng hay, tôi sẽ thay đổi điều đó. –

Trả lời

5

Như Leif đề cập, RackUnit của require/exposesẽ cho phép sử dụng định danh không được cung cấp trong các module khác, nhưng its own documentation không hứa hẹn một đảm bảo rất mạnh:

Lưu ý rằng require/expose có thể là một chút mong manh, đặc biệt là khi trộn với mã biên dịch. Sử dụng có nguy cơ của riêng bạn!

Một cách tiếp cận khác sẽ là sử dụng submodules, có hiệu quả có thể cung cấp cách xử phạt để xuất API riêng tư để sử dụng trong kiểm tra hoặc các phương tiện khác.

Ví dụ, hãy xem xét một module mà thực hiện một chức năng để kiểm tra xem một chuỗi có chứa một từ duy nhất: (. Đây là, có lẽ, không phải là ví dụ thực tế nhất, nhưng chịu với tôi)

#lang racket 

(provide word?) 

(define (word? str) 
    (not (ormap space? (string->list str)))) 

(define (space? c) 
    (eq? C#\space)) 

Có thể hữu ích khi kiểm tra chức năng space? để đảm bảo chức năng hoạt động, nhưng có thể không phải là một phần của API công khai. Để tạo một "lối thoát", nó có thể để xác định một submodule rằng xuất khẩu này ràng buộc:

(module+ for-testing 
    (provide space?)) 

Tên for-testing là tùy ý-nó có thể là bất cứ điều gì. Dù bằng cách nào, nó bây giờ có thể yêu cầu submodule trong mô-đun khác để có được quyền truy cập vào các ràng buộc tin:

#lang racket 

(require rackunit 
     (submod "a.rkt" for-testing)) 

(check-true (space? #\space)) 
(check-false (space? #\a)) 

Đây là một cái gì đó một cách an toàn hơn để lộ định danh từ module mà không lộ chúng cho tất cả người tiêu dùng.

+0

Đôi khi, không thể thay đổi nguồn gốc để bổ sung thêm 'cung cấp', ví dụ: các sinh viên không làm theo chỉ dẫn. Khung kiểm tra của Dan Feltey sử dụng 'require/expose' (và bạn bè) theo cách này: https://github.com/dfeltey/pdptest. (Không mâu thuẫn với câu trả lời của bạn, chỉ mô tả một ngữ cảnh sử dụng khác). – stchang

5

Bạn có thể sử dụng require/expose trong b.rkt để truy cập vào liên kết trong a.rkt. b.rkt sẽ giống như thế này:

#lang racket 
(require rackunit) 
(require/expose "a.rkt" (a)) 
a 
Các vấn đề liên quan