egison 0.0.2 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: de7ad9f50fc2017c4546ff5ec489cd05e73fb13e
4
- data.tar.gz: 093963280669d6413a0729c82902bf342e321c82
3
+ metadata.gz: f225dc3acddccd5aea65c3db3ffb9affee8ce561
4
+ data.tar.gz: 2263fd6df2e9b1e0fbc1bf35b62bf1f264e5f7a3
5
5
  SHA512:
6
- metadata.gz: 00bdaec6a09f92e11144f45bdd4835c06ade096c13769350d9766a55ab27a0b5a92ab8c25186e8c5e604ba8adf5b76a722986434e9f3c9ae498c5c1488e33d5f
7
- data.tar.gz: 314486adbe83a12d08f46c92e0dc062c52555d9f152e158103b0962bd1300f1b3f75093a95b3d3b3948a7529c6580b51021071486923a5e27d927e34a2226cfd
6
+ metadata.gz: 9193ade5c394260922f051ecd0fc6010ba3f54b9a902b0a631c4b7c416d0ce0eb26e6c380639d31704ef7f401c107aaded9e673198582315c16e75de9850fa72
7
+ data.tar.gz: a4816f03440ab863e5430a319607ff06e37265bbe51cbf52e50fee9801931a48765909ce4f6ca617376bf90cb58acd263c160f51e135e19f88be0d776e370961
data/README.md CHANGED
@@ -87,31 +87,34 @@ We can write pattern-matching against lists, multisets, and sets.
87
87
  When we regard an array as a multiset, the order of elements is ignored.
88
88
  When we regard an array as a set, the duplicates and order of elements are ignored.
89
89
 
90
+ `__` is a <i>wildcard</i>.
91
+ It matches with any object.
92
+
90
93
  ```
91
94
  match_all([1, 2, 3]) do
92
- with(List.(_a, _b, *_)) do
95
+ with(List.(_a, _b, *__)) do
93
96
  [a, b]
94
97
  end
95
98
  end #=> [[1, 2]]
96
99
 
97
100
  match_all([1, 2, 3]) do
98
- with(Multiset.(_a, _b, *_)) do
101
+ with(Multiset.(_a, _b, *__)) do
99
102
  [a, b]
100
103
  end
101
104
  end #=> [[1, 2], [1, 3], [2, 1], [2, 3], [3, 1], [3, 2]]
102
105
 
103
106
  match_all([1, 2, 3]) do
104
- with(Set.(_a, _b, *_)) do
107
+ with(Set.(_a, _b, *__)) do
105
108
  [a, b]
106
109
  end
107
110
  end #=> [[1, 1],[1, 2],[1, 3],[2, 1],[2, 2],[2, 3],[3, 1],[3, 2],[3, 3]]
108
111
  ```
109
112
 
110
- Note that <code>_[]</code> is provided as syntactic sugar for <code>List.()</code>.
113
+ Note that `_[]` is provided as syntactic sugar for `List.()`.
111
114
 
112
115
  ```
113
116
  match_all([1, 2, 3]) do
114
- with(_[_a, _b, *_]) do
117
+ with(_[_a, _b, *__]) do
115
118
  [a, b]
116
119
  end
117
120
  end #=> [[1, 2]]
@@ -127,7 +130,7 @@ It matches the target when the target is equal with the value that `...` evaluat
127
130
 
128
131
  ```
129
132
  match_all([5, 3, 4, 1, 2]) do
130
- with(Multiset.(_a, __("a + 1"), __("a + 2"), *_)) do
133
+ with(Multiset.(_a, __("a + 1"), __("a + 2"), *__)) do
131
134
  a
132
135
  end
133
136
  end #=> [1,2,3]
@@ -137,7 +140,7 @@ When, the expression in the place of `...` is a single variable, we can omit `("
137
140
 
138
141
  ```
139
142
  match_all([1, 2, 3, 2, 5]) do
140
- with(Multiset.(_a, __a, *_)) do
143
+ with(Multiset.(_a, __a, *__)) do
141
144
  a
