1
;; Filename : test-quote.scm
2
;; About : unit test for quote and quasiquote
4
;; Copyright (C) 2005-2006 Kazuki Ohta <mover AT hct.zaq.ne.jp>
5
;; Copyright (c) 2007 SigScheme Project <uim AT freedesktop.org>
7
;; All rights reserved.
9
;; Redistribution and use in source and binary forms, with or without
10
;; modification, are permitted provided that the following conditions
13
;; 1. Redistributions of source code must retain the above copyright
14
;; notice, this list of conditions and the following disclaimer.
15
;; 2. Redistributions in binary form must reproduce the above copyright
16
;; notice, this list of conditions and the following disclaimer in the
17
;; documentation and/or other materials provided with the distribution.
18
;; 3. Neither the name of authors nor the names of its contributors
19
;; may be used to endorse or promote products derived from this software
20
;; without specific prior written permission.
22
;; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS
23
;; IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
24
;; THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
25
;; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR
26
;; CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
27
;; EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
28
;; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
29
;; PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
30
;; LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
31
;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
32
;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34
(load "./test/unittest.scm")
36
(if (not (symbol-bound? 'quasiquote))
37
(test-skip "R5RS quasiquote is not enabled"))
40
(define *test-track-progress* #f)
43
(assert-equal? (tn) #f '#f)
44
(assert-equal? (tn) #t '#t)
45
(assert-equal? (tn) #\a '#\a)
46
(assert-equal? (tn) #\a '#\a)
47
(assert-equal? (tn) 1 '1)
48
(assert-equal? (tn) -1 '-1)
49
(assert-equal? (tn) 1 '#b1)
50
(assert-equal? (tn) 1 '#o1)
51
(assert-equal? (tn) 1 '#d1)
52
(assert-equal? (tn) 1 '#x1)
53
(assert-equal? (tn) "a" '"a")
54
(assert-equal? (tn) (string->symbol "sym") 'sym)
55
(assert-equal? (tn) (quote sym) 'sym)
56
(assert-equal? (tn) (quote (quote sym)) ''sym)
57
(assert-equal? (tn) (quote (quote (quote sym))) '''sym)
58
(assert-equal? (tn) (list) '())
59
(assert-equal? (tn) (list 1) '(1))
60
(assert-equal? (tn) (vector) '#())
61
(assert-equal? (tn) (vector 1) '#(1))
64
(assert-true "quasiquote check #1" (equal? '(1 2 3) `(1 2 3)))
65
(assert-true "quasiquote check #2" (equal? '(5) `(,(+ 2 3))))
66
(assert-true "unquote check" (equal? `(1 2 3) `(1 ,(+ 1 1) ,(+ 1 2))))
67
(assert-true "unquote-splicing check" (equal? `(1 2 3) `(1 ,@(cdr '(1 2)) 3)))
68
(assert-true "mixed check" (equal? '(a 3 c 7 8 9) `(a ,(+ 1 2) c ,@(cdr '(6 7 8 9)))))
69
(assert-equal? "nested quasiquote check #1"
71
`(a `(b c ,(,@() ,@()) 0) 1))
73
(assert-equal? "nested quasiquote check #2"
77
(assert-equal? "nested quasiquote check #3"
81
(assert-equal? "nested quasiquote check #4"
82
'(0 quasiquote (unquote 1))
85
(assert-true "vector quasiquote check #1"
88
`#(,@() #(a ,@(list 'b 'c) d) e)))
89
(assert-equal? "vector quasiquote check #2" '(1 . #(2 3)) `(1 . #(,(+ 1 1) 3)))
90
(assert-equal? "vector quasiquote check #3"
92
`(0 . #(1 ,2 ,@(list 3 4) 5 ,6 ,@())))
93
(assert-equal? "vector quasiquote check #3"
97
(tn "quasiquote reference test of R5RS")
98
(if (not (symbol-bound? 'sqrt))
101
(cdr (assv x '((4 . 2)
104
(interaction-environment)))
110
(let ((name 'a)) `(list ,name ',name)))
113
`(a ,(+ 1 2) ,@(map abs '(4 -5 6)) b))
114
;; Commented out since the test seems to wrong. Even if the interpretation for
115
;; the quote after foo (foo') may varied by implementation, at least the
116
;; quasiquote before foo (`foo) must be remained.
118
;; SigScheme: (((quasiquote foo') 7) . cons)
119
;; Gauche: ((`foo '7) . cons)
120
;; Guile: (((quasiquote foo') 7) . cons)
121
;; Bigloo: (((quasiquote foo') 7) . cons)
122
;; Scheme48: (((quasiquote foo) '7) . cons)
123
;; SCM: (((quasiquote foo\') 7) . cons)
124
;; PLT: read: illegal use of backquote
125
;;(assert-equal? (tn)
127
;; `((`foo' ,(- 10 3)) ,@(cdr '(c)) . ,(car '(cons))))
130
`#(10 5 ,(sqrt 4) ,@(map sqrt '(16 9)) 8))
132
'(a `(b ,(+ 1 2) ,(foo 4 d) e) f)
133
`(a `(b ,(+ 1 2) ,(foo ,(+ 1 3) d) e) f))
138
`(a `(b ,,name1 ,',name2 d) e)))
141
(quasiquote (list (unquote (+ 1 2)) 4)))
144
'(quasiquote (list (unquote (+ 1 2)) 4)))
146
(tn "quasiquote valid form")
147
(assert-equal? (tn) ''1 `'1)
148
(assert-equal? (tn) '`1 ``1)
149
(assert-equal? (tn) 1 `,1)
150
(assert-equal? (tn) ''1 `',1)
151
(assert-equal? (tn) '(quote 1) `'1)
152
(assert-equal? (tn) '(quasiquote 1) ``1)
153
(assert-equal? (tn) '(quote 1) `',1)
154
(assert-equal? (tn) '() `())
155
(assert-equal? (tn) '('1) `('1))
156
(assert-equal? (tn) '(`1) `(`1))
157
(assert-equal? (tn) '(1) `(,1))
158
(assert-equal? (tn) '('1) `(',1))
159
(assert-equal? (tn) '(1) `(,'1))
160
(assert-equal? (tn) '(1) `(,`1))
161
(assert-equal? (tn) '((quote 1)) `('1))
162
(assert-equal? (tn) '((quasiquote 1)) `(`1))
163
(assert-equal? (tn) '(1) `(,1))
164
(assert-equal? (tn) '((quote 1)) `(',1))
165
(assert-equal? (tn) '#() `#())
166
(assert-equal? (tn) '#('1) `#('1))
167
(assert-equal? (tn) '#(`1) `#(`1))
168
(assert-equal? (tn) '#(1) `#(,1))
169
(assert-equal? (tn) '#('1) `#(',1))
170
(assert-equal? (tn) '#(1) `#(,'1))
171
(assert-equal? (tn) '#(1) `#(,`1))
173
(tn "quasiquote nested")
178
'((quasiquote q) (q (quasiquote q)))
181
'((quasiquote q) (q q))
184
'((quasiquote q) (q q (quasiquote q)))
187
'((quasiquote q) (q q (quasiquote (unquote q))))
190
'((quasiquote q) (q q (quasiquote (unquote (quasiquote q)))))
191
`(`q ,`(q ,`q `,`q)))
193
'((quasiquote q) (q q (quasiquote (unquote q))))
194
`(`q ,`(q ,`q `,,`q)))
196
(tn "unquote-splicing nested")
197
(assert-equal? (tn) '(1 2)
199
(assert-equal? (tn) '(quasiquote ((unquote-splicing (list 1 2))))
201
(assert-equal? (tn) '(quasiquote (unquote (1 2)))
204
;; These tests show implementation-dependent behavior. But I believe that
205
;; SigScheme's implementation is conforming to following R5RS specification
206
;; better. Let me know if I'm misunderstanding. -- YamaKen 2006-06-25
208
;; R5RS: 7.1.4 Quasiquotations
210
;; In <quasiquotation>s, a <list qq template D> can sometimes be confused with
211
;; either an <unquotation D> or a <splicing unquotation D>. The interpretation
212
;; as an <unquotation> or <splicing unquotation D> takes precedence.
214
;; Guile, Gauche, Bigloo, SCM
215
;;(assert-equal? (tn)
216
;; '(quasiquote ((unquote (unquote-splicing (list 1 2)))))
217
;; ``(,,@(list 1 2)))
218
;;(assert-equal? (tn)
219
;; '(quasiquote ((unquote (unquote-splicing (list 1 2)))))
222
;; ((unquote (unquote-splicing (list 1 2)))))))
223
;; SigScheme, Scheme48
225
'(quasiquote ((unquote 1 2)))
228
'(quasiquote ((unquote 1 2)))
231
((unquote (unquote-splicing (list 1 2)))))))
233
(assert-equal? (tn) '(quasiquote (list 1 2 (unquote-splicing (list 1 2))))
234
``(list 1 2 ,@(list 1 2)))
235
;; Guile, Gauche, Bigloo, SCM
236
;;(assert-equal? (tn)
238
;; (list 1 2 (unquote (unquote-splicing (list 1 2)))))
239
;; ``(list 1 2 ,,@(list 1 2)))
240
;;(assert-equal? (tn)
242
;; (list 1 2 (unquote (unquote-splicing (list 1 2)))))
245
;; (list 1 2 (unquote (unquote-splicing (list 1 2)))))))
246
;; SigScheme, Scheme48
248
'(quasiquote (list 1 2 (unquote 1 2)))
249
``(list 1 2 ,,@(list 1 2)))
251
'(quasiquote (list 1 2 (unquote 1 2)))
254
(list 1 2 (unquote (unquote-splicing (list 1 2)))))))
256
;; Guile, Gauche, Bigloo, SCM
257
;;(assert-equal? (tn)
260
;; (list (+ 1 2) 3 1 2)
261
;; `(list (+ 1 2) ,(+ 1 2) ,@(list 1 2))
262
;; `(list ,(+ 1 2) ,3 ,,@(list 1 2)))
265
;; (list (+ 1 2) ,(+ 1 2) ,@(list 1 2))
266
;; `(list (+ 1 2) ,(+ 1 2) ,@(list 1 2))
267
;; `(list ,(+ 1 2) ,,(+ 1 2) ,,@(list 1 2))))
268
;; SigScheme, Scheme48
273
`(list (+ 1 2) ,(+ 1 2) ,@(list 1 2))
274
`(list ,(+ 1 2) ,3 (unquote 1 2)))
277
(list (+ 1 2) ,(+ 1 2) ,@(list 1 2))
278
`(list (+ 1 2) ,(+ 1 2) ,@(list 1 2))
279
`(list ,(+ 1 2) ,,(+ 1 2) ,,@(list 1 2))))
282
;; R5RS allows these forms to be an error
283
(tn "quasiquote implementation-dependent form")
284
(if (provided? "sigscheme")
286
(assert-error (tn) (lambda () `((quasiquote))))
287
(assert-error (tn) (lambda () `((quasiquote . 0))))
288
(assert-error (tn) (lambda () `((quasiquote 0 1))))
289
(assert-error (tn) (lambda () `((quasiquote 0 . 1))))
290
(assert-error (tn) (lambda () `(0 quasiquote)))
291
(assert-error (tn) (lambda () `(0 . (quasiquote))))
292
(assert-error (tn) (lambda () `(0 quasiquote 2 3)))
293
(assert-error (tn) (lambda () `(0 . (quasiquote 2 3))))
294
(assert-error (tn) (lambda () `(0 quasiquote 2 3 4)))
295
(assert-error (tn) (lambda () `(0 . (quasiquote 2 3 4))))
296
(assert-error (tn) (lambda () `(0 quasiquote . 0)))
297
(assert-error (tn) (lambda () `(0 . (quasiquote . 0))))
298
(assert-error (tn) (lambda () `(0 quasiquote 2 3 . 0)))
299
(assert-error (tn) (lambda () `(0 . (quasiquote 2 3 . 0))))
300
(assert-error (tn) (lambda () `(0 quasiquote 2 3 4 . 0)))
301
(assert-error (tn) (lambda () `(0 . (quasiquote 2 3 4 . 0))))))
302
(tn "unquote implementation-dependent form")
303
(if (provided? "sigscheme")
305
(assert-error (tn) (lambda () `((unquote))))
306
(assert-error (tn) (lambda () `((unquote . 0))))
307
(assert-error (tn) (lambda () `((unquote 0 1))))
308
(assert-error (tn) (lambda () `((unquote 0 . 1))))
309
(assert-error (tn) (lambda () `(0 unquote)))
310
(assert-error (tn) (lambda () `(0 . (unquote))))
311
(assert-error (tn) (lambda () `(0 unquote 2 3)))
312
(assert-error (tn) (lambda () `(0 . (unquote 2 3))))
313
(assert-error (tn) (lambda () `(0 unquote 2 3 4)))
314
(assert-error (tn) (lambda () `(0 . (unquote 2 3 4))))
315
(assert-error (tn) (lambda () `(0 unquote . 0)))
316
(assert-error (tn) (lambda () `(0 . (unquote . 0))))
317
(assert-error (tn) (lambda () `(0 unquote 2 3 . 0)))
318
(assert-error (tn) (lambda () `(0 . (unquote 2 3 . 0))))
319
(assert-error (tn) (lambda () `(0 unquote 2 3 4 . 0)))
320
(assert-error (tn) (lambda () `(0 . (unquote 2 3 4 . 0))))))
321
(tn "unquote-splicing implementation-dependent form")
322
(if (provided? "sigscheme")
324
(assert-error (tn) (lambda () `(0 unquote-splicing)))
325
(assert-error (tn) (lambda () `(0 . (unquote-splicing))))
326
(assert-error (tn) (lambda () `(0 unquote-splicing 2 3)))
327
(assert-error (tn) (lambda () `(0 . (unquote-splicing 2 3))))
328
(assert-error (tn) (lambda () `(0 unquote-splicing 2 3 4)))
329
(assert-error (tn) (lambda () `(0 . (unquote-splicing 2 3 4))))
330
(assert-error (tn) (lambda () `(0 unquote-splicing . 0)))
331
(assert-error (tn) (lambda () `(0 . (unquote-splicing . 0))))
332
(assert-error (tn) (lambda () `(0 unquote-splicing 2 3 . 0)))
333
(assert-error (tn) (lambda () `(0 . (unquote-splicing 2 3 . 0))))
334
(assert-error (tn) (lambda () `(0 unquote-splicing 2 3 4 . 0)))
335
(assert-error (tn) (lambda () `(0 . (unquote-splicing 2 3 4 . 0))))
336
(assert-error (tn) (lambda () `((unquote-splicing))))
337
(assert-error (tn) (lambda () `((unquote-splicing . 0))))
338
(assert-error (tn) (lambda () `((unquote-splicing 0 1))))
339
(assert-error (tn) (lambda () `((unquote-splicing 0 . 1))))))
341
(tn "quasiquote dotted list")
342
(assert-equal? (tn) '(0 . '1) `(0 . '1))
343
(assert-equal? (tn) '(0 . `1) `(0 . `1))
344
(assert-equal? (tn) '(0 . 1) `(0 . ,1))
345
(assert-equal? (tn) '(0 . (quote 1)) `(0 . '1))
346
(assert-equal? (tn) '(0 . (quasiquote 1)) `(0 . `1))
347
(assert-equal? (tn) '(0 . #(1)) `(0 . ,'#(1)))
348
(assert-equal? (tn) '(0 . #(1)) `(0 . ,`#(1)))
349
(assert-equal? (tn) '(0 . #(1 3)) `(0 . ,`#(1 ,(+ 1 2))))
350
(assert-equal? (tn) '(0 . #(1 -1 -2)) `(0 . ,`#(1 ,@(list (- 1) (- 2)))))
351
(assert-error (tn) (lambda () `(0 . ,@())))
352
(assert-error (tn) (lambda () `(0 . ,@(list))))
353
(assert-error (tn) (lambda () `(0 . ,@(list 1))))
354
(assert-error (tn) (lambda () `(0 . ,@(list 1 2))))
355
(assert-error (tn) (lambda () `(0 . ,@(list 1 2 3))))
356
(assert-error (tn) (lambda () `(0 . ,@#t)))
357
(assert-error (tn) (lambda () `(0 . ,@1)))
358
(assert-error (tn) (lambda () `(0 . ,@#\a)))
359
(assert-error (tn) (lambda () `(0 . ,@"str")))
360
(assert-error (tn) (lambda () `(0 . ,@'sym)))
361
(assert-error (tn) (lambda () `(0 . ,@sym)))
362
(assert-error (tn) (lambda () `(0 . ,@var)))
363
(assert-error (tn) (lambda () `(0 . ,@(lambda () #f))))
364
(assert-error (tn) (lambda () `(0 . ,@(+ 1 2))))
365
(assert-error (tn) (lambda () `(0 . ,@#(1 2))))
366
(assert-error (tn) (lambda () `(0 . (unquote-splicing ()))))
367
(assert-error (tn) (lambda () `(0 . (unquote-splicing (list)))))
368
(assert-error (tn) (lambda () `(0 . (unquote-splicing (list 1)))))
369
(assert-error (tn) (lambda () `(0 . (unquote-splicing (list 1 2)))))
370
(assert-error (tn) (lambda () `(0 . (unquote-splicing (list 1 2 3)))))
371
(assert-error (tn) (lambda () `(0 . (unquote-splicing #t))))
372
(assert-error (tn) (lambda () `(0 . (unquote-splicing 1))))
373
(assert-error (tn) (lambda () `(0 . (unquote-splicing #\a))))
374
(assert-error (tn) (lambda () `(0 . (unquote-splicing "str"))))
375
(assert-error (tn) (lambda () `(0 . (unquote-splicing 'sym))))
376
(assert-error (tn) (lambda () `(0 . (unquote-splicing sym))))
377
(assert-error (tn) (lambda () `(0 . (unquote-splicing var))))
378
(assert-error (tn) (lambda () `(0 . (unquote-splicing (lambda () #f)))))
379
(assert-error (tn) (lambda () `(0 . (unquote-splicing (+ 1 2)))))
380
(assert-error (tn) (lambda () `(0 . (unquote-splicing #(1 2)))))
382
(tn "unquote valid form")
383
(assert-equal? (tn) 1 `,1)
384
(assert-equal? (tn) ',1 ',1)
385
(assert-equal? (tn) '(quasiquote 1) ``1)
386
(assert-equal? (tn) '(quasiquote (unquote 1)) ``,1)
387
(assert-equal? (tn) '(quasiquote (unquote 1)) ``,,1)
388
(assert-equal? (tn) '(quasiquote (+ 1 2)) ``(+ 1 2))
389
(assert-equal? (tn) '(quasiquote (unquote (+ 1 2))) ``,(+ 1 2))
390
(assert-equal? (tn) '(quasiquote (unquote 3)) ``,,(+ 1 2))
391
(assert-equal? (tn) '(quasiquote (list 1 2 (+ 1 2)))
392
``(list 1 2 (+ 1 2)))
393
(assert-equal? (tn) '(quasiquote (unquote (list 1 2 (+ 1 2))))
394
``,(list 1 2 (+ 1 2)))
395
(assert-equal? (tn) '(quasiquote (unquote (1 2 3)))
396
``,,(list 1 2 (+ 1 2)))
397
(assert-equal? (tn) '(quasiquote (list 1 2 (unquote (+ 1 2))))
398
``(list 1 2 ,(+ 1 2)))
399
(assert-equal? (tn) '(quasiquote (list 1 2 (unquote 3)))
400
``(list 1 2 ,,(+ 1 2)))
401
(assert-equal? (tn) '(quasiquote (list 1 2)) ``(list 1 2))
402
(assert-equal? (tn) '(quasiquote (unquote (list 1 2))) ``,(list 1 2))
403
(assert-equal? (tn) '(quasiquote (unquote (1 2))) ``,,(list 1 2))
404
(assert-equal? (tn) 1 `,`,1)
405
(assert-equal? (tn) 3 `,(+ 1 2))
406
(assert-equal? (tn) ',(+ 1 2) ',(+ 1 2))
407
(assert-equal? (tn) '(+ 1 2) (cadr ',(+ 1 2)))
408
(assert-equal? (tn) '(quasiquote (unquote 3)) ``,,(+ 1 2))
409
(assert-equal? (tn) 3 `,`,(+ 1 2))
411
(assert-equal? (tn) '(1) `(,1))
412
(assert-equal? (tn) '(quasiquote ((unquote 1))) ``(,,1))
413
(assert-equal? (tn) '(1) `(,`,1))
415
'(quasiquote (quasiquote ((unquote (unquote 1)))))
417
(assert-equal? (tn) '(3) `(,(+ 1 2)))
418
(assert-equal? (tn) '(quasiquote ((unquote 3))) ``(,,(+ 1 2)))
420
(assert-equal? (tn) '#(1) `#(,1))
421
(assert-equal? (tn) '(quasiquote #((unquote 1))) ``#(,,1))
422
(assert-equal? (tn) '#(1) `#(,`,1))
424
'(quasiquote (quasiquote #((unquote (unquote 1)))))
426
(assert-equal? (tn) '#(3) `#(,(+ 1 2)))
427
(assert-equal? (tn) '(quasiquote #((unquote 3))) ``#(,,(+ 1 2)))
429
(tn "unquote invalid form")
430
(assert-error (tn) (lambda () ,1))
431
(assert-error (tn) (lambda () ,,1))
432
(assert-error (tn) (lambda () `,,1))
433
(assert-error (tn) (lambda () ,(+ 1 2)))
434
(assert-error (tn) (lambda () ,,(+ 1 2)))
435
(assert-error (tn) (lambda () `,,(+ 1 2)))
436
(assert-error (tn) (lambda () `(,,1)))
437
(assert-error (tn) (lambda () ``(,,,1)))
438
(assert-error (tn) (lambda () `(,,(+ 1 2))))
439
(assert-error (tn) (lambda () ``(,,,(+ 1 2))))
440
(assert-error (tn) (lambda () `#(,,1)))
441
(assert-error (tn) (lambda () ``#(,,,1)))
442
(assert-error (tn) (lambda () `#(,,(+ 1 2))))
443
(assert-error (tn) (lambda () ``#(,,,(+ 1 2))))
445
(tn "unquote-splicing valid form")
446
(assert-equal? (tn) '() `(,@()))
447
(assert-equal? (tn) '() `(,@() ,@()))
448
(assert-equal? (tn) '() `(,@() ,@() ,@()))
449
(assert-equal? (tn) '(0) `(0 ,@()))
450
(assert-equal? (tn) '(1) `(,@() 1))
451
(assert-equal? (tn) '(0 1) `(0 ,@() 1))
452
(assert-equal? (tn) '() `(,@(list)))
453
(assert-equal? (tn) '(1) `(,@(list 1)))
454
(assert-equal? (tn) '(1 2) `(,@(list 1 2)))
455
(assert-equal? (tn) '(1 2 3) `(,@(list 1 2 3)))
456
(assert-equal? (tn) '(0 1 2 3) `(0 ,@(list 1 2 3)))
457
(assert-equal? (tn) '(1 2 3 4) `(,@(list 1 2 3) 4))
458
(assert-equal? (tn) '(0 1 2 3 4) `(0 ,@(list 1 2 3) 4))
459
(assert-equal? (tn) '(1 2 3) `(,@((lambda () '(1 2 3)))))
460
(assert-equal? (tn) '(0 1 2 3 4) `(0 ,@((lambda () '(1 2 3))) 4))
461
(assert-equal? (tn) '#() `#(,@()))
462
(assert-equal? (tn) '#() `#(,@() ,@()))
463
(assert-equal? (tn) '#() `#(,@() ,@() ,@()))
464
(assert-equal? (tn) '#(0) `#(0 ,@()))
465
(assert-equal? (tn) '#(1) `#(,@() 1))
466
(assert-equal? (tn) '#(0 1) `#(0 ,@() 1))
467
;; negative growth for vectran
468
(assert-equal? (tn) '#(0 1) `#(0 ,@() ,@() ,@() ,@() 1 ,@()))
469
(assert-equal? (tn) '#(1 2 3) `#(,@((lambda () '(1 2 3)))))
470
(assert-equal? (tn) '#(0 1 2 3 4) `#(0 ,@((lambda () '(1 2 3))) 4))
472
(tn "unquote-splicing invalid form")
475
(assert-error (tn) (lambda () `,@()))
476
(assert-error (tn) (lambda () `,@(list)))
477
(assert-error (tn) (lambda () `,@(list 1)))
478
(assert-error (tn) (lambda () `,@(list 1 2)))
479
(assert-error (tn) (lambda () `,@(list 1 2 3)))
480
(assert-error (tn) (lambda () `(,@(,@()))))
481
(assert-error (tn) (lambda () `(,@(`,@()))))
482
(assert-error (tn) (lambda () `(,@(,1))))
483
(assert-error (tn) (lambda () `(,@(`(,,1)))))
484
(assert-error (tn) (lambda () `#(,@(,@()))))
485
(assert-error (tn) (lambda () `#(,@(`,@()))))
486
(assert-error (tn) (lambda () `#(,@(,1))))
487
(assert-error (tn) (lambda () `#(,@(`(,,1)))))
488
(assert-error (tn) (lambda () `(0 ,@((lambda () '(1 2 . 3))) 4)))
489
(assert-error (tn) (lambda () `#(0 ,@((lambda () '(1 2 . 3))) 4)))
490
(assert-error (tn) (lambda () `,@#t))
491
(assert-error (tn) (lambda () `,@1))
492
(assert-error (tn) (lambda () `,@1))
493
(assert-error (tn) (lambda () `,@#\a))
494
(assert-error (tn) (lambda () `,@"str"))
495
(assert-error (tn) (lambda () `,@'sym))
496
(assert-error (tn) (lambda () `,@sym))
497
(assert-error (tn) (lambda () `,@var))
498
(assert-error (tn) (lambda () `,@(lambda () #f)))
499
(assert-error (tn) (lambda () `,@(+ 1 2)))
500
(assert-error (tn) (lambda () `,@#(1 2)))
501
(assert-error (tn) (lambda () `(,@#t)))
502
(assert-error (tn) (lambda () `(,@1)))
503
(assert-error (tn) (lambda () `(,@#\a)))
504
(assert-error (tn) (lambda () `(,@"str")))
505
(assert-error (tn) (lambda () `(,@'sym)))
506
(assert-error (tn) (lambda () `(,@sym)))
507
(assert-error (tn) (lambda () `(,@var)))
508
(assert-error (tn) (lambda () `(,@(lambda () #f))))
509
(assert-error (tn) (lambda () `(,@(+ 1 2))))
510
(assert-error (tn) (lambda () `(,@#(1 2))))