patternmatching 0.2.2 → 0.2.3

Sign up to get free protection for your applications and to get access to all the features.
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: