7.1契约和边界

像商业合同(契约)一样,软件的契约是两个部分之间的协议。这个协议指定了权利和义务来规范一个部分到另外一个部分。
因此契约在两部分之间建立了一个边界。当一个值通过边界,契约监视系统会执行契约检查,确保遵守固定的契约。
为了达到这个目的,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)

你可能感兴趣的:(7.1契约和边界)