nendo 0.3.2 → 0.3.3

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.
@@ -0,0 +1,652 @@
1
+ ;;-*- mode: nendo; syntax: scheme -*-;;
2
+ ; Test suite for SRFI-1
3
+ ; 2003-12-29 / lth
4
+ ;
5
+ ; $Id: srfi-1-test.sps 5842 2008-12-11 23:04:51Z will $
6
+ ;
7
+ ; Note: In Larceny, we require that the procedures designated as
8
+ ; "linear update" variants in the spec (eg append!) side-effect their
9
+ ; arguments, and there are tests here that check that side-effecting
10
+ ; occurs.
11
+ ;
12
+ ; For linear update we only require that the cells of the result are
13
+ ; taken from the cells of the input. We could be stricter and require
14
+ ; that the cells of the results are the cells of the input with only
15
+ ; the CDR changed, ie, values are never moved from one cell to another.
16
+ ;
17
+ ;; Subsequently modified for nendo: Kiyoka Nishiyama
18
+
19
+ (load-library "srfi-1")
20
+
21
+ (define (writeln . xs)
22
+ (for-each display xs)
23
+ (newline))
24
+
25
+ (define (fixme token)
26
+ (printf "FIXME!: %s test was pending.\n" token))
27
+
28
+ (define (fail token . more)
29
+ (error (sprintf "Error: test failed: %s" token))
30
+ #f)
31
+
32
+ ;; ad-hoc let-values macro. When Nendo surpports srfi-11, replace this code with it. ( Kiyoka Nishiyama )
33
+ (define let-values
34
+ (macro (vars body)
35
+ (let1 lr (car vars)
36
+ `(receive
37
+ ,(first lr)
38
+ ,(second lr)
39
+ ,body))))
40
+
41
+ ; Test cases are ordered as in the spec. R5RS procedures are left out.
42
+
43
+ (or (equal? (xcons 1 2) '(2 . 1))
44
+ (fail 'xcons:1))
45
+
46
+ (or (equal? (cons* 1) 1)
47
+ (fail 'cons*:1))
48
+ (or (equal? (cons* 1 2 3 4 5) '(1 2 3 4 . 5))
49
+ (fail 'cons*:2))
50
+
51
+ (or (equal? (make-list 5 #t) '(#t #t #t #t #t))
52
+ (fail 'make-list:1))
53
+ (or (equal? (make-list 0 #f) '())
54
+ (fail 'make-list:2))
55
+ (or (equal? (length (make-list 3)) 3)
56
+ (fail 'make-list:3))
57
+
58
+ (or (equal? (list-tabulate 5 (lambda (x) x)) '(0 1 2 3 4))
59
+ (fail 'list-tabulate:1))
60
+ (or (equal? (list-tabulate 0 (lambda (x) (error "FOO!"))) '())
61
+ (fail 'list-tabluate:2))
62
+
63
+ (or (let* ((c (list 1 2 3 4 5))
64
+ (cp (list-copy c)))
65
+ (equal? c cp))
66
+ (fail 'list-copy:1))
67
+
68
+ (or (equal? (list-copy '(1 2 3 . 4)) '(1 2 3 . 4))
69
+ (fail 'list-copy:2))
70
+
71
+ (or (not (list? (circular-list 1 2 3)))
72
+ (fail 'circular-list:1))
73
+ (or (let* ((a (list 'a))
74
+ (b (list 'b))
75
+ (c (list 'c))
76
+ (x (circular-list a b c)))
77
+ (and (eq? a (car x))
78
+ (eq? b (cadr x))
79
+ (eq? c (caddr x))
80
+ (eq? a (cadddr x))))
81
+ (fail 'circular-list:2))
82
+
83
+ (or (equal? (iota 0) '())
84
+ (fail 'iota:1))
85
+ (or (equal? (iota 5 2 3) '(2 5 8 11 14))
86
+ (fail 'iota:2))
87
+ (or (equal? (iota 5 2) '(2 3 4 5 6))
88
+ (fail 'iota:3))
89
+
90
+ (or (proper-list? '(1 2 3 4 5))
91
+ (fail 'proper-list?:1))
92
+ (or (proper-list? '())
93
+ (fail 'proper-list?:2))
94
+ (or (not (proper-list? '(1 2 . 3)))
95
+ (fail 'proper-list?:3))
96
+ (or (not (proper-list? (circular-list 1 2 3)))
97
+ (fail 'proper-list:4))
98
+
99
+ (or (not (circular-list? '(1 2 3 4 5)))
100
+ (fail 'circular-list?:1))
101
+ (or (not (circular-list? '()))
102
+ (fail 'circular-list?:2))
103
+ (or (not (circular-list? '(1 2 . 3)))
104
+ (fail 'circular-list?:3))
105
+ (or (circular-list? (circular-list 1 2 3))
106
+ (fail 'circular-list:4))
107
+
108
+ (or (not (dotted-list? '(1 2 3 4 5)))
109
+ (fail 'dotted-list?:1))
110
+ (or (not (dotted-list? '()))
111
+ (fail 'dotted-list?:2))
112
+ (or (dotted-list? '(1 2 . 3))
113
+ (fail 'dotted-list?:3))
114
+ (or (not (dotted-list? (circular-list 1 2 3)))
115
+ (fail 'dotted-list:4))
116
+
117
+ (or (null-list? '())
118
+ (fail 'null-list?:1))
119
+ (or (not (null-list? '(1 2)))
120
+ (fail 'null-list?:2))
121
+ (or (not (null-list? (circular-list 1 2)))
122
+ (fail 'null-list?:3))
123
+
124
+ (or (not-pair? 1)
125
+ (fail 'not-pair:1))
126
+ (or (not (not-pair? (cons 1 2)))
127
+ (fail 'not-pair:2))
128
+
129
+ (or (list= = '(1 2 3) '(1 2 3) '(1 2 3))
130
+ (fail 'list=:1))
131
+ (or (not (list= = '(1 2 3) '(1 2 3) '(1 4 3)))
132
+ (fail 'list=:2))
133
+ ; Checks that l0 is not being used when testing l2, cf spec
134
+ (or (list= (lambda (a b) (not (eq? a b))) '(#f #f #f) '(#t #t #t) '(#f #f #f))
135
+ (fail 'list=:3))
136
+ (or (list= =)
137
+ (fail 'list=:4))
138
+
139
+ (or (= (first '(1 2 3 4 5 6 7 8 9 10)) 1) (fail 'first))
140
+ (or (= (second '(1 2 3 4 5 6 7 8 9 10)) 2) (fail 'second))
141
+ (or (= (third '(1 2 3 4 5 6 7 8 9 10)) 3) (fail 'third))
142
+ (or (= (fourth '(1 2 3 4 5 6 7 8 9 10)) 4) (fail 'fourth))
143
+ (or (= (fifth '(1 2 3 4 5 6 7 8 9 10)) 5) (fail 'fifth))
144
+ (or (= (sixth '(1 2 3 4 5 6 7 8 9 10)) 6) (fail 'sixth))
145
+ (or (= (seventh '(1 2 3 4 5 6 7 8 9 10)) 7) (fail 'seventh))
146
+ (or (= (eighth '(1 2 3 4 5 6 7 8 9 10)) 8) (fail 'eighth))
147
+ (or (= (ninth '(1 2 3 4 5 6 7 8 9 10)) 9) (fail 'ninth))
148
+ (or (= (tenth '(1 2 3 4 5 6 7 8 9 10)) 10) (fail 'tenth))
149
+
150
+ (let-values (((a b) (car+cdr '(1 . 2))))
151
+ (or (and (= a 1) (= b 2))
152
+ (fail 'car+cdr:1)))
153
+
154
+ (or (equal? '(1 2 3) (take '(1 2 3 4 5 6) 3))
155
+ (fail 'take:1))
156
+ (or (equal? '(1) (take '(1) 1))
157
+ (fail 'take:2))
158
+
159
+ (or (let ((x (list 1 2 3 4 5 6)))
160
+ (eq? (cdddr x) (drop x 3)))
161
+ (fail 'drop:1))
162
+ (or (let ((x (list 1 2 3)))
163
+ (eq? x (drop x 0)))
164
+ (fail 'drop:2))
165
+
166
+ (or (equal? '(4 5 6) (take-right '(1 2 3 4 5 6) 3))
167
+ (fail 'take-right:1))
168
+ (or (null? (take-right '(1 2 3 4 5 6) 0))
169
+ (fail 'take-right:2))
170
+ (or (equal? '(2 3 . 4) (take-right '(1 2 3 . 4) 2))
171
+ (fail 'take-right:3))
172
+ (or (equal? 4 (take-right '(1 2 3 . 4) 0))
173
+ (fail 'take-right:4))
174
+
175
+ (or (equal? '(1 2 3) (drop-right '(1 2 3 4 5 6) 3))
176
+ (fail 'drop-right:1))
177
+ (or (equal? '(1 2 3) (drop-right '(1 2 3) 0))
178
+ (fail 'drop-right:2))
179
+ (or (equal? '(1 2 3) (drop-right '(1 2 3 . 4) 0))
180
+ (fail 'drop-right:3))
181
+
182
+ (or (let ((x (list 1 2 3 4 5 6)))
183
+ (let ((y (take! x 3)))
184
+ (and (eq? x y)
185
+ (eq? (cdr x) (cdr y))
186
+ (eq? (cddr x) (cddr y))
187
+ (equal? y '(1 2 3)))))
188
+ (fail 'take!:1))
189
+
190
+ (or (let ((x (list 1 2 3 4 5 6)))
191
+ (let ((y (drop-right! x 3)))
192
+ (and (eq? x y)
193
+ (eq? (cdr x) (cdr y))
194
+ (eq? (cddr x) (cddr y))
195
+ (equal? y '(1 2 3)))))
196
+ (fail 'drop-right!:1))
197
+
198
+ (or (let-values (((a b) (split-at '(1 2 3 4 5 6) 2)))
199
+ (and (equal? a '(1 2))
200
+ (equal? b '(3 4 5 6))))
201
+ (fail 'split-at:1))
202
+
203
+ (or (let* ((x (list 1 2 3 4 5 6))
204
+ (y (cddr x)))
205
+ (let-values (((a b) (split-at! x 2)))
206
+ (and (equal? a '(1 2))
207
+ (eq? a x)
208
+ (equal? b '(3 4 5 6))
209
+ (eq? b y))))
210
+ (fail 'split-at!:1))
211
+
212
+ (or (eq? 37 (last '(1 2 3 37)))
213
+ (fail 'last:1))
214
+
215
+ (or (not (length+ (circular-list 1 2 3)))
216
+ (fail 'length+:1))
217
+ (or (equal? 4 (length+ '(1 2 3 4)))
218
+ (fail 'length+:2))
219
+
220
+ (or (let ((x (list 1 2))
221
+ (y (list 3 4))
222
+ (z (list 5 6)))
223
+ (let ((r (append! x y '() z)))
224
+ (and (equal? r '(1 2 3 4 5 6))
225
+ (eq? r x)
226
+ (eq? (cdr r) (cdr x))
227
+ (eq? (cddr r) y)
228
+ (eq? (cdddr r) (cdr y))
229
+ (eq? (cddddr r) z)
230
+ (eq? (cdr (cddddr r)) (cdr z)))))
231
+ (fail 'append!:1))
232
+
233
+ (or (equal? (concatenate '((1 2 3) (4 5 6) () (7 8 9))) '(1 2 3 4 5 6 7 8 9))
234
+ (fail 'concatenate:1))
235
+
236
+ (or (equal? (concatenate! `(,(list 1 2 3) ,(list 4 5 6) () ,(list 7 8 9)))
237
+ '(1 2 3 4 5 6 7 8 9))
238
+ (fail 'concatenate!:1))
239
+
240
+ (or (equal? (append-reverse '(3 2 1) '(4 5 6)) '(1 2 3 4 5 6))
241
+ (fail 'append-reverse:1))
242
+
243
+ (or (equal? (append-reverse! (list 3 2 1) (list 4 5 6)) '(1 2 3 4 5 6))
244
+ (fail 'append-reverse!:1))
245
+
246
+ (or (equal? (zip '(1 2 3) '(4 5 6)) '((1 4) (2 5) (3 6)))
247
+ (fail 'zip:1))
248
+ (or (equal? (zip '() '() '() '()) '())
249
+ (fail 'zip:2))
250
+ (or (equal? (zip '(1) (circular-list 1 2)) '((1 1)))
251
+ (fail 'zip:3))
252
+
253
+ (or (equal? '(1 2 3 4 5) (unzip1 '((1) (2) (3) (4) (5))))
254
+ (fail 'unzip1:1))
255
+
256
+ (or (let-values (((a b) (unzip2 '((10 11) (20 21) (30 31)))))
257
+ (and (equal? a '(10 20 30))
258
+ (equal? b '(11 21 31))))
259
+ (fail 'unzip2:1))
260
+
261
+ (or (let-values (((a b c) (unzip3 '((10 11 12) (20 21 22) (30 31 32)))))
262
+ (and (equal? a '(10 20 30))
263
+ (equal? b '(11 21 31))
264
+ (equal? c '(12 22 32))))
265
+ (fail 'unzip3:1))
266
+
267
+ (or (let-values (((a b c d) (unzip4 '((10 11 12 13)
268
+ (20 21 22 23)
269
+ (30 31 32 33)))))
270
+ (and (equal? a '(10 20 30))
271
+ (equal? b '(11 21 31))
272
+ (equal? c '(12 22 32))
273
+ (equal? d '(13 23 33))))
274
+ (fail 'unzip4:1))
275
+
276
+ (or (let-values (((a b c d e) (unzip5 '((10 11 12 13 14)
277
+ (20 21 22 23 24)
278
+ (30 31 32 33 34)))))
279
+ (and (equal? a '(10 20 30))
280
+ (equal? b '(11 21 31))
281
+ (equal? c '(12 22 32))
282
+ (equal? d '(13 23 33))
283
+ (equal? e '(14 24 34))))
284
+ (fail 'unzip5:1))
285
+
286
+ (or (equal? 3 (count even? '(3 1 4 1 5 9 2 5 6)))
287
+ (fail 'count:1))
288
+ (or (equal? 3 (count < '(1 2 4 8) '(2 4 6 8 10 12 14 16)))
289
+ (fail 'count:2))
290
+ (or (equal? 2 (count < '(3 1 4 1) (circular-list 1 10)))
291
+ (fail 'count:3))
292
+
293
+ (or (equal? '(c 3 b 2 a 1) (fold cons* '() '(a b c) '(1 2 3 4 5)))
294
+ (fail 'fold:1))
295
+
296
+ (or (equal? '(a 1 b 2 c 3) (fold-right cons* '() '(a b c) '(1 2 3 4 5)))
297
+ (fail 'fold-right:1))
298
+
299
+ (or (let* ((x (list 1 2 3))
300
+ (r (list x (cdr x) (cddr x)))
301
+ (y (pair-fold (lambda (pair tail)
302
+ (set-cdr! pair tail) pair)
303
+ '()
304
+ x)))
305
+ (and (equal? y '(3 2 1))
306
+ (every (lambda (c) (memq c r)) (list y (cdr y) (cddr y)))))
307
+ (fail 'pair-fold:1))
308
+
309
+ (or (equal? '((a b c) (b c) (c)) (pair-fold-right cons '() '(a b c)))
310
+ (fail 'pair-fold-right:1))
311
+
312
+ (or (equal? 5 (reduce max 'illegal '(1 2 3 4 5)))
313
+ (fail 'reduce:1))
314
+ (or (equal? 0 (reduce max 0 '()))
315
+ (fail 'reduce:2))
316
+
317
+ (or (equal? '(1 2 3 4 5) (reduce-right append 'illegal '((1 2) () (3 4 5))))
318
+ (fail 'reduce-right:1))
319
+
320
+ (or (equal? '(1 4 9 16 25 36 49 64 81 100)
321
+ (unfold (lambda (x) (> x 10))
322
+ (lambda (x) (* x x))
323
+ (lambda (x) (+ x 1))
324
+ 1))
325
+ (fail 'unfold:1))
326
+
327
+ (or (equal? '(1 4 9 16 25 36 49 64 81 100)
328
+ (unfold-right zero?
329
+ (lambda (x) (* x x))
330
+ (lambda (x) (- x 1))
331
+ 10))
332
+ (fail 'unfold-right:1))
333
+
334
+ (or (equal? '(4 1 5 1)
335
+ (map + '(3 1 4 1) (circular-list 1 0)))
336
+ (fail 'map:1))
337
+
338
+ (or (equal? '(5 4 3 2 1)
339
+ (let ((v 1)
340
+ (l '()))
341
+ (for-each (lambda (x y)
342
+ (let ((n v))
343
+ (set! v (+ v 1))
344
+ (set! l (cons n l))))
345
+ '(0 0 0 0 0)
346
+ (circular-list 1 2))
347
+ l))
348
+ (fail 'for-each:1))
349
+
350
+ (or (equal? '(1 -1 3 -3 8 -8)
351
+ (append-map (lambda (x) (list x (- x))) '(1 3 8)))
352
+ (fail 'append-map:1))
353
+
354
+ (or (equal? '(1 -1 3 -3 8 -8)
355
+ (append-map! (lambda (x) (list x (- x))) '(1 3 8)))
356
+ (fail 'append-map!:1))
357
+
358
+ (or (let* ((l (list 1 2 3))
359
+ (m (map! (lambda (x) (* x x)) l)))
360
+ (and (equal? m '(1 4 9))
361
+ (equal? l '(1 4 9))))
362
+ (fail 'map!:1))
363
+
364
+ (or (equal? '(1 2 3 4 5)
365
+ (let ((v 1))
366
+ (map-in-order (lambda (x)
367
+ (let ((n v))
368
+ (set! v (+ v 1))
369
+ n))
370
+ '(0 0 0 0 0))))
371
+ (fail 'map-in-order:1))
372
+
373
+ (or (equal? '((3) (2 3) (1 2 3))
374
+ (let ((xs (list 1 2 3))
375
+ (l '()))
376
+ (pair-for-each (lambda (x) (set! l (cons x l))) xs)
377
+ l))
378
+ (fail 'pair-for-each:1))
379
+
380
+ (or (equal? '(1 9 49)
381
+ (filter-map (lambda (x y) (and (number? x) (* x x)))
382
+ '(a 1 b 3 c 7)
383
+ (circular-list 1 2)))
384
+ (fail 'filter-map:1))
385
+
386
+ (or (equal? '(0 8 8 -4) (filter even? '(0 7 8 8 43 -4)))
387
+ (fail 'filter:1))
388
+
389
+ (or (let-values (((a b) (partition symbol? '(one 2 3 four five 6))))
390
+ (and (equal? a '(one four five))
391
+ (equal? b '(2 3 6))))
392
+ (fail 'partition:1))
393
+
394
+ (or (equal? '(7 43) (remove even? '(0 7 8 8 43 -4)))
395
+ (fail 'remove:1))
396
+
397
+ (or (let* ((x (list 0 7 8 8 43 -4))
398
+ (y (pair-fold cons '() x))
399
+ (r (filter! even? x)))
400
+ (and (equal? '(0 8 8 -4) r)
401
+ (every (lambda (c) (memq c y)) (pair-fold cons '() r))))
402
+ (fail 'filter!:1))
403
+
404
+ (or (let* ((x (list 'one 2 3 'four 'five 6))
405
+ (y (pair-fold cons '() x)))
406
+ (let-values (((a b) (partition! symbol? x)))
407
+ (and (equal? a '(one four five))
408
+ (equal? b '(2 3 6))
409
+ (every (lambda (c) (memq c y)) (pair-fold cons '() a))
410
+ (every (lambda (c) (memq c y)) (pair-fold cons '() b)))))
411
+ (fail 'partition!:1))
412
+
413
+ (or (let* ((x (list 0 7 8 8 43 -4))
414
+ (y (pair-fold cons '() x))
415
+ (r (remove! even? x)))
416
+ (and (equal? '(7 43) r)
417
+ (every (lambda (c) (memq c y)) (pair-fold cons '() r))))
418
+ (fail 'remove!:1))
419
+
420
+ (or (equal? 4 (find even? '(3 1 4 1 5 9 8)))
421
+ (fail 'find:1))
422
+
423
+ (or (equal? '(4 1 5 9 8) (find-tail even? '(3 1 4 1 5 9 8)))
424
+ (fail 'find-tail:1))
425
+ (or (equal? '#f (find-tail even? '(1 3 5 7)))
426
+ (fail 'find-tail:2))
427
+
428
+ (or (equal? '(2 18) (take-while even? '(2 18 3 10 22 9)))
429
+ (fail 'take-while:1))
430
+
431
+ (or (let* ((x (list 2 18 3 10 22 9))
432
+ (r (take-while! even? x)))
433
+ (and (equal? r '(2 18))
434
+ (eq? r x)
435
+ (eq? (cdr r) (cdr x))))
436
+ (fail 'take-while!:1))
437
+
438
+ (or (equal? '(3 10 22 9) (drop-while even? '(2 18 3 10 22 9)))
439
+ (fail 'drop-while:1))
440
+
441
+ (or (let-values (((a b) (span even? '(2 18 3 10 22 9))))
442
+ (and (equal? a '(2 18))
443
+ (equal? b '(3 10 22 9))))
444
+ (fail 'span:1))
445
+
446
+ (or (let-values (((a b) (break even? '(3 1 4 1 5 9))))
447
+ (and (equal? a '(3 1))
448
+ (equal? b '(4 1 5 9))))
449
+ (fail 'break:1))
450
+
451
+ (or (let* ((x (list 2 18 3 10 22 9))
452
+ (cells (pair-fold cons '() x)))
453
+ (let-values (((a b) (span! even? x)))
454
+ (and (equal? a '(2 18))
455
+ (equal? b '(3 10 22 9))
456
+ (every (lambda (x) (memq x cells)) (pair-fold cons '() a))
457
+ (every (lambda (x) (memq x cells)) (pair-fold cons '() b)))))
458
+ (fail 'span!:1))
459
+
460
+ (or (let* ((x (list 3 1 4 1 5 9))
461
+ (cells (pair-fold cons '() x)))
462
+ (let-values (((a b) (break! even? x)))
463
+ (and (equal? a '(3 1))
464
+ (equal? b '(4 1 5 9))
465
+ (every (lambda (x) (memq x cells)) (pair-fold cons '() a))
466
+ (every (lambda (x) (memq x cells)) (pair-fold cons '() b)))))
467
+ (fail 'break!:1))
468
+
469
+ (or (any integer? '(a 3 b 2.7))
470
+ (fail 'any:1))
471
+ (or (not (any integer? '(a 3.1 b 2.7)))
472
+ (fail 'any:2))
473
+ (or (any < '(3 1 4 1 5) (circular-list 2 7 1 8 2))
474
+ (fail 'any:3))
475
+ (or (equal? 'yes (any (lambda (a b) (if (< a b) 'yes #f))
476
+ '(1 2 3) '(0 1 4)))
477
+ (fail 'any:4))
478
+
479
+ (or (every integer? '(1 2 3))
480
+ (fail 'every:1))
481
+ (or (not (every integer? '(3 4 5.1)))
482
+ (fail 'every:2))
483
+ (or (every < '(1 2 3) (circular-list 2 3 4))
484
+ (fail 'every:3))
485
+
486
+ (or (equal? 2 (list-index even? '(3 1 4 1 5 9)))
487
+ (fail 'list-index:1))
488
+ (or (equal? 1 (list-index < '(3 1 4 1 5 9 2 5 6) '(2 7 1 8 2)))
489
+ (fail 'list-index:2))
490
+ (or (not (list-index = '(3 1 4 1 5 9 2 5 6) '(2 7 1 8 2)))
491
+ (fail 'list-index:3))
492
+
493
+ (or (equal? '(37 48) (member 5 '(1 2 5 37 48) <))
494
+ (fail 'member:1))
495
+
496
+ (or (equal? '(1 2 5) (delete 5 '(1 48 2 5 37) <))
497
+ (fail 'delete:1))
498
+ (or (equal? '(1 2 7) (delete 5 '(1 5 2 5 7)))
499
+ (fail 'delete:2))
500
+
501
+ (or (let* ((x (list 1 48 2 5 37))
502
+ (cells (pair-fold cons '() x))
503
+ (r (delete! 5 x <)))
504
+ (and (equal? r '(1 2 5))
505
+ (every (lambda (x) (memq x cells)) (pair-fold cons '() r))))
506
+ (fail 'delete!:1))
507
+
508
+ (or (equal? '((a . 3) (b . 7) (c . 1))
509
+ (delete-duplicates '((a . 3) (b . 7) (a . 9) (c . 1))
510
+ (lambda (x y) (eq? (car x) (car y)))))
511
+ (fail 'delete-duplicates:1))
512
+ (or (equal? '(a b c z) (delete-duplicates '(a b a c a b c z) eq?))
513
+ (fail 'delete-duplicates:2))
514
+
515
+ (or (let* ((x (list 'a 'b 'a 'c 'a 'b 'c 'z))
516
+ (cells (pair-fold cons '() x))
517
+ (r (delete-duplicates! x)))
518
+ (and (equal? '(a b c z) r)
519
+ (every (lambda (x) (memq x cells)) (pair-fold cons '() r))))
520
+ (fixme 'delete-duplicates!:1))
521
+
522
+ (or (equal? '(3 . #t) (assoc 6
523
+ '((4 . #t) (3 . #t) (5 . #t))
524
+ (lambda (x y)
525
+ (zero? (remainder x y)))))
526
+ (fail 'assoc:1))
527
+
528
+ (or (equal? '((1 . #t) (2 . #f)) (alist-cons 1 #t '((2 . #f))))
529
+ (fail 'alist-cons:1))
530
+
531
+ (or (let* ((a (list (cons 1 2) (cons 3 4)))
532
+ (b (alist-copy a)))
533
+ (and (equal? a b)
534
+ (every (lambda (x) (not (memq x b))) a)
535
+ (every (lambda (x) (not (memq x a))) b)))
536
+ (fail 'alist-copy:1))
537
+
538
+ (or (equal? '((1 . #t) (2 . #t) (4 . #t))
539
+ (alist-delete 5 '((1 . #t) (2 . #t) (37 . #t) (4 . #t) (48 #t)) <))
540
+ (fail 'alist-delete:1))
541
+ (or (equal? '((1 . #t) (2 . #t) (4 . #t))
542
+ (alist-delete 7 '((1 . #t) (2 . #t) (7 . #t) (4 . #t) (7 #t))))
543
+ (fail 'alist-delete:2))
544
+
545
+ (or (let* ((x (list-copy '((1 . #t) (2 . #t) (7 . #t) (4 . #t) (7 #t))))
546
+ (y (list-copy x))
547
+ (cells (pair-fold cons '() x))
548
+ (r (alist-delete! 7 x)))
549
+ (and (equal? r '((1 . #t) (2 . #t) (4 . #t)))
550
+ (every (lambda (x) (memq x cells)) (pair-fold cons '() r))
551
+ (every (lambda (x) (memq x y)) r)))
552
+ (fail 'alist-delete!:1))
553
+
554
+ (or (lset<= eq? '(a) '(a b a) '(a b c c))
555
+ (fail 'lset<=:1))
556
+ (or (not (lset<= eq? '(a) '(a b a) '(a)))
557
+ (fail 'lset<=:2))
558
+ (or (lset<= eq?)
559
+ (fail 'lset<=:3))
560
+ (or (lset<= eq? '(a))
561
+ (fail 'lset<=:4))
562
+
563
+ (or (lset= eq? '(b e a) '(a e b) '(e e b a))
564
+ (fail 'lset=:1))
565
+ (or (not (lset= eq? '(b e a) '(a e b) '(e e b a c)))
566
+ (fail 'lset=:2))
567
+ (or (lset= eq?)
568
+ (fail 'lset=:3))
569
+ (or (lset= eq? '(a))
570
+ (fail 'lset=:4))
571
+
572
+ (or (equal? '(u o i a b c d c e)
573
+ (lset-adjoin eq? '(a b c d c e) 'a 'e 'i 'o 'u))
574
+ (fail 'lset-adjoin:1))
575
+
576
+ (or (equal? '(u o i a b c d e)
577
+ (lset-union eq? '(a b c d e) '(a e i o u)))
578
+ (fail 'lset-union:1))
579
+ (or (equal? '(x a a c) (lset-union eq? '(a a c) '(x a x)))
580
+ (fail 'lset-union:2))
581
+ (or (null? (lset-union eq?))
582
+ (fail 'lset-union:3))
583
+ (or (equal? '(a b c) (lset-union eq? '(a b c)))
584
+ (fail 'lset-union:4))
585
+
586
+ (or (equal? '(a e) (lset-intersection eq? '(a b c d e) '(a e i o u)))
587
+ (fail 'lset-intersection:1))
588
+ (or (equal? '(a x a) (lset-intersection eq? '(a x y a) '(x a x z)))
589
+ (fail 'lset-intersection:2))
590
+ (or (equal? '(a b c) (lset-intersection eq? '(a b c)))
591
+ (fail 'lset-intersection:3))
592
+
593
+ (or (equal? '(b c d) (lset-difference eq? '(a b c d e) '(a e i o u)))
594
+ (fail 'lset-difference:1))
595
+ (or (equal? '(a b c) (lset-difference eq? '(a b c)))
596
+ (fail 'lset-difference:2))
597
+
598
+ (or (lset= eq? '(d c b i o u) (lset-xor eq? '(a b c d e) '(a e i o u)))
599
+ (fail 'lset-xor:1))
600
+ (or (lset= eq? '() (lset-xor eq?))
601
+ (fail 'lset-xor:2))
602
+ (or (lset= eq? '(a b c d e) (lset-xor eq? '(a b c d e)))
603
+ (fail 'lset-xor:3))
604
+
605
+ (or (let-values (((d i) (lset-diff+intersection eq? '(a b c d e) '(c d f))))
606
+ (and (equal? d '(a b e))
607
+ (equal? i '(c d))))
608
+ (fail 'lset-diff+intersection:1))
609
+
610
+ ; FIXME: For the following five procedures, need to check that cells
611
+ ; returned are from the arguments.
612
+
613
+ (or (equal? '(u o i a b c d e)
614
+ (lset-union! eq? (list 'a 'b 'c 'd 'e) (list 'a 'e 'i 'o 'u)))
615
+ (fail 'lset-union!:1))
616
+ (or (equal? '(x a a c) (lset-union! eq? (list 'a 'a 'c) (list 'x 'a 'x)))
617
+ (fail 'lset-union!:2))
618
+ (or (null? (lset-union! eq?))
619
+ (fail 'lset-union!:3))
620
+ (or (equal? '(a b c) (lset-union! eq? (list 'a 'b 'c)))
621
+ (fail 'lset-union!:4))
622
+
623
+ (or (equal? '(a e) (lset-intersection! eq? (list 'a 'b 'c 'd 'e)
624
+ (list 'a 'e 'i 'o 'u)))
625
+ (fail 'lset-intersection!:1))
626
+ (or (equal? '(a x a) (lset-intersection! eq? (list 'a 'x 'y 'a)
627
+ (list 'x 'a 'x 'z)))
628
+ (fail 'lset-intersection!:2))
629
+ (or (equal? '(a b c) (lset-intersection! eq? (list 'a 'b 'c)))
630
+ (fail 'lset-intersection!:3))
631
+
632
+ (or (equal? '(b c d) (lset-difference! eq? (list 'a 'b 'c 'd 'e)
633
+ (list 'a 'e 'i 'o 'u)))
634
+ (fail 'lset-difference!:1))
635
+ (or (equal? '(a b c) (lset-difference! eq? (list 'a 'b 'c)))
636
+ (fail 'lset-difference!:2))
637
+
638
+ (or (lset= eq? '(d c b i o u) (lset-xor! eq? (list 'a 'b 'c 'd 'e)
639
+ (list 'a 'e 'i 'o 'u)))
640
+ (fail 'lset-xor!:1))
641
+ (or (lset= eq? '() (lset-xor! eq?))
642
+ (fail 'lset-xor!:2))
643
+ (or (lset= eq? '(a b c d e) (lset-xor! eq? (list 'a 'b 'c 'd 'e)))
644
+ (fail 'lset-xor!:3))
645
+
646
+ (or (let-values (((d i) (lset-diff+intersection! eq? (list 'a 'b 'c 'd 'e)
647
+ (list 'c 'd 'f))))
648
+ (and (equal? d '(a b e))
649
+ (equal? i '(c d))))
650
+ (fail 'lset-diff+intersection!:1))
651
+
652
+ (writeln "Done.")