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 +5 -0
- data/lib/patternmatching/pattern.rb +99 -99
- data/lib/patternmatching/version.rb +1 -1
- data/lib/patternmatching.rb +4 -62
- data/website/index.html +1 -1
- metadata +1 -1
data/History.txt
CHANGED
@@ -1,16 +1,91 @@
|
|
1
1
|
|
2
2
|
module PatternMatching
|
3
|
-
#
|
4
|
-
|
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
|
-
#
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
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
|
data/lib/patternmatching.rb
CHANGED
@@ -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
|
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
|
-
#==
|
69
|
-
#
|
70
|
-
|
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.
|
36
|
+
<a href="http://rubyforge.org/projects/patternmatching" class="numbers">0.2.3</a>
|
37
37
|
</div>
|
38
38
|
<h1>→ ‘patternmatching’</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.
|
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:
|