patternmatching 0.2.2 → 0.2.3

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.3 2007-06-06
2
+
3
+ * 1 minor enhancement:
4
+ * Duplicated codes removed
5
+
1
6
  == 0.2.2 2007-06-06
2
7
 
3
8
  * 1 major enhancement:
@@ -1,16 +1,91 @@
1
1
 
2
2
  module PatternMatching
3
- #Private Exception for stop matching
4
- class NotMatched < Exception
3
+ # Domain Specific Language style methods for inside block
4
+ module DSL_INSIDE
5
+ #A pattern matches description inside block
6
+ #=== Usage
7
+ # seems as {some pattern...} do ... end
8
+ def as(&block)
9
+ block
10
+ end
11
+
12
+ #A pattern restriction, must boolean
13
+ #=== Usage
14
+ # seems as {PATTERN}, with {CONDITION} do ... end
15
+ def with(&block)
16
+ block
17
+ end
18
+
19
+ #A pattern matches anything
20
+ #=== Usage
21
+ # seems something do ... end
22
+ def something
23
+ proc {_}
24
+ end
5
25
  end
6
26
 
7
- #Private class for build structured data
8
- class NodeBuilder
9
- private
10
- def method_missing(name, *args)
11
- Node.new(name, args)
27
+ # Domain Specific Language style methods for outside
28
+ module DSL_OUTSIDE
29
+ include DSL_INSIDE
30
+ #Build structured data
31
+ #=== Usage
32
+ # build {[foo(bar, 100), foo(buzz, "abc")]}
33
+ def build(&block)
34
+ NodeBuilder.new.instance_eval(&block)
35
+ end
36
+
37
+ #Build structured data
38
+ #=== Usage
39
+ # PatternMatching.build {[foo(bar, 100), foo(buzz, "abc")]}
40
+ def self.build(&block)
41
+ NodeBuilder.new.instance_eval(&block)
42
+ end
43
+
44
+ #Do pattern matching
45
+ #===Usage
46
+ # make TARGET do
47
+ # seems as {PATTERN_1} do ACTION_1 end
48
+ # seems as {PATTERN_2} do ACTION_2 end
49
+ # seems something do ACTION_DEFAULT end
50
+ # end
51
+ def make(target, &block)
52
+ patterns = []
53
+ PatternFragments.new(patterns).instance_eval(&block)
54
+ MatchExec.exec_as(target, patterns, self)
55
+ end
56
+
57
+ #Define method as partial style
58
+ #=== Usage
59
+ # func(NAME).seems as {PATTERN_1} do ACTION_1 end
60
+ # func(NAME).seems as {PATTERN_2} do ACTION_2 end
61
+ # func(NAME).seems something do ACTION_DEFAULT end
62
+ #
63
+ #or
64
+ #
65
+ # func NAME do
66
+ # seems as {PATTERN_1} do ACTION_1 end
67
+ # seems as {PATTERN_2} do ACTION_2 end
68
+ # seems something do ACTION_DEFAULT end
69
+ # end
70
+ #
71
+ def func(name, &block)
72
+ pattern_name = ("@_pattern_" + name.to_s ).to_sym
73
+ unless method_defined?(name)
74
+ patterns = []
75
+ instance_variable_set(pattern_name, patterns)
76
+ define_method(name) do |target|
77
+ MatchExec.exec_as(target, patterns, self)
78
+ end
79
+ end
80
+ patterns = instance_variable_get(pattern_name)
81
+ fragments = PatternFragments.new(patterns)
82
+ if block
83
+ fragments.instance_eval(&block)
84
+ end
85
+ fragments
12
86
  end
13
87
  end
88
+ include DSL_OUTSIDE
14
89
 
15
90
  #Class for structured data/patterns
16
91
  class Node
@@ -27,6 +102,19 @@ module PatternMatching
27
102
  end
28
103
  end
29
104
 
105
+ private
106
+ #Private Exception for stop matching
107
+ class NotMatched < Exception
108
+ end
109
+
110
+ #Private class for build structured data
111
+ class NodeBuilder
112
+ private
113
+ def method_missing(name, *args)
114
+ Node.new(name, args)
115
+ end
116
+ end
117
+
30
118
  #Private module for pattern matching and to collect var/val pairs
31
119
  module Collector
32
120
  def self.walk(source, target, list)
@@ -130,6 +218,7 @@ module PatternMatching
130
218
  def initialize(receiver)
131
219
  @receiver = receiver
132
220
  end
221
+ private
133
222
  def method_missing(name, *args)
134
223
  begin
135
224
  @receiver.send(name, *args)
@@ -159,6 +248,7 @@ module PatternMatching
159
248
  def the
160
249
  @wrapper
161
250
  end
251
+ private
162
252
  def method_missing(name, *args)
163
253
  return @args[name] if @args.key?(name)
164
254
  @receiver.send(name, *args)
@@ -168,6 +258,8 @@ module PatternMatching
168
258
 
169
259
  #Private class for collecting pattern/action fragments
170
260
  class PatternFragments
261
+ include DSL_INSIDE
262
+
171
263
  def initialize(patterns)
172
264
  @patterns = patterns
173
265
  end
@@ -175,97 +267,5 @@ module PatternMatching
175
267
  @patterns << [pattern, action, condition]
176
268
  self
177
269
  end