142
145
  end
143
146
  end #=> [2,2]
@@ -157,28 +160,28 @@ def poker_hands cs
157
160
  with(Multiset.(_[_s, _n], _[__s, __("n+1")], _[__s, __("n+2")], _[__s, __("n+3")], _[__s, __("n+4")])) do
158
161
  "Straight flush"
159
162
  end
160
- with(Multiset.(_[_, _n], _[_, __n], _[_, __n], _[_, __n], _)) do
163
+ with(Multiset.(_[__, _n], _[__, __n], _[__, __n], _[__, __n], __)) do
161
164
  "Four of kind"
162
165
  end
163
- with(Multiset.(_[_, _m], _[_, __m], _[_, __m], _[_, _n], _[_, __n])) do
166
+ with(Multiset.(_[__, _m], _[__, __m], _[__, __m], _[__, _n], _[__, __n])) do
164
167
  "Full house"
165
168
  end
166
169
  with(Multiset.(_[_s, _], _[__s, _], _[__s, _], _[__s, _], _[__s, _])) do
167
170
  "Flush"
168
171
  end
169
- with(Multiset.(_[_, _n], _[_, __("n+1")], _[_, __("n+2")], _[_, __("n+3")], _[_, __("n+4")])) do
172
+ with(Multiset.(_[__, _n], _[__, __("n+1")], _[__, __("n+2")], _[__, __("n+3")], _[__, __("n+4")])) do
170
173
  "Straight"
171
174
  end
172
- with(Multiset.(_[_, _n], _[_, __n], _[_, __n], _, _)) do
175
+ with(Multiset.(_[__, _n], _[__, __n], _[__, __n], __, __)) do
173
176
  "Three of kind"
174
177
  end
175
- with(Multiset.(_[_, _m], _[_, __m], _[_, _n], _[_, __n], _)) do
178
+ with(Multiset.(_[__, _m], _[__, __m], _[__, _n], _[__, __n], __)) do
176
179
  "Two pairs"
177
180
  end
178
- with(Multiset.(_[_, _n], _[_, __n], _, _, _)) do
181
+ with(Multiset.(_[__, _n], _[__, __n], __, __, __)) do
179
182
  "One pair"
180
183
  end
181
- with(Multiset.(_, _, _, _, _)) do
184
+ with(Multiset.(__, __, __, __, __)) do
182
185
  "Nothing"
183
186
  end
184
187
  end
@@ -264,10 +264,23 @@ module PatternMatch
264
264
  end
265
265
  end
266
266
 
267
- def __(val)
268
- ValuePattern.new(@ctx, val)
267
+ def __(*vals)
268
+ case vals.length
269
+ when 0
270
+ uscore = Wildcard.new()
271
+ class << uscore
272
+ def [](*args)
273
+ List.call(*args)
274
+ end
275
+ end
276
+ uscore
277
+ when 1
278
+ ValuePattern.new(@ctx, vals[0])
279
+ else
280
+ undefined
281
+ end
269
282
  end
270
-
283
+
271
284
  class BindingModule < ::Module
272
285
  end
273
286
 
@@ -353,3 +366,4 @@ module Kernel
353
366
  end
354
367
 
355
368
  end
369
+
@@ -0,0 +1,42 @@
1
+ require 'egison/core'
2
+
3
+ class Class
4
+ include PatternMatch::Matchable
5
+
6
+ def uncons(val)
7
+ raise NotImplementedError, "need to define `#{__method__}'"
8
+ end
9
+
10
+ private
11
+
12
+ def accept_array_only(val)
13
+ raise PatternMatch::PatternNotMatch unless val.kind_of?(Array)
14
+ end
15
+ end
16
+
17
+ class List
18
+ end
19
+
20
+ class << List
21
+ def uncons(val)
22
+ accept_array_only(val)
23
+ val2 = val.clone
24
+ x = val2.shift
25
+ [[x, val2]]
26
+ end
27
+
28
+ def unjoin(val)
29
+ accept_array_only(val)
30
+ val2 = val.clone
31
+ xs = []
32
+ ys = val2.clone
33
+ rets = [[xs, ys]]
34
+ while !val2.empty? do
35
+ x = val2.shift
36
+ ys = val2.clone
37
+ xs = xs + [x]
38
+ rets = rets + [[xs, ys]]
39
+ end
40
+ rets
41
+ end
42
+ end
@@ -1,45 +1,5 @@
1
1
  require 'egison/core'
