patternmatching 0.1.4 → 0.2.0

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/README.txt CHANGED
@@ -23,9 +23,7 @@ Note: Default equivalence used in structured pattern matching is
23
23
  based on "pattern === data",
24
24
  so "foo(Numeric)" matches "foo(100)".
25
25
 
26
- Notice: Current implementation is not thread safe now.
27
- Need the receiver object(NOT an argument) calling pattern matching
28
- synchronized when multi-threaded access.
26
+ From ver. 0.2.0, thread unsafeness restriction is removed.
29
27
 
30
28
  == Demonstration of usage
31
29
 
@@ -142,6 +140,45 @@ to the following block when the pattern matched.
142
140
  end
143
141
  end # => "He is Jiro"
144
142
 
143
+ === Field Access Example
144
+ It is ver. 0.2.0 API
145
+
146
+ require "patternmatching"
147
+
148
+ include PatternMatching
149
+
150
+ class Foo
151
+ def initialize
152
+ @name = "Foo"
153
+ end
154
+ attr :name
155
+ def foo
156
+ end
157
+
158
+ def bar
159
+ make "bar" do
160
+ seems as {:val} do
161
+ foo
162
+ # To access fields like this.name or this.name = ...
163
+ the.name = val
164
+ # To access self as this
165
+ this
166
+ end
167
+ end
168
+ end
169
+
170
+ func(:buzz).seems as {:val} do
171
+ the.name = val
172
+ this
173
+ end
174
+ end
175
+
176
+ o = Foo.new
177
+ p o.bar == o #=> true
178
+ p o.name #=> "bar"
179
+ p o.buzz("buzz") == o #=> true
180
+ p o.name #=> "buzz"
181
+
145
182
  == Forum
146
183
 
147
184
  Visit the project forum in RubyForge.
@@ -158,11 +195,11 @@ for anonymous access.
158
195
 
159
196
  This code is free to use under the terms of the MIT license.
160
197
 
161
- == Link
198
+ == Links
162
199
 
