raganwald / ick

The Invocation Construction Kit: an ad hoc, informally-specified, bug-ridden, slow implementation of half of Monads.

This URL has Read+Write access

nizze (author)
Tue Mar 24 05:26:25 -0700 2009
raganwald (committer)
Mon Apr 13 07:49:18 -0700 2009
ick / website / 180seconds.html
100755 240 lines (162 sloc) 15.925 kb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
  <link rel="stylesheet" href="stylesheets/screen.css" type="text/css" media="screen" />
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <title>
      Ick in 180 seconds or less
  </title>
  <script src="javascripts/rounded_corners_lite.inc.js" type="text/javascript"></script>
<style>
 
</style>
  <script type="text/javascript">
    window.onload = function() {
      settings = {
          tl: { radius: 10 },
          tr: { radius: 10 },
          bl: { radius: 10 },
          br: { radius: 10 },
          antiAlias: true,
          autoPad: true,
          validTags: ["div"]
      }
      var versionBox = new curvyCorners(settings, document.getElementById("version"));
      versionBox.applyCornersToAll();
    }
  </script>
</head>
<body>
<div id="main">
 
    <h1>Ick in 180 seconds or less</h1>
    <div id="version" class="clickable" onclick='document.location = "http://rubyforge.org/projects/ick"; return false'>
      <p>Get Version</p>
      <a href="http://rubyforge.org/projects/ick" class="numbers">0.3.1</a>
    </div>
    <h2>Transforming your code</h2>
 
 
