尽管 {{contract}} 是库中的关键部分,但它缺少文档字符串。
ns 的文档字符串也可以包含几句话,指向主函数及其使用方法。
h3. contract
对于 contract,像以下这样会很好(请原谅我对库粗浅的理解)
定义一个命名并带有文档的合同。
constraints => signature-constraint*
signature-constraint => argument-vector constraint-vector
constraint-vector => functions and expressions [=> functions and expressions]
函数应用于参数,表达式按原样执行。
跟随 `=>` 的约束是后置条件,可以使用 `%` 来引用返回值。
例:
(contract doubler
"确保加倍(有时)"
[x] [number? => integer?]
[x y] [(every? number? [x y])
=>
integer? (= (* 2 (+ x y)) %)])))
见 also: with-constraints, defconstrainedfn, 和 clojure.core.contracts.constraints
h3. ns
ns 的文档字符串可以改进,例如像这样
Clojure.core.contracts 的公共合同编程函数和宏。
主要用途:defconstrainedfn 或 contract 和 with-constraints。
使用 provide 对您无法控制的函数进行操作。
h3. 其他
还有其他未注明或文档不足的函数/宏可以从改进中受益,例如。
。
* _ 的作用是什么?
* provide 可以从(即使是简短的)示例中受益。
* require-with-constraints - 它是什么,何时使用?
* in - 举一个例子会很好。
* whitelist - 参数应该是 'thing' 而不是 'things',这样可以与文档字符串以及它是一个单个 map/set 一致。
* 使用 implies, <=>, 等的示例会很好 - 目前我并不真正知道何时/为什么使用它(更不用说如何了) [也许在 ns 的文档字符串中,所有这些函数的文档字符串都有 "... see the ns docstring")
* 为什么 defconstrainedfn 在 constraints.clj 而不是 contracts.clj 中,与其他主要函数并列?
为什么 provide 使用 "kontracts" 而不是 "c",就像 with-constraints 一样?("constraint" 和 "contract" 的不匹配 - fn 是 with-constraints 但接收 contracts - 本身就令人困惑,但这又是另一个故事。)
* defconstrainedrecord 没有文档。
如果至少对其中的一些改进进行应用,我会非常高兴。我相信这将帮助传播合同编程。
谢谢!