egison 0.0.2 → 0.1.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.
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