<p>Object#let turns:</p>
 
 
<p><pre class='syntax'>
</pre></p>
 
 
<p>Into:</p>
 
 
<p><pre class='syntax'>
</pre></p>
 
 
<p>Object#returning turns:</p>
 
 
<p><pre class='syntax'>
</pre></p>
 
 
<p>Into:</p>
 
 
<p><pre class='syntax'>
</pre></p>
 
 
<p>Object#my turns:</p>
 
 
<p><pre class='syntax'>
</pre></p>
 
 
<p>Into:</p>
 
 
<p><pre class='syntax'>
</pre></p>
 
 
<p>Object#inside turns:</p>
 
 
<p><pre class='syntax'>
</pre></p>
 
 
<p>Into:</p>
 
 
<p><pre class='syntax'>
</pre></p>
 
 
<h2>Test Cases</h2>
 
 
<p>The four canonical block structuring methods (#let, #returning, #my, and #inside):</p>
 
 
<p><pre class='syntax'>
<span class="constant">Ick</span><span class="punct">.</span><span class="ident">sugarize</span>
<span class="ident">arr</span> <span class="punct">=</span> <span class="punct">[]</span>
 
<span class="comment"># let returns the value of the block and executes in the current environment</span>
<span class="ident">assert_equal</span><span class="punct">(</span>
  <span class="punct">&quot;</span><span class="string">3628800 ends with zero</span><span class="punct">&quot;,</span>
  <span class="ident">let</span><span class="punct">((</span><span class="number">1</span><span class="punct">..</span><span class="number">10</span><span class="punct">).</span><span class="ident">inject</span><span class="punct">(&amp;:*))</span> <span class="punct">{</span> <span class="punct">|</span><span class="ident">num</span><span class="punct">|</span>
    <span class="ident">arr</span> <span class="punct">&lt;&lt;</span> <span class="constant">self</span><span class="punct">.</span><span class="keyword">class
    </span><span class="class">num</span> <span class="punct">%</span> <span class="number">10</span> <span class="punct">==</span> <span class="number">0</span> <span class="punct">?</span> <span class="punct">&quot;</span><span class="string"><span class="expr">#{num}</span> ends with zero</span><span class="punct">&quot;</span> <span class="punct">:</span> <span class="punct">&quot;</span><span class="string"><span class="expr">#{num}</span> does not end with zero</span><span class="punct">&quot;</span>
  <span class="punct">})</span>
<span class="ident">assert_equal</span><span class="punct">([</span> <span class="constant">self</span><span class="punct">.</span><span class="keyword">class </span><span class="class">],</span> <span class="ident">arr</span><span class="punct">)</span>
 
<span class="comment"># returning returns the value of the expression and executes in the current environment</span>
<span class="ident">assert_equal</span><span class="punct">(</span>
  <span class="number">3628800</span><span class="punct">,</span>
  <span class="ident">returning</span><span class="punct">((</span><span class="number">1</span><span class="punct">..</span><span class="number">10</span><span class="punct">).</span><span class="ident">inject</span><span class="punct">(&amp;:*))</span> <span class="punct">{</span> <span class="punct">|</span><span class="ident">num</span><span class="punct">|</span>
    <span class="ident">arr</span> <span class="punct">&lt;&lt;</span> <span class="constant">self</span><span class="punct">.</span><span class="keyword">class
    </span><span class="class">num</span> <span class="punct">%</span> <span class="number">10</span> <span class="punct">==</span> <span class="number">0</span> <span class="punct">?</span> <span class="punct">&quot;</span><span class="string"><span class="expr">#{num}</span> ends with zero</span><span class="punct">&quot;</span> <span class="punct">:</span> <span class="punct">&quot;</span><span class="string"><span class="expr">#{num}</span> does not end with zero</span><span class="punct">&quot;</span>
  <span class="punct">})</span>
<span class="ident">assert_equal</span><span class="punct">([</span> <span class="constant">self</span><span class="punct">.</span><span class="ident">class</span><span class="punct">,</span> <span class="constant">self</span><span class="punct">.</span><span class="keyword">class </span><span class="class">],</span> <span class="ident">arr</span><span class="punct">)</span>
 
<span class="comment"># my returns the value of the block and executes in the expression's environment</span>
<span class="ident">assert_equal</span><span class="punct">(</span>
  <span class="punct">&quot;</span><span class="string">3628800 ends with zero</span><span class="punct">&quot;,</span>
  <span class="ident">my</span><span class="punct">((</span><span class="number">1</span><span class="punct">..</span><span class="number">10</span><span class="punct">).</span><span class="ident">inject</span><span class="punct">(&amp;:*))</span> <span class="punct">{</span> <span class="punct">|</span><span class="ident">num</span><span class="punct">|</span>
    <span class="ident">arr</span> <span class="punct">&lt;&lt;</span> <span class="constant">self</span><span class="punct">.</span><span class="keyword">class
    </span><span class="class">num</span> <span class="punct">%</span> <span class="number">10</span> <span class="punct">==</span> <span class="number">0</span> <span class="punct">?</span> <span class="punct">&quot;</span><span class="string"><span class="expr">#{num}</span> ends with zero</span><span class="punct">&quot;</span> <span class="punct">:</span> <span class="punct">&quot;</span><span class="string"><span class="expr">#{num}</span> does not end with zero</span><span class="punct">&quot;</span>
  <span class="punct">})</span>
<span class="ident">assert_equal</span><span class="punct">([</span> <span class="constant">self</span><span class="punct">.</span><span class="ident">class</span><span class="punct">,</span> <span class="constant">self</span><span class="punct">.</span><span class="ident">class</span><span class="punct">,</span> <span class="constant">Fixnum</span> <span class="punct">],</span> <span class="ident">arr</span><span class="punct">)</span>
 
<span class="comment"># inside returns the value of the expression and executes in the expression's environment</span>
<span class="ident">assert_equal</span><span class="punct">(</span>
  <span class="number">3628800</span><span class="punct">,</span>
  <span class="ident">inside</span><span class="punct">((</span><span class="number">1</span><span class="punct">..</span><span class="number">10</span><span class="punct">).</span><span class="ident">inject</span><span class="punct">(&amp;:*))</span> <span class="punct">{</span> <span class="punct">|</span><span class="ident">num</span><span class="punct">|</span>
    <span class="ident">arr</span> <span class="punct">&lt;&lt;</span> <span class="constant">self</span><span class="punct">.</span><span class="keyword">class
    </span><span class="class">num</span> <span class="punct">%</span> <span class="number">10</span> <span class="punct">==</span> <span class="number">0</span> <span class="punct">?</span> <span class="punct">&quot;</span><span class="string"><span class="expr">#{num}</span> ends with zero</span><span class="punct">&quot;</span> <span class="punct">:</span> <span class="punct">&quot;</span><span class="string"><span class="expr">#{num}</span> does not end with zero</span><span class="punct">&quot;</span>
  <span class="punct">})</span>
<span class="ident">assert_equal</span><span class="punct">([</span> <span class="constant">self</span><span class="punct">.</span><span class="ident">class</span><span class="punct">,</span> <span class="constant">self</span><span class="punct">.</span><span class="ident">class</span><span class="punct">,</span> <span class="constant">Fixnum</span><span class="punct">,</span> <span class="constant">Fixnum</span> <span class="punct">],</span> <span class="ident">arr</span><span class="punct">)</span>
</pre></p>
 
 
<p>The two most common guarded evauators (#maybe and #try):</p>
 
 
<p><pre class='syntax'>
<span class="comment"># an object with two methods. #do returns itself, #do_not returns nil</span>
<span class="ident">yoda</span> <span class="punct">=</span> <span class="ident">returning</span><span class="punct">(</span><span class="constant">Object</span><span class="punct">.</span><span class="ident">new</span><span class="punct">)</span> <span class="keyword">do</span> <span class="punct">|</span><span class="ident">obj</span><span class="punct">|</span>
  <span class="keyword">def </span><span class="method">obj.do</span>
    <span class="constant">self</span>
  <span class="keyword">end</span>
  <span class="keyword">def </span><span class="method">obj.do_not</span>
    <span class="constant">nil</span>
  <span class="keyword">end</span>
<span class="keyword">end</span>
 
<span class="comment"># maybe handles nils, even for methods nil has, but not missing methods</span>
<span class="ident">assert_equal</span><span class="punct">(</span>
  <span class="ident">yoda</span><span class="punct">,</span>
  <span class="ident">maybe</span><span class="punct">(</span><span class="ident">yoda</span><span class="punct">)</span> <span class="punct">{</span> <span class="punct">|</span><span class="ident">obj</span><span class="punct">|</span> <span class="ident">obj</span><span class="punct">.</span><span class="ident">do</span> <span class="punct">}</span>
<span class="punct">)</span>
<span class="ident">assert_nil</span><span class="punct">(</span>
  <span class="ident">maybe</span><span class="punct">(</span><span class="constant">nil</span><span class="punct">)</span> <span class="punct">{</span> <span class="punct">|</span><span class="ident">obj</span><span class="punct">|</span> <span class="ident">obj</span><span class="punct">.</span><span class="ident">do</span> <span class="punct">}</span>
<span class="punct">)</span>
<span class="ident">assert_nil</span><span class="punct">(</span>
  <span class="ident">maybe</span><span class="punct">(</span><span class="ident">yoda</span><span class="punct">)</span> <span class="punct">{</span> <span class="punct">|</span><span class="ident">obj</span><span class="punct">|</span> <span class="ident">obj</span><span class="punct">.</span><span class="ident">do_not</span><span class="punct">.</span><span class="ident">do</span> <span class="punct">}</span>
<span class="punct">)</span>
<span class="ident">assert_nil</span><span class="punct">(</span>
  <span class="ident">maybe</span><span class="punct">(</span><span class="constant">nil</span><span class="punct">)</span> <span class="punct">{</span> <span class="punct">|</span><span class="ident">obj</span><span class="punct">|</span> <span class="ident">obj</span><span class="punct">.</span><span class="ident">nil?</span> <span class="punct">}</span>
<span class="punct">)</span>
<span class="ident">assert_raise</span><span class="punct">(</span><span class="constant">NoMethodError</span><span class="punct">)</span> <span class="keyword">do</span>
  <span class="ident">maybe</span><span class="punct">(</span><span class="ident">yoda</span><span class="punct">)</span> <span class="punct">{</span> <span class="punct">|</span><span class="ident">obj</span><span class="punct">|</span> <span class="ident">obj</span><span class="punct">.</span><span class="ident">fubar</span> <span class="punct">}</span>
<span class="keyword">end</span>
 
<span class="comment">#try handles NoMethodErrors, without caring whether nil is involved</span>
<span class="ident">assert_equal</span><span class="punct">(</span>
  <span class="ident">yoda</span><span class="punct">,</span>
  <span class="ident">try</span><span class="punct">(</span><span class="ident">yoda</span><span class="punct">)</span> <span class="punct">{</span> <span class="punct">|</span><span class="ident">obj</span><span class="punct">|</span> <span class="ident">obj</span><span class="punct">.</span><span class="ident">do</span> <span class="punct">}</span>
<span class="punct">)</span>
<span class="ident">assert_nil</span><span class="punct">(</span>
  <span class="ident">try</span><span class="punct">(</span><span class="constant">nil</span><span class="punct">)</span> <span class="punct">{</span> <span class="punct">|</span><span class="ident">obj</span><span class="punct">|</span> <span class="ident">obj</span><span class="punct">.</span><span class="ident">do_not</span> <span class="punct">}</span>
<span class="punct">)</span>
<span class="ident">assert_not_nil</span><span class="punct">(</span>
  <span class="ident">try</span><span class="punct">(</span><span class="constant">nil</span><span class="punct">)</span> <span class="punct">{</span> <span class="punct">|</span><span class="ident">obj</span><span class="punct">|</span> <span class="ident">obj</span><span class="punct">.</span><span class="ident">nil?</span> <span class="punct">}</span>
<span class="punct">)</span>
<span class="ident">assert_nil</span><span class="punct">(</span>
  <span class="ident">try</span><span class="punct">(</span><span class="ident">yoda</span><span class="punct">)</span> <span class="punct">{</span> <span class="punct">|</span><span class="ident">obj</span><span class="punct">|</span> <span class="ident">obj</span><span class="punct">.</span><span class="ident">fubar</span> <span class="punct">}</span>
<span class="punct">)</span>
</pre></p>
 
 
<h2>Administrivia</h2>
 
 
<h3>Home Sweet Home</h3>
 
 
<p><a href="http://ick.rubyforge.org">ick.rubyforge.org</a></p>
 
 
<h3>How to submit patches</h3>
 
 
<p>Read the <a href="http://drnicwilliams.com/2007/06/01/8-steps-for-fixing-other-peoples-code/">8 steps for fixing other people&#8217;s code</a>.</p>
 
 
<p>The trunk repository is <code>svn://rubyforge.org/var/svn/ick/trunk</code> for anonymous access.</p>
 
 
<h3>License</h3>
 
 
<p>This code is free to use under the terms of the <a href="http://en.wikipedia.org/wiki/MIT_License"><span class="caps">MIT</span> license</a>.</p>
 
 
<h3>Shout Out</h3>
 
 
<p><a href="http://mcommons.com/">Mobile Commons</a>. Still Huge After All These Years.</p>
 
 
<h3>Contact</h3>
 
 
<p>Comments are welcome. Send an email to <a href="mailto:raganwald+rubyforge@gmail.com">Reginald Braithwaite</a>. And you can always visit <a href="http://weblog.raganwald.com/">weblog.raganwald.com</a> to see what&#8217;s cooking.</p>
    <p class="coda">
      <a href="http://weblog.raganwald.com/">Reginald Braithwaite</a>, 10th March 2008<br>
      Theme extended from <a href="http://rb2js.rubyforge.org/">Paul Battley</a>
    </p>
</div>
 
<!-- insert site tracking codes here, like Google Urchin -->
 
<script type="text/javascript" src="http://pub44.bravenet.com/counter/code.php?id=404724&usernum=3754613835&cpv=2"></script>
 
</body>
</html>