163
- * Web Site: http://patternmatching.rubyforge.org/
164
- * Project Page: http://rubyforge.org/projects/patternmatching/
165
- * API Doc: http://patternmatching.rubyforge.org/rdoc/
200
+ * {Web Site}[http://patternmatching.rubyforge.org/]
201
+ * {Project Page}[http://rubyforge.org/projects/patternmatching/]
202
+ * {API Doc}[http://patternmatching.rubyforge.org/rdoc/]
166
203
 
167
204
  == Contact
168
205
 
data/Rakefile CHANGED
@@ -107,7 +107,7 @@ end
107
107
 
108
108
  desc 'Generate and upload website files'
109
109
  # task :website => [:website_generate]
110
- task :website => [:website_generate, :website_upload]
110
+ task :website => [:website_generate, :website_upload, :publish_docs]
111
111
 
112
112
  desc 'Release the website and new gem version'
113
113
  task :deploy => [:check_version, :website, :release] do
@@ -7,22 +7,29 @@ class Foo
7
7
  @name = "Foo"
8
8
  end
9
9
  attr :name
10
+ def foo
11
+ end
10
12
 
11
13
  def bar
12
14
  make "bar" do
13
15
  seems as {:val} do
14
- @name = val
16
+ foo
17
+ # To access fields like this.name or this.name = ...
18
+ the.name = val
19
+ # To access self as this
20
+ this
15
21
  end
16
22
  end
17
23
  end
18
24
 
19
25
  func(:buzz).seems as {:val} do
20
- @name = val
26
+ the.name = val
27
+ this
21
28
  end
22
29
  end
23
30
 
24
31
  o = Foo.new
25
- o.bar
32
+ p o.bar == o #=> true
26
33
  p o.name #=> "bar"
27
- o.buzz("buzz")
34
+ p o.buzz("buzz") == o #=> true
28
35
  p o.name #=> "buzz"
@@ -117,34 +117,47 @@ module PatternMatching
117
117
  rescue NotMatched
118
118
  next
119
119
  end
120
- return ExecuteAs.new(args, receiver).call(&action)
120
+ return ExecuteAs.new(args, receiver).instance_eval(&action)
121
121
  end
122
122
  end
123
123
 
124
+ # Private class to access instance valiables of the receiver
125
+ class InstanceVariableAccessor
126
+ def initialize(receiver)
127
+ @receiver = receiver
128
+ end
129
+ def method_missing(name, *args)
130
+ begin
131
+ @receiver.send(name, *args)
132
+ rescue NameError
133
+ if name.to_s[-1,1] == "="
134
+ field = "@" + name.to_s[0...-1]
135
+ @receiver.instance_variable_set(field, args[0])
136
+ else
137
+ field = "@" + name.to_s
138
+ @receiver.instance_variable_get(field, args[0])
139
+ end
140
+ end
141
+ end
142
+ end
143
+
124
144
  #Private class enabling to use the name of symbols in patterns
125
145
  #like a local variables in action blocks
126
146
  class ExecuteAs
127
147
  def initialize(args, receiver)
128
- @this = receiver
148
+ @receiver = receiver
149
+ @wrapper = InstanceVariableAccessor.new receiver
129
150
  @args = args
130
151
  end
131
- def call(&action)
132
- args = @args
133
- mod = Module.new
134
- mod.instance_eval do
135
- define_method(:method_missing) do |name, *margs|
136
- return args[name] if args.key?(name)
137
- super(name, *margs)
138
- end
139
- end
140
- # this block is not thread safe
141
- @this.extend mod
142
- result = @this.instance_eval(&action)
143
- mod.instance_eval do
144
- remove_method(:method_missing)
145
- end
146
- #
147
- result
152
+ def this
153
+ @receiver
154
+ end
155
+ def the
156
+ @wrapper
157
+ end
158
+ def method_missing(name, *args)
159
+ return @args[name] if @args.key?(name)
160
+ @receiver.send(name, *args)
148
161
  end
149
162
  end
150
163
  end
@@ -1,8 +1,8 @@
1
1
  module PatternMatching #:nodoc:
2
2
  module VERSION #:nodoc:
3
3
  MAJOR = 0
4
- MINOR = 1
5
- TINY = 4
4
+ MINOR = 2
5
+ TINY = 0
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
8
8
  end
@@ -48,17 +48,24 @@ class PartialStyleDefs
48
48
  @name = "Foo"
49
49
  end
50
50
  attr :name
51
-
51
+ def foo
52
+ self
53
+ end
54
+
52
55
  def bar
53
56
  make "bar" do
54
57
  seems as {:val} do
55
- @name = val
58
+ foo
59
+ the.name = val
60
+ this
56
61
  end
57
62
  end
58
63
  end
59
64
 
60
65
  func(:buzz).seems as {:val} do
61
- @name = val
66
+ foo
67
+ the.name = val
68
+ this
62
69
  end
63
70
  end
64
71
 
@@ -183,9 +190,9 @@ describe "PatternMatching from Example" do
183
190
  it "should update fields from block" do
184
191
  o = PartialStyleDefs.new
185
192
  o.name.should == "Foo"
186
- o.bar
193
+ o.bar.should == o
187
194
  o.name.should == "bar"
188
- o.buzz("buzz")
195
+ o.buzz("buzz").should == o
189
196
  o.name.should == "buzz"
190
197
  end
191
198
  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.1.4</a>
36
+ <a href="http://rubyforge.org/projects/patternmatching" class="numbers">0.2.0</a>
37
37
  </div>
38
38
  <h1>&#x2192; &#8216;patternmatching&#8217;</h1>
39
39
 
@@ -71,9 +71,7 @@ based on &#8220;<code>pattern === data</code>&#8221;,
71
71
  so &#8220;<code>foo(Numeric)</code>&#8221; matches &#8220;<code>foo(100)</code>&#8221;.</p>
72
72
 
73
73
 
74
- <p>Notice: Current implementation is not thread safe now.
75
- Need the receiver object(NOT an argument) calling pattern matching
76
- synchronized when multi-threaded access.</p>
74
+ <p>From ver. 0.2.0, thread unsafeness restriction is removed.</p>
77
75
 
78
76
 
79
77
  <h2>Demonstration of usage</h2>
@@ -197,6 +195,46 @@ make person do
197
195
  puts "no name"
198
196
  end
199
197
  end # =&gt; "He is Jiro"
198
+ </pre>
199
+
200
+ <h3>Field Access Example</h3>
201
+ It is ver 0.2.0 <span class="caps">API</span>
202
+ <pre>
203
+ require "patternmatching"
204
+
205
+ include PatternMatching
206
+
207
+ class Foo
208
+ def initialize
209
+ @name = "Foo"
210
+ end
211
+ attr :name
212
+ def foo
213
+ end
214
+
215
+ def bar
216
+ make "bar" do
217
+ seems as {:val} do
218
+ foo
219
+ # To access fields like this.name or this.name = ...
220
+ the.name = val
221
+ # To access self as this
222
+ this
223
+ end
224
+ end
225
+ end
226
+
227
+ func(:buzz).seems as {:val} do
228
+ the.name = val
229
+ this
230
+ end
231
+ end
232
+
233
+ o = Foo.new
234
+ p o.bar == o #=&gt; true
235
+ p o.name #=&gt; "bar"
236
+ p o.buzz("buzz") == o #=&gt; true
237
+ p o.name #=&gt; "buzz"
200
238
  </pre>
201
239
 
202
240
  <h2>Forum</h2>
@@ -220,7 +258,7 @@ end # =&gt; "He is Jiro"
220
258
  <p>This code is free to use under the terms of the <span class="caps">MIT</span> license.</p>
221
259
 
222
260
 
223
- <h2>Link</h2>
261
+ <h2>Links</h2>
224
262
 
225
263
 
226
264
  <ul>
data/website/index.txt CHANGED
@@ -24,9 +24,7 @@ Note: Default equivalence used in structured pattern matching is
24
24
  based on "<code>pattern === data</code>",
25
25
  so "<code>foo(Numeric)</code>" matches "<code>foo(100)</code>".
26
26
 
27
- Notice: Current implementation is not thread safe now.
28
- Need the receiver object(NOT an argument) calling pattern matching
29
- synchronized when multi-threaded access.
27
+ From ver. 0.2.0, thread unsafeness restriction is removed.
30
28
 
31
29
  h2. Demonstration of usage
32
30
 
@@ -149,6 +147,47 @@ make person do
149
147
  end # => "He is Jiro"
150
148
  </pre>
151
149
 
150
+ <h3>Field Access Example</h3>
151
+ It is ver 0.2.0 API
152
+ <pre>
153
+ require "patternmatching"
154
+
155
+ include PatternMatching
156
+
157
+ class Foo
158
+ def initialize
159
+ @name = "Foo"
160
+ end
161
+ attr :name
162
+ def foo
163
+ end
164
+
165
+ def bar
166
+ make "bar" do
167
+ seems as {:val} do
168
+ foo
169
+ # To access fields like this.name or this.name = ...
170
+ the.name = val
171
+ # To access self as this
172
+ this
173
+ end
174
+ end
175
+ end
176
+
177
+ func(:buzz).seems as {:val} do
178
+ the.name = val
179
+ this
180
+ end
181
+ end
182
+
183
+ o = Foo.new
184
+ p o.bar == o #=> true
185
+ p o.name #=> "bar"
186
+ p o.buzz("buzz") == o #=> true
187
+ p o.name #=> "buzz"
188
+ </pre>
189
+
190
+
152
191
  h2. Forum
153
192
 
154
193
  Visit RubyForge project forum.
@@ -163,7 +202,7 @@ h2. License
163
202
 
164
203
  This code is free to use under the terms of the MIT license.
165
204
 
166
- h2. Link
205
+ h2. Links
167
206
 
168
207
  * "Web Site":http://patternmatching.rubyforge.org/
169
208
  * "Project Page":http://rubyforge.org/projects/patternmatching/
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.1.4
6
+ version: 0.2.0
7
7
  date: 2007-06-05 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: