patternmatching 0.2.1 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/History.txt CHANGED
@@ -1,3 +1,8 @@
1
+ == 0.2.2 2007-06-06
2
+
3
+ * 1 major enhancement:
4
+ * Accept pattern with condition
5
+
1
6
  == 0.2.1 2007-06-05
2
7
 
3
8
  * 1 minor enhancement:
data/Manifest.txt CHANGED
@@ -7,7 +7,9 @@ examples/enumerable_matching.rb
7
7
  examples/hash_matching.rb
8
8
  examples/match_inside_class.rb
9
9
  examples/matching.rb
10
+ examples/matching_with_condition.rb
10
11
  examples/object_matching.rb
12
+ examples/overhead.rb
11
13
  examples/partial_style_method.rb
12
14
  examples/partial_style_method2.rb
13
15
  lib/patternmatching.rb
data/README.txt CHANGED
@@ -179,6 +179,25 @@ It is ver. 0.2.0 API
179
179
  p o.buzz("buzz") == o #=> true
180
180
  p o.name #=> "buzz"
181
181
 
182
+ === Pattern with Condition Example
183
+ It is from ver. 0.2.2 API
184
+
185
+ require "patternmatching"
186
+
187
+ include PatternMatching
188
+
189
+ num = 100
190
+ result = make num do
191
+ seems as {:n}, with {n < 10} do
192
+ true
193
+ end
194
+ seems as {:n}, with {n >= 10} do
195
+ false
196
+ end
197
+ end
198
+
199
+ p result #=> false
200
+
182
201
  == Forum
183
202
 
184
203
  Visit the project forum in RubyForge.
@@ -0,0 +1,16 @@
1
+
2
+ require "patternmatching"
3
+
4
+ include PatternMatching
5
+
6
+ num = 100
7
+ result = make num do
8
+ seems as {:n}, with {n < 10} do
9
+ true
10
+ end
11
+ seems as {:n}, with {n >= 10} do
12
+ false
13
+ end
14
+ end
15
+
16
+ p result #=> false
@@ -0,0 +1,68 @@
1
+
2
+ require "patternmatching"
3
+
4
+ include PatternMatching
5
+
6
+ class Through
7
+ def plain(n)
8
+ n
9
+ end
10
+
11
+ func(:pattern).seems as {:n} do n end
12
+ end
13
+
14
+ count = 10000
15
+
16
+ plain = Through.new
17
+ start = Time.new
18
+ count.times do |i|
19
+ plain.plain(i)
20
+ end
21
+ plain_time = Time.new - start
22
+
23
+ pattern = Through.new
24
+ start = Time.new
25
+ count.times do |i|
26
+ pattern.pattern(i)
27
+ end
28
+ pattern_time = Time.new - start
29
+
30
+ puts "Check Through call " + count.to_s + " times"
31
+ puts "Standard Method cost: " + plain_time.to_s + " sec"
32
+ puts "Partial Method cost: " + pattern_time.to_s + " sec"
33
+
34
+ puts "Overhead/method: " +
35
+ ((pattern_time - plain_time).to_f / count * 1000).to_s + " msec"
36
+
37
+
38
+
39
+ class Recursive
40
+ def plain(n)
41
+ if n > 0
42
+ plain(n - 1)
43
+ end
44
+ end
45
+
46
+ func(:pattern).seems as {:n}, with {n > 0} do
47
+ pattern(n-1)
48
+ end
49
+ end
50
+
51
+ count = 300 # depends on system stack size
52
+
53
+ plain = Recursive.new
54
+ start = Time.new
55
+ plain.plain(count)
56
+ plain_time = Time.new - start
57
+
58
+ pattern = Recursive.new
59
+ start = Time.new
60
+ pattern.pattern(count)
61
+ pattern_time = Time.new - start
62
+
63
+ puts "Check Recursive call " + count.to_s + " times"
64
+ puts "Standard Method cost: " + plain_time.to_s + " sec"
65
+ puts "Partial Method cost: " + pattern_time.to_s + " sec"
66
+ puts "Overhead/method: " +
67
+ ((pattern_time - plain_time).to_f / count * 1000).to_s + " msec"
68
+
@@ -107,9 +107,10 @@ module PatternMatching
107
107
  #Private class to run pattern matching
108
108
  class MatchExec
109
109
  def self.exec_as(target, patterns, receiver)
110
- patterns.each do |pair|
111
- pattern = pair.keys[0]
112
- action = pair[pattern]
110
+ patterns.each do |tuple|
111
+ pattern = tuple[0]
112
+ action = tuple[1]
113
+ condition = tuple[2]
113
114
  source = NodeBuilder.new.instance_eval(&pattern)
114
115
  args = {}
115
116
  begin
@@ -117,8 +118,11 @@ module PatternMatching
117
118
  rescue NotMatched
118
119
  next
119
120
  end
120
- return ExecuteAs.new(args, receiver).instance_eval(&action)
121
- end
121
+ executer = ExecuteAs.new(args, receiver)
122
+ next if condition != nil and not executer.instance_eval(&condition)
123
+ return executer.instance_eval(&action)
124
+ end
125
+ nil
122
126
  end
123
127
 
124
128
  # Private class to access instance valiables of the receiver
@@ -167,13 +171,16 @@ module PatternMatching
167
171
  def initialize(patterns)
168
172
  @patterns = patterns
169
173
  end