178
- def as(&block)
179
- block
180
- end
181
- def with(&block)
182
- block
183
- end
184
- def something
185
- proc {_}
186
- end
187
- end
188
-
189
- # Domain Specific Language style methods
190
- module DSL
191
- #Build structured data
192
- #=== Usage
193
- # build {[foo(bar, 100), foo(buzz, "abc")]}
194
- def build(&block)
195
- NodeBuilder.new.instance_eval(&block)
196
- end
197
-
198
- #Build structured data
199
- #=== Usage
200
- # PatternMatching.build {[foo(bar, 100), foo(buzz, "abc")]}
201
- def self.build(&block)
202
- NodeBuilder.new.instance_eval(&block)
203
- end
204
-
205
- #Do pattern matching
206
- #===Usage
207
- # make TARGET do
208
- # seems as {PATTERN_1} do ACTION_1 end
209
- # seems as {PATTERN_2} do ACTION_2 end
210
- # seems something do ACTION_DEFAULT end
211
- # end
212
- def make(target, &block)
213
- patterns = []
214
- PatternFragments.new(patterns).instance_eval(&block)
215
- MatchExec.exec_as(target, patterns, self)
216
- end
217
-
218
- #A pattern matches description inside block
219
- #=== Usage
220
- # seems as {some pattern...} do ... end
221
- def as(&block)
222
- block
223
- end
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
-
232
- #A pattern matches anything
233
- #=== Usage
234
- # seems something do ... end
235
- def something
236
- proc {_}
237
- end
238
-
239
- #Define method as partial style
240
- #=== Usage
241
- # func(NAME).seems as {PATTERN_1} do ACTION_1 end
242
- # func(NAME).seems as {PATTERN_2} do ACTION_2 end
243
- # func(NAME).seems something do ACTION_DEFAULT end
244
- #
245
- #or
246
- #
247
- # func NAME do
248
- # seems as {PATTERN_1} do ACTION_1 end
249
- # seems as {PATTERN_2} do ACTION_2 end
250
- # seems something do ACTION_DEFAULT end
251
- # end
252
- #
253
- def func(name, &block)
254
- pattern_name = ("@_pattern_" + name.to_s ).to_sym
255
- unless method_defined?(name)
256
- patterns = []
257
- instance_variable_set(pattern_name, patterns)
258
- define_method(name) do |target|
259
- MatchExec.exec_as(target, patterns, self)
260
- end
261
- end
262
- patterns = instance_variable_get(pattern_name)
263
- fragments = PatternFragments.new(patterns)
264
- if block
265
- fragments.instance_eval(&block)
266
- end
267
- fragments
268
- end
269
270
  end
270
- include DSL
271
271
  end
@@ -2,7 +2,7 @@ module PatternMatching #:nodoc:
2
2
  module VERSION #:nodoc:
3
3
  MAJOR = 0
4
4
  MINOR = 2
5
- TINY = 2
5
+ TINY = 3
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
8
8
  end
@@ -3,7 +3,7 @@ require 'patternmatching/version'
3
3
  require 'patternmatching/pattern'
4
4
 
5
5
  module PatternMatching
6
- # The module is only for showing example docs.
6
+ # The module is only for showing usage...
7
7
  #== Using module
8
8
  # # If installed from rubygems
9
9
  # require "rubygems"
@@ -33,25 +33,6 @@ module PatternMatching
33
33
  #
34
34
  # p Calc.new.calcm(code)
35
35
  #
36
- #== Another partial style method example
37
- # class CalcX
38
- # extend PatternMatching
39
- #
40
- # func(:calcx) do
41
- # seems as {plus(:a, :b)} do
42
- # calcx(a) + calcx(b)
43
- # end
44
- # seems as {mul(:a, :b)} do
45
- # calcx(a) * calcx(b)
46
- # end
47
- # end
48
- # func(:calcx).seems as {:value} do
49
- # value
50
- # end
51
- # end
52
- #
53
- # p CalcX.new.calcx(code)
54
- #
55
36
  #== Pattern matching example
56
37
  # include PatternMatching
57
38
  #
@@ -65,47 +46,8 @@ module PatternMatching
65
46
  #
66
47
  # p calc(code)
67
48
  #
68
- #== Enumerable matching example
69
- # is = build { exact([1,2,3,4,5]) }
70
- # make is do
71
- # seems as {exact([:a,:b, _!(:c)])} do
72
- # puts a.to_s + ", " + b.to_s + " and " + c.to_s
73
- # end
74
- # seems something do
75
- # puts "not matched"
76
- # end
77
- # end
78
- #
79
- #== Hash to Hash matching example
80
- # dict = build { {:name => "Taro", :age => 5} }
81
- # make dict do
82
- # seems as {{:name => :name}} do
83
- # puts "He is " + name
84
- # end
85
- # seems something do
86
- # puts "no name"
87
- # end
88
- # end
89
- #
90
- #== Hash to non-Hash object matching example
91
- # class Person
92
- # def initialize(name, age)
93
- # @name = name
94
- # @age = age
95
- # end
96
- # attr :name
97
- # attr :age
98
- # end
99
- #
100
- # make Person.new("Jiro", 3) do
101
- # seems as {{:name => :name}} do
102
- # puts "He is " + name
103
- # end
104
- # seems something do
105
- # puts "no name"
106
- # end
107
- # end
108
- #
109
- module EXAMPLES
49
+ #== For more
50
+ #see README.txt
51
+ module USAGE
110
52
  end
111
53
  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.2</a>
36
+ <a href="http://rubyforge.org/projects/patternmatching" class="numbers">0.2.3</a>
37
37
  </div>
38
38
  <h1>&#x2192; &#8216;patternmatching&#8217;</h1>
39
39
 
metadata CHANGED
@@ -3,7 +3,7 @@ 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.2
6
+ version: 0.2.3
7
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: