像商业合同(契约)一样,软件的契约是两个部分之间的协议。这个协议指定了权利和义务来规范一个部分到另外一个部分。
因此契约在两部分之间建立了一个边界。当一个值通过边界,契约监视系统会执行契约检查,确保遵守固定的契约。
为了达到这个目的,racket鼓励在模块边界使用契约。程序员可以在provide语句上添加契约,给导出值添加约束。
#lang racket
(provide (contract-out [amout positive?]}
(define amount ...)
上面的模块对所有的调用者承诺amount值总是一个正数。每当一个调用者引用了amount值,契约监视器都会确认它是不是一个正数。
契约模块内建在racket语言里,但是如果你只是想使用racket/base,你需要使用require语句导入。
7.1.1违反契约
违反契约会发送一个错误。使用and/c
可以写多个合同。
7.1.2测试模块和契约
我们可以使用子模块来测试契约。
7.1.3测试内嵌契约边界
#lang racket
(define/cnotract amount
(and/c number? positive?)
150)
(+ amount 10)