8
A
回答
20
合同通常在模塊之間強制執行。所以你必須從外部角度來嘗試。但是,REPL適用於您正在使用的模塊內部。
從外部測試的簡單方法是使用test submodule。例如:
#lang racket
(define (true? expr)
(and (boolean? expr) expr #t))
(provide (contract-out
[true? (-> boolean? boolean?)]))
(module* test racket/base
(require (submod "..")
rackunit)
(check-true (true? #t))
(check-false (true? #f))
(check-exn exn:fail:contract? (lambda() (true? 3))))
更改合同和DrRacket重新運行,你應該看到你的合同生效這裏,因爲這裏的test
模塊被視爲對合同的外部客戶。
另外,再拍文件require
S上的第一次,然後就可以看到合同的效果也有。如果第一個文件被稱爲true-test.rkt
,那麼你可以讓另一個模塊,然後:
#lang racket
(require "true-test.rkt")
(true? 42) ;; And _this_ should also raise a contract error.
13
丹尼柳給了一個很好的答案。我只想對其進行擴展,並指出球拍確實爲您的合同執行地點提供了更大的靈活性(即,將合同邊界放在哪裏)。例如,你可以使用define/contract
形式:
-> (define/contract (true? expr)
(-> boolean? boolean?)
(and (boolean? expr) expr #t))
將建立true?
定義和所有其他代碼之間的合同檢查:
-> (true? "foo")
; true?: contract violation
; expected: boolean?
; given: "foo"
; in: the 1st argument of
; (-> boolean? boolean?)
; contract from: (function true?)
; blaming: top-level
; at: readline-input:1.18
; [,bt for context]
我發現define/contract
特別有用的,如果我想測試的東西與REPL合同有關,在那裏我並不總是有一個模塊。但contract-out
是默認建議,因爲在模塊邊界檢查合同通常是一個不錯的選擇。
相關問題
- 1. 對Directory.GetFiles感到困惑
- 2. 對模板感到困惑
- 3. 對Semaphore類感到困惑
- 4. 對Frustum Culling感到困惑
- 5. 對unistd_XX.h感到困惑
- 6. 對OAuth感到困惑
- 7. 球拍模塊的合同讓我困惑
- 8. 感到困惑EKEventStatus
- 9. 對ES6對象語法感到困惑
- 10. 使用同步鎖時感到困惑
- 11. 對ios觸摸代碼感到困惑
- 12. RVM對Capistrano的說明感到困惑
- 13. 我對鐵軌範圍感到困惑
- 14. 對TIMESTAMPTZ內部轉換感到困惑
- 15. 對servlet映射感到困惑
- 16. 對返回類型感到困惑
- 17. 對Firebase查詢執行感到困惑
- 18. 我對Hibernate感到困惑嗎?
- 19. 對方法重載感到困惑
- 20. 對UIView框架屬性感到困惑
- 21. 我對java代碼感到困惑嗎?
- 22. 我對Hibernate Spring感到困惑
- 23. 對可繪製尺寸感到困惑
- 24. 對Java8中的HashMap感到困惑
- 25. 對FIX協議層感到困惑
- 26. 在Spring Boot中對ThymeleafConfig感到困惑
- 27. 對SQLite和MySQL仍然感到困惑
- 28. 對箭頭功能感到困惑
- 29. 我對servlet實例感到困惑
- 30. 對基類行爲感到困惑
請注意,對於您的特定環境,您可能會使用'values',因爲除了'#f'之外,Racket會將所有內容視爲true。例如:'(count values'(多少#f true #f #f things #f))' – dyoo