170
- def seems(pattern, &action)
171
- @patterns << {pattern => action}
174
+ def seems(pattern, condition = nil, &action)
175
+ @patterns << [pattern, action, condition]
172
176
  self
173
177
  end
174
178
  def as(&block)
175
179
  block
176
180
  end
181
+ def with(&block)
182
+ block
183
+ end
177
184
  def something
178
185
  proc {_}
179
186
  end
@@ -215,6 +222,13 @@ module PatternMatching
215
222
  block
216
223
  end
217
224
 
225
+ #A pattern restriction, must boolean
226
+ #=== Usage
227
+ # seems as {PATTERN}, with {CONDITION} do ... end
228
+ def with(&block)
229
+ block
230
+ end
231
+
218
232
  #A pattern matches anything
219
233
  #=== Usage
220
234
  # seems something do ... end
@@ -2,7 +2,7 @@ module PatternMatching #:nodoc:
2
2
  module VERSION #:nodoc:
3
3
  MAJOR = 0
4
4
  MINOR = 2
5
- TINY = 1
5
+ TINY = 2
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
8
8
  end
@@ -195,4 +195,13 @@ describe "PatternMatching from Example" do
195
195
  o.buzz("buzz").should == o
196
196
  o.name.should == "buzz"
197
197
  end
198
+
199
+ it "should check pattern with condition" do
200
+ make(100) do
201
+ seems as {:a}, with {a > 10} do a end
202
+ end.should == 100
203
+ make(1) do
204
+ seems as {:a}, with {a > 10} do a end
205
+ end.should == nil
206
+ end
198
207
  end
data/website/index.html CHANGED
@@ -33,7 +33,7 @@
33
33
  <h1>PatternMatching module</h1>
34
34
  <div id="version" class="clickable" onclick='document.location = "http://rubyforge.org/projects/patternmatching"; return false'>
35
35
  Get Version
36
- <a href="http://rubyforge.org/projects/patternmatching" class="numbers">0.2.1</a>
36
+ <a href="http://rubyforge.org/projects/patternmatching" class="numbers">0.2.2</a>
37
37
  </div>
38
38
  <h1>&#x2192; &#8216;patternmatching&#8217;</h1>
39
39
 
@@ -235,6 +235,26 @@ p o.bar == o #=&gt; true
235
235
  p o.name #=&gt; "bar"
236
236
  p o.buzz("buzz") == o #=&gt; true
237
237
  p o.name #=&gt; "buzz"
238
+ </pre>
239
+
240
+ <h3>Pattern with Condition Example</h3>
241
+ It is from ver 0.2.2 <span class="caps">API</span>
242
+ <pre>
243
+ require "patternmatching"
244
+
245
+ include PatternMatching
246
+
247
+ num = 100
248
+ result = make num do
249
+ seems as {:n}, with {n &lt; 10} do
250
+ true
251
+ end
252
+ seems as {:n}, with {n &gt;= 10} do
253
+ false
254
+ end
255
+ end
256
+
257
+ p result #=&gt; false
238
258
  </pre>
239
259
 
240
260
  <h2>Forum</h2>
@@ -285,7 +305,7 @@ p o.name #=&gt; "buzz"
285
305
  <p><a href="http://d.hatena.ne.jp/bellbind/">My blog</a> (written in Japanese)
286
306
  could be help you.</p>
287
307
  <p class="coda">
288
- <a href="mailto:drnicwilliams@gmail.com">Dr Nic</a>, 5th June 2007<br>
308
+ <a href="mailto:drnicwilliams@gmail.com">Dr Nic</a>, 6th June 2007<br>
289
309
  Theme extended from <a href="http://rb2js.rubyforge.org/">Paul Battley</a>
290
310
  </p>
291
311
  </div>
data/website/index.txt CHANGED
@@ -187,6 +187,25 @@ p o.buzz("buzz") == o #=> true
187
187
  p o.name #=> "buzz"
188
188
  </pre>
189
189
 
190
+ <h3>Pattern with Condition Example</h3>
191
+ It is from ver 0.2.2 API
192
+ <pre>
193
+ require "patternmatching"
194
+
195
+ include PatternMatching
196
+
197
+ num = 100
198
+ result = make num do
199
+ seems as {:n}, with {n < 10} do
200
+ true
201
+ end
202
+ seems as {:n}, with {n >= 10} do
203
+ false
204
+ end
205
+ end
206
+
207
+ p result #=> false
208
+ </pre>
190
209
 
191
210
  h2. Forum
192
211
 
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.4
3
3
  specification_version: 1
4
4
  name: patternmatching
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.2.1
7
- date: 2007-06-05 00:00:00 +09:00
6
+ version: 0.2.2
7
+ date: 2007-06-06 00:00:00 +09:00
8
8
  summary: Provide a pure ruby module that can build structured objects easily, can enable pattern match of objects, and can define method as a partial function style.
9
9
  require_paths:
10
10
  - lib
@@ -38,7 +38,9 @@ files:
38
38
  - examples/hash_matching.rb
39
39
  - examples/match_inside_class.rb
40
40
  - examples/matching.rb
41
+ - examples/matching_with_condition.rb
41
42
  - examples/object_matching.rb
43
+ - examples/overhead.rb
42
44
  - examples/partial_style_method.rb
43
45
  - examples/partial_style_method2.rb
44
46
  - lib/patternmatching.rb