cons 1.0.1 → 1.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 +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.
|