cons 1.0.1 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/cons.rb +88 -21
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3af72cf8eb7e47ce6719d57dfbc24d454ca16d57
|
4
|
+
data.tar.gz: c533cff0121f20fb4b3e813e1eca7325543157ed
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 62799c1404609bb90d35bdec58e5d9eaa9c642f8711d928503b32c8440d0acb7e7116ad66dd95593d5b976a10dc1642b56934fdaf076aa00bffd140051ee0905
|
7
|
+
data.tar.gz: e309acf9d74f46169764c6b934ea21cabc9685a76c6421a50eaa018d629268ab78f5804fbcd03d5485313af2f131d2cfdcdcfe763259063f9484577b7d423784
|
data/lib/cons.rb
CHANGED
@@ -58,17 +58,29 @@ class Cons
|
|
58
58
|
rhs.kind_of? Cons and car == rhs.car and cdr == rhs.cdr
|
59
59
|
end
|
60
60
|
|
61
|
+
def length
|
62
|
+
result = 0
|
63
|
+
current = self
|
64
|
+
while current and current.car and not current.car.nil?
|
65
|
+
result += 1
|
66
|
+
current = current.cdr
|
67
|
+
end
|
68
|
+
result
|
69
|
+
end
|
70
|
+
|
61
71
|
alias first car
|
62
72
|
alias first= car=
|
73
|
+
alias rplaca car=
|
63
74
|
alias rest cdr
|
64
75
|
alias rest= cdr=
|
76
|
+
alias rplacd cdr=
|
65
77
|
|
66
78
|
def nthcdr n
|
67
79
|
if not n.kind_of? Integer or n < 0
|
68
80
|
raise ArgumentError, "n for nthcdr must be a non-negative integer"
|
69
|
-
elsif n ==
|
81
|
+
elsif n == 0
|
70
82
|
self
|
71
|
-
elsif n >
|
83
|
+
elsif n > 0
|
72
84
|
if cdr.nil?
|
73
85
|
nil
|
74
86
|
else
|
@@ -86,8 +98,11 @@ class Cons
|
|
86
98
|
end
|
87
99
|
end
|
88
100
|
|
101
|
+
def [] n
|
102
|
+
nth n
|
103
|
+
end
|
104
|
+
|
89
105
|
def nth_eq(n, value)
|
90
|
-
puts "nth= n=#{n} value=#{value}"
|
91
106
|
i = nthcdr(n)
|
92
107
|
if i.nil?
|
93
108
|
raise RuntimeError
|
@@ -96,6 +111,10 @@ class Cons
|
|
96
111
|
end
|
97
112
|
end
|
98
113
|
|
114
|
+
def []= n, value
|
115
|
+
nth_eq n, value
|
116
|
+
end
|
117
|
+
|
99
118
|
def first
|
100
119
|
car
|
101
120
|
end
|
@@ -104,15 +123,15 @@ class Cons
|
|
104
123
|
@car = value
|
105
124
|
end
|
106
125
|
|
107
|
-
[[:second,
|
108
|
-
[:third,
|
109
|
-
[:fourth,
|
110
|
-
[:fifth,
|
111
|
-
[:sixth,
|
112
|
-
[:seventh,
|
113
|
-
[:eighth,
|
114
|
-
[:ninth,
|
115
|
-
[:tenth,
|
126
|
+
[[:second, 1],
|
127
|
+
[:third, 2],
|
128
|
+
[:fourth, 3],
|
129
|
+
[:fifth, 4],
|
130
|
+
[:sixth, 5],
|
131
|
+
[:seventh, 6],
|
132
|
+
[:eighth, 7],
|
133
|
+
[:ninth, 8],
|
134
|
+
[:tenth, 9]].each do |fname, i|
|
116
135
|
class_eval %{
|
117
136
|
def #{fname}
|
118
137
|
nth #{i}
|
@@ -175,18 +194,66 @@ class Cons
|
|
175
194
|
end
|
176
195
|
end
|
177
196
|
|
197
|
+
def copy_tree
|
198
|
+
new_car = if car.kind_of? Cons
|
199
|
+
car.copy_tree
|
200
|
+
else
|
201
|
+
car
|
202
|
+
end
|
203
|
+
new_cdr = if cdr.kind_of? Cons
|
204
|
+
cdr.copy_tree
|
205
|
+
else
|
206
|
+
cdr
|
207
|
+
end
|
208
|
+
Cons[new_car,new_cdr]
|
209
|
+
end
|
210
|
+
|
211
|
+
alias tree_copy copy_tree
|
212
|
+
|
213
|
+
## Lots of TODOs from the CLHS
|
214
|
+
# TODO - append - http://clhs.lisp.se/Body/f_append.htm
|
215
|
+
# TODO - (n)butlast - http://clhs.lisp.se/Body/f_butlas.htm
|
216
|
+
# TODO - copy-alist - http://clhs.lisp.se/Body/f_cp_ali.htm
|
217
|
+
# TODO - copy-list - http://clhs.lisp.se/Body/f_cp_lis.htm
|
218
|
+
# TODO - endp - http://clhs.lisp.se/Body/f_endp.htm
|
219
|
+
# TODO - last - http://clhs.lisp.se/Body/f_last.htm
|
220
|
+
# TODO - ldiff, tailp - http://clhs.lisp.se/Body/f_ldiffc.htm
|
221
|
+
# TODO - list* - http://clhs.lisp.se/Body/f_list_.htm
|
222
|
+
# TODO - list-length - http://clhs.lisp.se/Body/f_list_l.htm
|
223
|
+
# TODO - member, member-if, member-if-not - http://clhs.lisp.se/Body/f_mem_m.htm
|
224
|
+
# TODO - nconc - http://clhs.lisp.se/Body/f_nconc.htm
|
225
|
+
# TODO - revappend, nreconc - http://clhs.lisp.se/Body/f_revapp.htm
|
226
|
+
# TODO - pop - http://clhs.lisp.se/Body/m_pop.htm
|
227
|
+
# TODO - push - http://clhs.lisp.se/Body/m_push.htm
|
228
|
+
# TODO - pushnew - http://clhs.lisp.se/Body/m_pshnew.htm
|
229
|
+
# TODO - (n)subst, (n)subst-if, (n)subst-if-not - http://clhs.lisp.se/Body/f_substc.htm
|
230
|
+
# TODO - (n)sublis - http://clhs.lisp.se/Body/f_sublis.htm
|
231
|
+
|
232
|
+
## Alist stuff
|
233
|
+
# TODO - acons - http://clhs.lisp.se/Body/f_acons.htm
|
234
|
+
# TODO - assoc, assoc-if, assoc-if-not - http://clhs.lisp.se/Body/f_assocc.htm
|
235
|
+
# TODO - pairlis - http://clhs.lisp.se/Body/f_pairli.htm
|
236
|
+
# TODO - rassoc, rassoc-if, rassoc-if-not - http://clhs.lisp.se/Body/f_rassoc.htm
|
237
|
+
|
238
|
+
## Lists as sets stuff
|
239
|
+
# TODO - adjoin - http://clhs.lisp.se/Body/f_adjoin.htm
|
240
|
+
# TODO - (n)intersection - http://clhs.lisp.se/Body/f_isec_.htm
|
241
|
+
# TODO - (n)set-difference - http://clhs.lisp.se/Body/f_set_di.htm
|
242
|
+
# TODO - (n)set-exclusive-or - http://clhs.lisp.se/Body/f_set_ex.htm
|
243
|
+
# TODO - (n)union - http://clhs.lisp.se/Body/f_unionc.htm
|
244
|
+
# TODO - subsetp - http://clhs.lisp.se/Body/f_subset.htm
|
245
|
+
|
178
246
|
class << self
|
179
|
-
def from_array array
|
247
|
+
def from_array array
|
180
248
|
car, *cdr = array
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
else
|
188
|
-
self[car, from_array(cdr, false)]
|
249
|
+
result = current = Cons.new
|
250
|
+
while car and not car.nil?
|
251
|
+
current.car = car
|
252
|
+
current.cdr = Cons.new if cdr and not cdr.empty?
|
253
|
+
current = current.cdr
|
254
|
+
car, *cdr = cdr
|
189
255
|
end
|
256
|
+
result
|
190
257
|
end
|
191
258
|
|
192
259
|
def [] car=nil, cdr=nil
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cons
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Christopher Mark Gore
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-09-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: pry
|
@@ -53,7 +53,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
53
53
|
version: '0'
|
54
54
|
requirements: []
|
55
55
|
rubyforge_project:
|
56
|
-
rubygems_version: 2.
|
56
|
+
rubygems_version: 2.5.1
|
57
57
|
signing_key:
|
58
58
|
specification_version: 4
|
59
59
|
summary: Lisp-style cons cells for Ruby.
|