Skip to content

Commit

Permalink
Annotated example
Browse files Browse the repository at this point in the history
  • Loading branch information
fogus committed Jan 22, 2013
1 parent 825b95b commit ea915c6
Showing 1 changed file with 72 additions and 9 deletions.
81 changes: 72 additions & 9 deletions index.html
Expand Up @@ -7,7 +7,7 @@
<meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"/>
<meta name="title" content="core.contracts"/>
<meta name="generator" content="Org-mode"/>
<meta name="generated" content="2013-01-22 10:11:33 EST"/>
<meta name="generated" content="2013-01-22 11:03:47 EST"/>
<meta name="author" content="Fogus"/>
<meta name="description" content=""/>
<meta name="keywords" content=""/>
Expand Down Expand Up @@ -95,26 +95,82 @@
<h1 class="title">core.contracts</h1>


<div id="rinich">
<div class="log">
<div class="item">
<div id="rinich">
<div class="log">
<div class="description">a contracts-programming library for <a href="http://clojure.org">Clojure</a></div>
<div class="item">
<h4>Contracts Programming</h4>
<div class="citation"><p>the relationship between a class and
its clients as a formal agreement, expressing each party's
rights and obligations</p></div>
<div class="citation"><a href="http://en.wikipedia.org/wiki/Bertrand_Meyer">Bertrand Meyer</a></div>

<!-- TODO TODO TODO
<a class="more" href="http://fogus.me/fun/trammel/cp.html">read more</a>
-->
</div>


<pre class="src src-clojure">(<span style="color: #cdcd00;">require</span> '[clojure.core.contracts <span style="color: #cd00cd;">:as</span> contracts])

(<span style="color: #00cdcd; font-weight: bold;">defn</span> <span style="color: #0000ee; font-weight: bold;">sqr</span> [n] (<span style="color: #cdcd00;">*</span> n n))
<div class="item">

<p>
First add the following to your <a href="https://github.com/technomancy/leiningen">Leiningen</a> <i>project.clj</i> file in the <code>:dependencies</code> section:
</p>



<pre class="src src-clojure">[org.clojure/core.contracts <span style="color: #00cd00;">"0.0.1"</span>]
</pre>


<p>
To include core.contracts, add it to your namespace declaration:
</p>



<pre class="src src-clojure">(<span style="color: #0000ee; font-weight: bold;">ns</span> my.awesome.lib
(<span style="color: #cdcd00;">require</span>
[clojure.core.contracts <span style="color: #cd00cd;">:as</span> contracts]))
</pre>


<p>
Write your functions as you normally would:
</p>



<pre class="src src-clojure">(<span style="color: #00cdcd; font-weight: bold;">defn</span> <span style="color: #0000ee; font-weight: bold;">sqr</span> [n] (<span style="color: #cdcd00;">*</span> n n))

(sqr 10)
<span style="color: #cd0000;">;</span><span style="color: #cd0000;">=&gt; 100</span>

(sqr 0)
<span style="color: #cd0000;">;</span><span style="color: #cd0000;">=&gt; 0</span>
</pre>


<p>
Later, annotate your functions separately with the constraints:
</p>


(contracts/provide

<pre class="src src-clojure">(contracts/provide
(sqr <span style="color: #00cd00;">"Constraints for squaring"</span>
[x] [number? (<span style="color: #cdcd00;">not=</span> 0 x) =&gt; number? pos?]))
</pre>

(sqr 10)

<p>
The core.contracts validation will occur at run-time:
</p>



<pre class="src src-clojure">(sqr 10)
<span style="color: #cd0000;">;</span><span style="color: #cd0000;">=&gt; 100</span>

(sqr 0)
Expand All @@ -123,6 +179,14 @@ <h1 class="title">core.contracts</h1>
</pre>


<p>
To turn-off contracts for any given file, add the following to the top of the file in question before compiling:
</p>



<pre class="src src-clojure">(set! *assert* false)
</pre>



Expand All @@ -138,7 +202,6 @@ <h1 class="title">core.contracts</h1>
</div>
</div>


</div>

</body>
Expand Down

0 comments on commit ea915c6

Please sign in to comment.