2
-
3
- class Class
4
- include PatternMatch::Matchable
5
-
6
- def uncons(val)
7
- raise NotImplementedError, "need to define `#{__method__}'"
8
- end
9
-
10
- private
11
-
12
- def accept_array_only(val)
13
- raise PatternMatch::PatternNotMatch unless val.kind_of?(Array)
14
- end
15
- end
16
-
17
- class List
18
- end
19
-
20
- class << List
21
- def uncons(val)
22
- accept_array_only(val)
23
- val2 = val.clone
24
- x = val2.shift
25
- [[x, val2]]
26
- end
27
-
28
- def unjoin(val)
29
- accept_array_only(val)
30
- val2 = val.clone
31
- xs = []
32
- ys = val2.clone
33
- rets = [[xs, ys]]
34
- while !val2.empty? do
35
- x = val2.shift
36
- ys = val2.clone
37
- xs = xs + [x]
38
- rets = rets + [[xs, ys]]
39
- end
40
- rets
41
- end
42
- end
2
+ require 'egison/matcher-core'
43
3
 
44
4
  class Multiset
45
5
  end
@@ -47,12 +7,11 @@ end
47
7
  class << Multiset
48
8
  def uncons(val)
49
9
  accept_array_only(val)
50
- rets = val.map {|x|
51
- val2 = val.clone
52
- val2.delete_at(val2.find_index(x))
53
- [x, val2]
54
- }
55
- rets
10
+ match_all(val) do
11
+ with(List.(*_hs, _x, *_ts)) do
12
+ [x, hs + ts]
13
+ end
14
+ end
56
15
  end
57
16
 
58
17
  def unjoin(val)
@@ -79,12 +38,13 @@ end
79
38
  class << Set
80
39
  def uncons(val)
81
40
  accept_array_only(val)
82
- rets = val.map {|x|
83
- val2 = val.clone
84
- [x, val2]
85
- }
86
- rets
41
+ match_all(val) do
42
+ with(List.(*_, _x, *_)) do
43
+ [x, val]
44
+ end
45
+ end
87
46
  end
47
+
88
48
  def unjoin(val)
89
49
  accept_array_only(val)
90
50
  val2 = val.clone
@@ -1,3 +1,3 @@
1
1
  module Egison
2
- VERSION = "0.0.2"
2
+ VERSION = "0.1.0"
3
3
  end
@@ -0,0 +1,7 @@
1
+ require 'egison'
2
+
3
+ p(match_all([1,2,3,4,5]) do with(List.(*_hs, *_ts)) { [hs, ts] } end)
4
+
5
+ p(match_all([1,2,3,4,5]) do with(Multiset.(*_hs, *_ts)) { [hs, ts] } end)
6
+
7
+ p(match_all([1,2,3,4,5]) do with(Set.(*_hs, *_ts)) { [hs, ts] } end)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: egison
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Satoshi Egi
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-05-12 00:00:00.000000000 Z
11
+ date: 2014-05-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -40,9 +40,11 @@ files:
40
40
  - egison.gemspec
41
41
  - lib/egison.rb
42
42
  - lib/egison/core.rb
43
+ - lib/egison/matcher-core.rb
43
44
  - lib/egison/matcher.rb
44
45
  - lib/egison/version.rb
45
46
  - sample/combination.rb
47
+ - sample/join.rb
46
48
  - sample/poker_hands.rb
47
49
  - sample/set.rb
48
50
  homepage: https://github.com/egisatoshi/egison-ruby